これを実際に見てみましょう
Obj 3
Obj 4
存在することがわかった。だから何?なぜ私たちは気にしますか?
DIPによると
「高レベルのモジュールは低レベルのモジュールに依存すべきではありません。両方とも抽象化に依存すべきです。」
しかし、すべてのオブジェクトが抽象化されているわけではありませんか?
DIPも言う
「抽象化は詳細に依存すべきではありません。詳細は抽象化に依存すべきです。」
わかりましたが、オブジェクトが適切にカプセル化されている場合、詳細は隠されませんか?
すべてのオブジェクトにキーワードインターフェースが必要であると盲目的に主張したい人もいます。私は彼らの一人ではありません。私は盲目的に、今すぐそれらを使用しない場合、後でそれらのような何かを必要とすることに対処する計画が必要だと主張したいのです。
コードがリリースごとに完全にリファクタリング可能な場合、必要に応じて後でインターフェースを抽出できます。再コンパイルしたくないコードを公開していて、インターフェースを介して会話したい場合は、計画が必要になります。
Obj 3
Obj 4
存在することを知っています。しかし、具体的かObj 3
どうかObj 4
はわかりますか?
これがまさにここにあるので、new
どこにでも広がらないのはとてもいいことです。もしObj 3
あれば知らないObj 4
あなたは、後にこっそりとなった場合、それは、その後、それを作成していない可能性があるため、コンクリートであるObj 4
抽象クラスにObj 3
気にしないでしょう。
それができれば、Obj 4
ずっと完全に抽象化されています。最初からそれらの間のインターフェースを作成する唯一のことは、誰かが偶然にそれを与えるコードを誤って追加しないという保証ですObj 4
。保護されたコンストラクターはそのリスクを軽減できますが、それは別の質問につながります。
Obj 3とObj 4は同じパッケージにありますか?
多くの場合、オブジェクトは何らかの方法(パッケージ、名前空間など)でグループ化されます。グループ化すると、グループ全体ではなくグループ内の影響が発生する可能性が高くなります。
機能別にグループ化するのが好きです。場合Obj 3
とObj 4
同じグループとレイヤーである、それはあなたが1を公表していないだけで、他の1を変更する必要ながら、それをリファクタリングする必要がありますことを非常に低いです。つまり、これらのオブジェクトは、明確なニーズを持つ前にそれらの間に抽象化を配置することによる恩恵を受けにくい可能性があります。
グループの境界を越える場合は、どちらの側のオブジェクトも独立して変化させることをお勧めします。
単純ですが、残念ながらJavaとC#の両方がこれを複雑にする不幸な選択をしているはずです。
C#では、すべてのキーワードインターフェイスにI
プレフィックスを付けることが伝統的です。これにより、クライアントはキーワードインターフェースと通信していることを知る必要があります。それはリファクタリング計画を台無しにします。
Javaでは、より良い命名パターンを使用するのが伝統です。FooImple implements Foo
ただし、Javaはキーワードインターフェイスを異なるバイナリにコンパイルするため、これはソースコードレベルでのみ役立ちます。つまりFoo
、1文字のコードを変更する必要のない、具体的なクライアントから抽象的なクライアントにリファクタリングする場合、再コンパイルする必要があります。
これらの特定の言語のバグが、本当に必要になるまで人々が正式な抽象化を延期できないようにするものです。使用している言語を言わなかったが、単にこれらの問題を持たない言語があることを理解した。
あなたが使用している言語を言わなかったので、あなたはそれがどこでもキーワードインターフェースになるだろうと決める前にあなたの言語と状況を注意深く分析することを強くお勧めします。
ここでは、YAGNIの原則が重要な役割を果たします。しかし、「足で自分自身を撃つことを困難にしてください」。