[Seasar-user:20925] Re: [Doma] インターフェイスを継承したい

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2011年 7月 29日 (金) 06:13:13 JST


中村(taedium)です。

> インターフェイスの継承が出来るようにするのは難しいでしょうか?

例えば、こうしたいということですね?

public interface EmpDao { ... }
@Dao public interface FulltimeEmpDao extends EmpDao { ... }
@Dao public interface ParttimeEmpDao extends EmpDao { ... }

技術的にはできるのですが、
インタフェースの継承を制限しているのは
ツール(Eclipseプラグインやapt)との相性を考えたからです。

例えばですが、インタフェースの継承を認めるとすると、
EmpDaoで定義されたメソッドはFulltimeEmpDaoのソースコード上に
存在しません(する必要がありません)が、一方で、そのメソッドに対応する
SQLファイルは存在しているかもしれません。
その場合、Doma ToolsでDaoメソッドからSQLファイルへジャンプできません。
また、Daoメソッドが存在しないことで、メソッド部分に出力すべき
エラーのマーク(aptで出力)も直感的ではなくなってしまいます。

代替案ですが、Adapterを作ってDaoを呼び分けるというのはどうでしょうか?
例えば、上の例を元にすると次のようなクラス階層が考えられます。

public interface EmpDao { ... }
public class FulltimeEmpDaoAdapter implements EmpDao { ... }
public class ParttimeEmpDaoAdapter implements EmpDao { ... }
@Dao public interface FulltimeEmpDao { ... }
@Dao public interface ParttimeEmpDao { ... }

コードは増えてしまいますが、Adapterのコードは
Daoに委譲するだけのシンプルなものになるはずです。
数が多いならコード生成で作ってしまうのがいいかもしれないですね。

> お世話になります。
> newtaです。
> 
> 表題の通りの要望なのですが、
> 非常に似たテーブルがあり、
> Daoの生成以外では
> Daoを使うフローも同じ、返すDtoも同じ
> sqlのみ微妙に違うと言うことがしたいです。
> 
> 今、利用しようとしている構成では2つのアプリがあり、
> 通常アプリとそこから分岐する派生アプリで
> フローは共通のまま、Daoのみインスタンス生成の部分のみコントロールして
> 一部のメソッドのみオーバーライドして微妙変更されたものに差し替えたいのです。
> (インスタンス生成部分に関してはDIでコントロールしています)
> なので、ちょっと数が多くなるかもしれないので出来ればフロー部分のクラスを作らず、
> Daoの生成をDI時にコントロールしてしまいたいと思っています。
> 
> ソース生成のときに考慮しなければならないことも結構増えてしまうと思いますが、
> インターフェイスの継承が出来るようにするのは難しいでしょうか?
> 
> 以上、よろしくお願いします。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user

-- 
Toshihiro Nakamura <[E-MAIL ADDRESS DELETED]>




Seasar-user メーリングリストの案内