`
lllyq
  • 浏览: 34618 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

Ruby元编程 打破private protected限制

    博客分类:
  • ruby
阅读更多
需求源于分离职责, 对一些涉及多个model的业务,专门分出一个service层来负责,一个service的方法就是装配不同model提供的方法,这些model的方法应该只能被service调用,而不能被controller调用,那就将这些方法设置为private或者protected(绝对限制是做不到的,起码跟普通方法有所区别,不能直接调用),外部只能用send来调用,但如果调用多的话,一是难看且麻烦,二是影响性能,那就meta programming一下吧

思路是动态产生调用者类的子类,然后委托该子类调用父类的private或protected方法,如果调用者是单件类(metaclass)的话那就到此结束了,但如果是实例,调用private方法还是不行,那就是保存实例到子类对象中,同时打开实例类,生成private方法的一个代理,然后子类调用保存的实例调用代理方法,代码与例子如下

=begin
Example:

class A
  class << self
    private
    def t1
    "t1"
    end
  end

  def initialize(a = nil)
    @a = a
  end
  private
  def t1
    @a
  end
end


A.extend(BreakProtect) #or class A; include BreakProtect; end
p A.break_protect.t1
p A.new("leon").break_protect.t1 # or for reuse, a = A.new("leon").break_protect; a.t1
=end

module BreakProtect
  def self.extended(obj)
    set_sub(obj)
  end
  def self.included(obj)
    set_sub(obj)
  end
  def self.set_sub(obj)
    obj.class_eval %{
    class #{obj.to_s}_Sub < #{obj.to_s}
      def initialize(parent)
        @parent = parent
      end
      def self.method_missing(method_id, *args)
        class_eval %\{
                    def self.#\{method_id\}(*args)
                      @parent.nil? ? super : @parent.#\{method_id\}
                    end
                  \}
                  send(method_id, *args)
      end
      def method_missing(method_id, *args)
        if private_methods.include?(method_id.to_s)
          instance_eval %\{
                      class ::#{obj.to_s}
                        def #\{method_id\}_to_protect(*args)
                          #\{method_id\}
                        end
                        protected :#\{method_id\}
                      end
                      def #\{method_id\}(*args)
                        if @parent.nil?
                          super
                        else
                          @parent.#\{method_id\}_to_protect
                        end
                      end
                    \}
        else
          instance_eval %\{
                      def #\{method_id\}(*args)
                        @parent.nil? ? super : @parent.#\{method_id\}
                      end
                    \}
        end
        send(method_id, *args)
      end
    end
    def break_protect
      #{obj.to_s}_Sub.new(self)
    end
    def self.break_protect
      #{obj.to_s}_Sub
    end
  }
  end
end
分享到:
评论
4 楼 lllyq 2008-04-16  
7thbyte 写道
通过OO的思想,model本身就应该看成DAO+serivce的综合体

“操作多个model”的操作方法都应该放在其中的一个在逻辑地位上处于主体的model上。
再把一些方法抽取到lib里。

如果为了“操作多个model”的方法而去增加service层,即说明设计不够合理导致任务不能或不容易解耦。
此时应该调整设计,抽象出新的对象。


关于这个问题可以另开贴讨论
当然你的做法是对的,优先考虑,但是方法多了就没这么简单了,简单说起来多一个service层维护起来方便
3 楼 7thbyte 2008-04-16  
通过OO的思想,model本身就应该看成DAO+serivce的综合体

“操作多个model”的操作方法都应该放在其中的一个在逻辑地位上处于主体的model上。
再把一些方法抽取到lib里。

如果为了“操作多个model”的方法而去增加service层,即说明设计不够合理导致任务不能或不容易解耦。
此时应该调整设计,抽象出新的对象。
2 楼 lllyq 2008-04-16  
zeroleonhart 写道
既然只能给service调用,那就应该在service里定义那些方法。
没必要定义了private和protected再hack。
不过这个meta的想法不错。

service只是组装者,方法是定义在不同的model,service:model是多对多
1 楼 zeroleonhart 2008-04-16  
既然只能给service调用,那就应该在service里定义那些方法。
没必要定义了private和protected再hack。
不过这个meta的想法不错。

相关推荐

    Ruby元编程第二版中文

    Ruby元编程是编程领域中一个深入且强大的主题,它允许程序员在运行时修改或创建代码,极大地提高了灵活性和代码的动态性。这本书“Ruby元编程第二版”专注于讲解Ruby语言的这一独特特性,旨在帮助开发者更好地理解和...

    ruby元编程.pdf

    ruby元编程.pdf ruby 元编程 这本书对ruby的调用原理做了非常精辟的分析。 ruby 元编程 这本书对ruby的元编程方式做了比较好的阐释。 ruby 元编程 这本书对结对编程有一个很好的提现。

    《Ruby元编程》PDF版本下载.txt

    根据提供的文件信息,本文将对《Ruby元编程》这一主题进行深入探讨,解析其核心概念、应用场景以及为何元编程在Ruby语言中具有重要的地位。 ### 一、Ruby元编程简介 #### 1.1 元编程定义 元编程是指编写能够生成或...

    Ruby元编程pdf

    Ruby元编程是编程的一种高级技巧,它允许程序员在运行时动态地修改或创建代码,极大地提高了灵活性和代码的可扩展性。Ruby作为一种动态类型语言,其元编程能力尤为强大,使得开发者可以创建出高度定制化的解决方案。...

    Ruby元编程-中文

    ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开...

    Ruby元编程中文版

    Ruby元编程中文版

    Ruby元编程 第2版 中文 佩罗塔著 2015.08

    ruby元编程 第2版 中文 目录清晰 方便广大通勤族路上看,如果喜欢请购买正版纸质图书

    Ruby元编程【英文版】

    ### Ruby元编程核心知识点概述 #### 一、元编程概念及意义 元编程是一种编程技术,它允许程序在运行时修改或生成其他程序的行为。在《Ruby元编程》这本书中,作者通过一系列案例来深入浅出地介绍了Ruby语言中独特...

    Ruby 元编程

    本书的第一部分“Ruby元编程”是本书的核心部分,他讲述了一个资深程序员在办公室一周发生的事情。 本书的第二部分“Rails中的元编程”是一个元编程实例,Rail是Ruby标志性框架。 在阅读本书之前,需要了解本书的三...

    元编程 Ruby

    在Ruby这种动态编程语言中,元编程是一种核心技术,它不仅仅是一种技巧,更是Ruby和Rails框架中用于提高开发效率和软件复用性的关键方法。 在Ruby语言中,元编程主要通过方法拦截、动态方法定义、元类以及一些特殊...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    Ruby元编程是编程领域中的一个高级技术,它允许程序员在运行时操纵语言的结构和行为。这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源...

    ruby元编程

    《Ruby元编程》以案例形式循序渐进地介绍了Ruby特有的实用编程技巧 元编程 通过分析案例 讲解例题 回顾Ruby代码库的实现细节 《Ruby元编程》作者Paolo Perrotta不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题...

    Metaprogramming Ruby 2nd Edition ruby元编程

    ### Metaprogramming Ruby 2nd Edition:深入理解Ruby元编程 #### 一、书籍简介与价值 《Metaprogramming Ruby 2nd Edition》是一本深入探讨Ruby语言元编程特性的经典之作。本书不仅适合那些希望深入了解Ruby内部...

    简单谈谈Ruby的private和protected

    ### Ruby中的访问控制:Private与Protected详解 在面向对象编程中,访问控制是确保类的封装性和安全性的重要机制之一。Ruby作为一种动态类型的面向对象语言,提供了`public`、`protected`和`private`三种访问控制...

    Ruby编程语言入门与实践 .pptx

    Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门...

    Ruby 元编程.pdf

    Ruby 元编程,不错的书,就是有点难懂

    Ruby元编程基础学习笔记整理

    ### Ruby元编程基础学习笔记整理 #### 一、语言构建(Language Constructs) 在Ruby中,诸如变量、类和方法等元素统称为语言构建(Language Constructs)。这些构建块是构成Ruby程序的基础。 ##### 示例代码分析 ```...

    基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言.zip

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本资料包主要关注的是基于Ruby编程的基础知识和应用,包括如何使用Ruby进行开发和解决问题。 Ruby的设计哲学强调程序员...

Global site tag (gtag.js) - Google Analytics