2

经常听说 Open/Closed 原则说一个类应该是 Open for extension 和 Closed for modify 。在抽象层面听起来很棒。

但是在 Ruby OOP 领域中是否有任何真实的用例示例?

4

2 回答 2

6

Ruby 类都是开放的。没有封闭的课堂。

例子:

class String
  def foo
    puts "bar"
  end
end

'anything'.foo

#bar
于 2012-04-20T13:52:55.867 回答
3

开放/封闭原则确实适用于 Ruby。

定义说..您的类/对象应该对扩展开放但对修改关闭。这是什么意思?

这意味着你不应该去修改类来添加新的行为。您应该使用继承或组合来实现这一点。

例如

class Modem
  HAYES = 1
  COURRIER = 2
  ERNIE = 3
end


class Hayes
  attr_reader :modem_type

  def initialize
    @modem_type = Modem::HAYES
  end
end

class Courrier
  attr_reader :modem_type

  def initialize
    @modem_type = Modem::COURRIER
  end
end

class Ernie
  attr_reader :modem_type

  def initialize
    @modem_type = Modem::ERNIE
  end
end



class ModemLogOn

  def log_on(modem, phone_number, username, password)
    if (modem.modem_type == Modem::HAYES)
      dial_hayes(modem, phone_number, username, password)
    elsif (modem.modem_type == Modem::COURRIER)
      dial_courrier(modem, phone_number, username, password)
    elsif (modem.modem_type == Modem::ERNIE)
      dial_ernie(modem, phone_number, username, password)
    end
  end

  def dial_hayes(modem, phone_number, username, password)
    puts modem.modem_type
    # implmentation
  end


  def dial_courrier(modem, phone_number, username, password)
    puts modem.modem_type
    # implmentation
  end

  def dial_ernie(modem, phone_number, username, password)
    puts modem.modem_type
    # implementation
  end
end

要支持一种新型调制解调器......你必须去修改类。

使用继承。您可以抽象出调制解调器功能。和

# Abstration
class Modem

  def dial
  end

  def send
  end

  def receive
  end

  def hangup
  end

end

class Hayes < Modem
  # Implements methods
end


class Courrier < Modem
  # Implements methods
end

class Ernie < Modem
  # Implements methods
end


class ModelLogON

  def log_on(modem, phone_number, username, password)
    modem.dial(phone_number, username, password)
  end

end

现在支持新型调制解调器..您不必去修改源代码。您可以添加新代码以添加新类型的调制解调器。

这就是使用继承实现开/关原则的方式。该原理可以使用许多其他技术来实现。

于 2014-03-17T13:29:41.523 回答