彼のプレゼンテーション(The Value of Values)のスライド13はこれを理解するのに役立つと思います。
値
私の理解では、ヒッキーは、あなたが私に送った値を2倍にする必要がある場合、私は単に次のようなコードを書くことを示唆しています
MyValue = Double(YourValue)
ご覧のとおり、送信した値の種類に関係なく、上記のコードは同じです- 完璧な再利用のようなものです。
さて、これはオブジェクトとインターフェースを持つ言語でどのように見えるでしょうか?
Doublable MyValue = YourValue.Double()
あ、待って!YourValue
実装しない場合はどうなりDoublable
ますか?2倍にできないわけではなく、完全に2倍になるかもしれませんが... メソッドが ない場合はDouble
どうなりますか?(sayというメソッドがある場合はどうなりますTwiceAsMuch
か?)
ああ、問題があります。YourValue.Double
動作しなくなり、再利用できなくなります。上記のスライドを読んだことによると、これはHickeyが「すべてのインターフェイスがあなたの再利用を殺す!」と言ったときの意味についてです。
ご存知のように、インターフェイスは、オブジェクトが「メソッドと一緒に」渡され、それらを操作するコードとともに渡されることを前提としています。オブジェクトを使用するには、そのコードを呼び出す方法、呼び出すメソッドを理解する必要があります。
期待されるメソッドが欠落している場合、意味論的には、目的の操作はオブジェクトにとって完全に理にかなっていますが、問題があります。プレゼンテーションで述べたように、値はメソッドを必要とせず(「コードなしで値を送信でき、問題ありません」)、一般的な方法で値を処理するコードを記述できます。
サイドノート:コードなしの値を渡すという概念は、どういうわけかOOPのFlyweightパターンを思い出させます。
他の同様のオブジェクトとできるだけ多くのデータを共有することにより、メモリ使用を最小限に抑えるオブジェクト。単純な繰り返し表現が許容できない量のメモリを使用する場合、大量のオブジェクトを使用する方法です。フライウェイトオブジェクトは、定義値オブジェクトです。オブジェクトインスタンスのIDは重要ではないため、同じ値の2つのFlyweightインスタンスは等しいと見なされます...
私が見たフライウェイトの使用法は、通常、コード(メソッド、インターフェイス)をオブジェクトから取り除き、コードなしの値として周囲に物を渡すという同じアプローチに従いました。
これは、スライドのように「値にはメソッドは必要ありません。コードなしで値を送信でき、問題ありません」と感じています。