经常听说 Open/Closed 原则说一个类应该是 Open for extension 和 Closed for modify 。在抽象层面听起来很棒。
但是在 Ruby OOP 领域中是否有任何真实的用例示例?
经常听说 Open/Closed 原则说一个类应该是 Open for extension 和 Closed for modify 。在抽象层面听起来很棒。
但是在 Ruby OOP 领域中是否有任何真实的用例示例?
Ruby 类都是开放的。没有封闭的课堂。
例子:
class String
def foo
puts "bar"
end
end
'anything'.foo
#bar
开放/封闭原则确实适用于 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
现在支持新型调制解调器..您不必去修改源代码。您可以添加新代码以添加新类型的调制解调器。
这就是使用继承实现开/关原则的方式。该原理可以使用许多其他技术来实现。