私はGWT + Hibernateプロジェクトに取り組んでいます。これは、Company と Login の 2 つに名前を付けるさまざまなモジュールで構成されています。モジュールごとに RPC サービスを作成したので、プロジェクトが 1 つの神のようなサービスですべてを実行してしまうことはありません。
データベースと対話するために、Hibernate API を使用します。具体的には、POJO の EntityManager と Annotations です。
また、基本的な CRUD 操作を処理する Generic DAO クラスも作成しました。GenericDAO クラスも EntityManager を処理します。各モジュール サービス クラスは、独自のクエリ メソッドを追加できるように、この GenericDAO を拡張します。
以下は GenericDAO クラスのスタブです -
public class GenericDataAccessService<EntityType, PrimaryKeyType extends Serializable> {
// Constructor
@Override
public void save(EntityType newEntity) {
// TODO Auto-generated method stub
}
@Override
public void update(EntityType entity) {
// TODO Auto-generated method stub
}
@Override
public EntityType find(PrimaryKeyType primaryKey) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findByProperty(String property) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public void delete(PrimaryKeyType primaryKey) {
// TODO Auto-generated method stub
}
@Override
public void delete(EntityType entity) {
// TODO Auto-generated method stub
}
}
ここで、Company モジュールの find メソッドがもう 1 つ必要だとします。だから、私は CompanyService クラスを次のように書きます -
public class CompanyService extends GenericDataAccessService<Company, int> {
public void addCompany(Company company) {
super.save(company);
}
public Company updateCompany(Company company) {
return super.update(company);
}
public List<Company> findMatchingCompanies(String companyName) {
return super.findByProperty(companyName);
}
public void deleteCompany (int companyId) {
super.delete(companyId);
}
public List<Company> findThroughSomeCustomSearch() {
// custom query code.
}
}
他のモジュールも同様の足跡をたどります。そうすれば、データ アクセス以外のメソッドを各モジュールのサービスに追加することもできます。
ここで、これらのモジュールをクライアント側で公開する必要があります。GenericDAO クラスを公開しないことにしました。そのためのインターフェースはありません。代わりに、モジュールごとにインターフェイスを作成します。
したがって、CompanyService の場合は -
public interface CompanyService {
public void addCompany(Company company);
public Company updateCompany(Company company);
public List<Company> findMatchingCompanies(String companyName);
public void deleteCompany (int companyId);
public List<Company> findThroughSomeCustomSearch();
}
他のモジュールのインターフェースも同様です。
これは良いデザインですか?GenericDAO は、セッション管理と基本的な CRUD 操作のいくつかの定型コードを節約します。ただし、Hibernate API のおかげで、メソッドあたりのコードはすでに 3 ~ 4 行に減っています。この場合、GenericDAO の他の用途は見つかりません。それとも、間違った方法で実装していますか?
このデザインが十分でない場合に備えて、これよりも良い方法を提案してください。
編集: この場合、サービス モジュールに付ける名前を知りたいです。私は今、「Impl」という接尾辞を使っていますが、喉に詰まっているように感じます。たとえば、Company モジュールの場合、Interface - CompanyService Class - CompanyServiceImpl
より良い提案?