我认为幻灯片13在他的演讲(价值的价值)有助于理解这一点:
价值观
我的理解是,Hickey建议,如果我需要将您发送给我的价值增加一倍,那么我只需编写如下代码
MyValue = Double(YourValue)
您会发现,无论您发送何种值,上述代码都是相同的-一种完美的重用。
现在,在具有对象和接口的语言中,情况看起来如何?
Doublable MyValue = YourValue.Double()
等一下!如果YourValue
不执行Doublable
怎么办?不是不能将其加倍,而是完全可以,但是...如果没有方法 Double
怎么办?(如果有一个叫做say的方法TwiceAsMuch
呢?)
呃,我们有问题。YourValue.Double
将无法工作,无法再使用了。根据我对以上幻灯片的阅读,这与Hickey所说的含义有关:“所有这些接口都会破坏您的重用!”
您会看到,接口假定对象“连同其方法”一起传递,并且对这些对象进行操作。要使用对象,需要了解如何调用该代码,调用哪种方法。
当缺少期望的方法时,存在一个问题,即使从语义上来说,期望的操作对于对象来说也是完全有意义的。如演示文稿所述,值不需要方法(“我可以在没有代码的情况下向您发送值,您就可以了”),允许编写以通用方式处理它们的代码。
旁注:传递无代码值的想法使我想起了OOP 中的Flyweight模式。
通过与其他类似对象共享尽可能多的数据来最大程度减少内存使用的对象;当简单的重复表示将使用不可接受的内存量时,这是大量使用对象的方式。Flyweight对象是按定义值对象。对象实例的身份无关紧要,因此,两个具有相同值的Flyweight实例被视为相等...
我见过的关于Flyweight的用法通常采用相同的方法,即从对象中剥离代码(方法,接口),并传递一些无代码的值,期望接收代码具有对这些代码进行操作所必需的手段。
感觉就像幻灯片上的一样:“值不需要方法。我可以不用代码就向您发送值,您就可以了”。