| 著作一覧 |
interface FooDomainLogicGroup {
// 通信相手
void setServerName(String host);
// 通信ポート
void setServerPort(short port);
}
例が例によって良くないが(すべてのビジネスロジックが通信するなんてバカなことはあり得ない)、こういうものの依存性を、コントローラで解消させることを想定する。
interface FooConfiguration {
Strng getServerName();
short getServerPort();
}
class Controller {
FooConfiguration config;
void init() {
final String name = lookup("server");
final short port = lookup("port");
config = new FooConfiguration() {
public String getServerName() {
return name;
}
public short getServerPort() {
return port;
}
}
}
...
void executeBean() {
...
bean = createBean(...some condition...);
bean.setConfiguration(config);
bean.execute();
...
}
}
しかし、システムがでかくなると、FooConfiguration がどんどん肥大化することになる。すると、いろいろ厄介である。
void setConfiguration(SuperConfig conf) {
if (conf instanceof ServerConfig) {
serverName = conf.getServerName();
...
} else if (conf instanceof ExtendedServerConfig) {
extendedServerConfig = (ExtendedServerConfig)conf;
}
...
}
というように、与えられたインスタンスが自分が求めるものかどうかを判定しなければならなくなる。
interface ServerConfigurable {
void setConfig(ServerConfig conf);
}
interface ExtendedServerConfigurable {
void setConfig(ExtendedServerConfigurable conf);
}
class FooBean implements ServerConfigurable, ExtendedServerConfigurable {
void setConfig(ServerConfig conf) {
..
}
..
}
この場合、コントローラ側でbeanの判定をすることになる。
void executeBean() {
...
bean = createBean(...some condition...);
if (bean instanceof ServerConfigurable) {
((ServerConfigurable)bean).setConfig(config);
}
if (bean instanceof ExtendedServerConfigurable) {
((ExtendedServerConfigurable)bean).setConfig(extConfig);
}
bean.execute();
...
}
ここまで特化してしまうと、では
interface JdbcConfigurable {
void setConnection(Connection conn);
}
class DaoBean implements JdbcConfigurable {
...
}
とか、なんでも良いことになってくる。instanceof判定はコントローラに集中しているから1つ実装するも2つ実装するもそれほど変わらないからだ。(場合の数が増えるとifが増えすぎて下品になるので、そのあたりはコード上の工夫は必要)
class DaoBean {
void setJdbcConfig(JdbcConfiguration conf) {
connection = conf.getConnection(); // これだけならConnectionのセッタで良いわけだがあくまでも例
}
void setServerConfig(ServerConfig conf) {
serverConfig = conf;
}
...
}
というようになる。
class DaoBean implements JdbcConfigurable, ServerConfigurable {
----------超えられない壁
class DaoBean {
どちらがPOJOかと言えば下だ。しかし、ドメイン特化という意味では上のほうが宣言付きなため気分的に安全度が高い(良くわからん理由だな)。また、テストのしやすさという点に関しては上も下も違いは無い(実装するメソッドは結果的には同じものになるからだ)。ジェズイットを見習え |
DIってNaHiさんがなすらぐで話してた Dependency Injection かな。<br>なにもわかってない咳は‥
「オブジェクト指向(プログラミング)みたいだね」といいました。<br>素人ですみません。えへへ。
何が素人なんだか……玄人中の玄人じゃないですか、というかクロウトってこういう漢字なのかとあらためてびっくり。
読者層、不明ですね...。