2011-07-08 11 views
0

私はOOPバックグラウンドから来ていますので、常にソリューションをモデル化する最良の方法を探しています。私は2つの異なる擬似デザインを提出し、どちらが良いかを尋ねます。具体的にはMVCベースのWebアプリケーションです。コードはpsuedoであり、ユースケースが作成されているので、ビジネス上の問題をどのように解決するかは、実際にはインポートではありません。デザインのスタイルのみ。Webアプリケーションのサービスレイヤー - サービスオブジェクトを非表示にする必要があります

クラシック・サービス・インタフェーススタイル

//create the page, a valid user needs to 
CustomPage page = pageService.createCustomPage(session.getUser(), aDocument, "my page", "my content"); 
page.setLayout(Layout.NORMAL); //set the page layout 
page.setPublished(true); //set it to publish 
pageService.save(session.getUser(), page); //actually persist new layout and publish 

代替隠しサービススタイル

//create a page editable by the user 
CustomPage page = pageService.createCustomPage(session.getUser(), aDocument, "my page", "my content"); 
page.setLayou(Layout.NORMAL); //changes the layout 
page.publish(); //publishes the page 

の大きな違いは、古典的なスタイルで、CustomPageはダムのオブジェクトであるということです。それはプロパティを保持し、プロパティの値に基づいていくつかの基本的な振る舞いを保持するだけです。サービスと組み合わせて使用​​しない限り、オブジェクト自体のインスタンスを持つことは無意味です。代わりのスタイルでは、CustomPageには、サービスと現在そのサービスを編集しているユーザーに対する隠れた参照が保持されます。だから私はpublish()オブジェクトはそれ自身のことだけでなく、トランザクションメソッドを呼び出すことができます。

CustomPageをモデルとして安全に使用することができます。コンテンツを変更するユーザーはトランザクションメソッドを呼び出せませんが、代わりの方法ではコマンドオブジェクトを使用する必要がありますユーザーの入力を収集し、それをオブジェクトに適用します。しかし、別のアプローチでは、開発者にはかなり複雑な問題が発生しません。 page.publish()は実際にページを公開しており、そのページを行ったユーザーを知りたい場合は、再度提供する必要はありません。

これらのアプローチのどちらが良いか悪いですか?これらのタイプのデザインとトレードオフについて話し合う良いリソースがありますか?

答えて

1

すでに言及したように、の右またはの間違ったの回答はありません。私の意見:一般的には、OOスタイルのオプション#2が好きです。インテリジェントオブジェクトを内部的に維持しています。トランザクションアプリケーション開発に関する私の経験は、オプション#1を維持する方が簡単だということです。私たちはインテリジェントサービスといくつかのダムデータ転送オブジェクトを持っています。

私は過去に使用した第3の選択肢を考えています。別のレイヤー:-)

ビジネスオブジェクトが実際に複雑になる場合いくつかのデータベーステーブルまたはシステムにまたがってその状態を維持し、それがプレゼンテーションとサービス層との間のビジネス・オブジェクト層を導入する意味があり:

  1. プレゼンテーション(ウェブ)層は、ビジネス・オブジェクト
  2. ビジネス・オブジェクトは愚かなデータ転送を返す使用していますウェブ層のオブジェクトとサービスレイヤ擬似コード(ウェブ層)で

に対して複雑な呼び出しをカプセル化:

CustomPageEntity page = new CustomPageEntity(someUID); 
page.setLayout(Layout.NORMAL); 
CustomPageDTO pageDTO = page.save(); 
return pageDTO; // forward pageDTO for further processing 

ビジネスオブジェクトレイヤー(CustomPageEntity内):

public CustomPageEntity(someUID) { 
    service.getCustomPageDTO(someUID); 
} 

public CustomPageDTO save() { 
    service.store(this.layout, ...); 
} 

私の2セント

関連する問題