OOP和动态类型(非静态与动态)
OOP原则(如果有的话)在动态类型环境中不适用或应用不同,而不是静态类型环境(例如Ruby vs C#)?这不是一个静态与动态辩论的呼吁,而是我想看看是否存在适用于一个而不是另一个的分歧的任何一方的公认原则,或者应用不同的原则。在“静态类型的OOP”文献中,诸如“喜欢组合到继承”之类的短语是众所周知的。它们是否适用于动态方面?
例如,在动态类型环境中,似乎耦合的粒度不会超过方法的级别。换句话说,任何给定的函数调用只将调用者耦合到任何类可能满足的特定接口 - 或者换句话说,任何像那个特定的鸭子那样嘎嘎叫的东西。
另一方面,在Java中,耦合的粒度可以与包一样高。一个特定的方法调用不仅与另一个类/接口建立契约,而且还将它耦合到该类/接口的package / jar / assembly中。
像这样的差异会产生不同的原则和模式吗?如果是这样,这些差异是否明确表达了? Ruby Pickaxe书中有一节向这个方向发展(Duck Typing / Classes Are Types),但我想知道是否还有其他内容。我知道Ruby中的设计模式,但还没有读过它。
编辑 - 有人认为Liskov在动态环境中不会像在静态环境中那样应用相同的东西,但我不禁想到它的确如此。一方面,没有与全班同学的高级合同。但是,不是所有对任何给定类的调用构成一个隐含的契约,需要像Liskov所规定的那样由子类来满足吗?考虑以下。 “做一些酒吧”的电话创建了一个需要由子课程来处理的合同。这不是“将专门对象视为基类吗?”的情况:
class Bartender
def initialize(bar)
@bar = bar
end
def do_some_bar_stuff
@bar.open
@bar.tend
@bar.close
end
end
class Bar
def open
# open the doors, turn on the lights
end
def tend
# tend the bar
end
def close
#clean the bathrooms
end
end
class BoringSportsBar < Bar
def open
# turn on Golden Tee, fire up the plasma screen
end
def tend
# serve lots of Bud Light
end
end
class NotQuiteAsBoringSportsBar < BoringSportsBar
def open
# turn on vintage arcade games
end
end
class SnootyBeerSnobBar < Bar
def open
# replace empty kegs of expensive Belgians
end
def tend
# serve lots of obscure ales, porters and IPAs from 124 different taps
end
end
# monday night
bartender = Bartender.new(BoringSportsBar.new)
bartender.do_some_bar_stuff
# wednesday night
bartender = Bartender.new(SnootyBeerSnobBar.new)
bartender.do_some_bar_stuff
# friday night
bartender = Bartender.new(NotQuiteAsBoringSportsBar.new)
bartender.do_some_bar_stuff
没有找到相关结果
已邀请:
4 个回复
犁攀富
期差骇蓟
稀瓣囊
荤碗