クラス間のinterface設計の初歩的なところで考えさせられたので書いてみる。
経緯
- ServerとClientという2つのクラスがあり。
- Serverクラスはこちらで、Clientクラスは別の方が作る。
- というわけで Server<->Clinet間 を相互やり取りするためのinterfaceを提供してー。
で、提示したのがこんなかんじ。(生成時はFactoryだろ、とかはおいといて。。)
public class Connector { public void connect() throws XxxException { // Client -> Server間 接続処理 } public void request(Object param) { // Client -> Server要求 } public void callback() { // Client <- Serverコールバック listener.callback(); } private ConnectorListener listener; public void setConnectorListener(ConnectorListener listener) { this.listener = listener; } }
リスナー
public interface ConnectorListener { void callback(Object param); }
使う側の実装
public void test() { Connector connector = new Connector(); connector.setConnectorListener(new ConnectorListener() { public void callback() { //独自実装 } }); connector.connect(); connector.request(xxx); }
まーこんなかんじで、こちらで作ったConnectorクラスに相手にListener登録してもらってそれにcallback、的なベタな相互やり取り用interfaceを提案してみたとです。
で、言われたこと。
- Connector#connectは外に見せなくていいんじゃね?
- Connectorクラスのコンストラクタ内で接続処理までやっちゃえよ
- このクラスは接続するまでが準備処理なんだからコンストラクタで接続していいじゃん
- いちいちconnect呼ぶのめんどくさいじゃん
- そのほうが使う側も1ステップ減るじゃん
public Connector() {
connect();
}
こういうこと??connect失敗時には例外返すようにするとしても、コンストラクタでそこまでやっちゃう、っていうのがどうも納得いかなくて。たしかに楽なのはわかるけども。
でも任意のタイミングで接続にいきたいときのこと考えると融通きかなくて使いにくいと思うだけどもなー。Socketクラスとか見てもconnectは別メソッドだし。自分なら1ステップ楽するよりも、処理の流れがわかりやすく融通がきくほうを選択すると思う。
自分のこの感覚、ずれてるのかなー、なんてちょっと考えさせられた。うーん。