代码之家  ›  专栏  ›  技术社区  ›  berkes

类的替代初始化,以避免处理已知信息

  •  1
  • berkes  · 技术社区  · 14 年前

    我有一个类autodrop,它包含多个方法,a.o“metadata”,调用外部API(Dropbox)。它们很慢。 但是,在初始化autodropimage时,我已经有了这些元数据,所以我应该使这些方法更智能。

    我想到的是:

    class Autodrop
      include Dropbox
      attr_reader :path
    
      def initialize(path)
        @path = path
      end
    
      def self.from_entry(drop_entry)
        @drop_entry = drop_entry
        self.initialize(@drop_entry.path)
      end
    
      def metadata
        if @drop_entry = nil
          return heavy_lifting_and_network_traffic
        else
          return @drop_entry.metadata
        end
      end
      #...
    end
    

    现在,我想打电话

    entry = BarEntry.new()
    foo = Autodrop.from_entry(entry)
    foo.metadata
    

    为了避免那个沉重的起重和网络流量的呼叫。

    但这不起作用。不知何故,在我所有的新手中,我确信我会发现这一切都是错的。 我应该先找一个词读一读吗?你会怎么做?

    注意,示例被简化了:在我的代码中,我继承了AutoDropImage<AutoDrop,例如,它是通过AutoDropGallery<AutoDrop调用的。后者已经知道了autodropimage的所有元数据,所以我主要是想避免autodropimage再次经历繁重的提升。

    2 回复  |  直到 14 年前
        1
  •  1
  •   nas    14 年前

    您正在创建一个实例变量 @drop_entry 在你的课堂方法中 from_entry 很明显,它对您在这个方法中创建的对象是不可用的。一个解决方法是在初始化类时将其作为参数传递。如果您进行以下修改,它应该可以工作:

    1. 在你 从入口 类方法更改

      self.initialize(@drop_entry) 
      

      new(@drop_entry)
      
    2. 修改 initialize 方法:

      def initialize(drop_entry)
        @drop_entry = drop_entry
        @path = @drop_entry.path
      end
      

    或者如果你的班级被束缚住了,只能通过 path 参数,也就是说,您不想更改其他现有的代码,那么您可以使用这样的可选参数删除条目

        def initialize(path, drop_entry=nil)
    
        2
  •  0
  •   k_b    14 年前

    您需要将元数据缓存在类变量中。

    编辑:或在类级实例变量中。 也许这本书有助于: http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/