質問: new C(); c.setA(b); ~~~~ ```
回答: 余計なメソッドを呼べなくするのが疎結合なわけではないです。 メソッドを公開したくなければ、privateにすればいいだけなので。 疎結合とは、依存関係がない、というものです。 依存とは、import文であったり、new と書いている部分のことです。 ようは、「そのクラスが削除されたとしても、コンパイルエラーにならない」 という関係が疎結合です。 この例でいうと、Bクラスが消えても、Cクラスには影響がないということです。 つまりインターフェースを使った設計にしておくと、 呼び出し元に影響を与えずに、 必要なものはそのインターフェースを実装して追加すればいい、 不要なものは削除すればいいようになるところが嬉しいのです。 逆の密結合は、仕様変更や拡張に非常に弱く、一部のプログラムを直すだけで、 そこら中をテストし直す必要があったりと、大手術になることが多いです。 > > 例えばD,E,Fのクラスがあってそれらも、Aのinterfaceを継承して他のクラスに使わせるならわかる気がします。 > > > そうですね。その通りだと思います。 なので、普通はyubaさんのおっしゃっていることが多いです。 今後増えることを想定としているため、インターフェースを決めている。ということです。 ### 悪い例 ``` public class PC { public void setKeyboard(Keyboard keyboard) {}; public void setMouse(Mouse mouse) {}; } public class Keyboard {} public class Mouse {} ``` ### 良い例 ``` public class PC { public void setUsbDevice1(USB usb) {}; public void setUsbDevice2(USB usb) {}; public void setUsbDevice3(USB usb) {}; } public class Keyboard implements USB {} public class Mouse implements USB {} ``` 現実の世界でも、周辺機器が増えたからPCに修理がいるというのは不便なわけです。 【悪い例】 プリンターを買ったから、PCにプリンタ用の穴(setPrinter)をつけてもらうように修理に出す。 【良い例】 プリンターを買ったけど線がUSBだったから、そのままPCに接続できた。 PCの修理は不要。 周辺の部品が、使う側に影響を出さないという設計がいいんです。