【问题标题】:Ruby Need help de-coupling classesRuby 需要帮助解耦类
【发布时间】:2015-01-19 02:50:30
【问题描述】:

我有一个 Log 类,它在默认记录器中加载并添加了一些方法,这样我就可以获得一些语法糖;问题是 Logger 从另一个类获取文件位置和名称 log.progname,该类充当称为 Info(配置选项、常量等)的所有信息的中心位置。

这是一个问题,因为我想让 Log 类可重用。如何在不改变行为的情况下将 Log 类与 Info 类分离。

我的班级目前看起来像:

  class Log
    F = File.open(Info[:logfile], 'a')
    F.sync = true
    @l = Logger.new(F).tap do |log|
      log.progname = Info[:short_name]
    end
    class << self
      def set_level(level)
        @l.level = Logger.const_get level.upcase
      end

      def display(message, level)
        puts message unless level == :fatal
      end

      def []=(level,message)
        case message.class.to_s
          when 'String'
            display message, level
            @l.send level, message
          when 'Array'
            message.each do |line|
              display line, level
              @l.send level, line
            end
          when 'Hash'
            message.each do |level,line|
              display line, level
              @l.send level, line
            end
        else
          raise TypeError, "method expects Hash,String or Array, message was of type #{message.class}"
        end
      end


    end

  end

我能想到的唯一方法是将它从单例转换为实例对象,然后在初始化时将值传递给它, 但我宁愿将其保留为单例,请问有什么建议吗?

我想我真正想要的是关于如何将这个类与另一个类分离的建议,更重要的是如何在未来做到这一点。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您可能不需要 Singleton。 你可以这样做:

    class MyLogger
      def initialize(info)
        @file = File.open(info[:logfile], 'a')
        @file.sync = true
        @l = Logger.new(F).tap do |log|
          log.progname = info[:short_name]
        end
      end
    
      # ...
    end
    
    Log = MyLogger.new(Info)
    
    # Now you can inject info and even have multiple logs
    Log2 = MyLogger.new(Info2)
    

    另一个好处是您可以控制何时初始化日志,而不是在加载类时初始化它,这可能是一件坏事,因为您正在打开一个文件。

    【讨论】:

    • 所以你说唯一的方法是切换到实例对象?
    • 我并不是说这是唯一的方法。但在我看来,这是最好的。
    • 通过这种方法,您不会失去使用单例的任何好处,也没有使用单例的任何缺点。
    • 也许,但这个对象永远只有一个,但我仍然认为我将使用混合解决方案,我将同时使用两者,我会将其标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多