2009-07-09 17 views
0

これは説明するのが非常に難しいので、コード抽出がそのほとんどを説明してくれることを願っています。 musicstyle relations http://img190.yfrog.com/img190/2080/musicstylerelations.jpgベストプラクティス:複数のエンティティから単一のエンティティへ

そして、あなたはすべての3つのエンティティ間のmusicstyle関係を修正するための1つの汎用のインターフェイスを構築したい:

は、あなたが次のデータベースの設計を持っているとしましょう。現在、関連するエンティティ(メンバー、イベント、バンド)のタイプを必要とするMusicStyleControllerを作成しました。

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyle(int id, string type, int typeid) 
{ 
    if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 

    switch (type) { 
     case "member": 
      _memberService.DeleteMusicStyle(member, id); 
      break; 
     case "band": 
      Band band = _bandService.GetBand(typeid); 
      _bandService.DeleteMusicStyle(band, id); 
      break; 
     case "event": 
      Event @event = _eventService.GetEvent(typeid); 
      _bandService.DeleteMusicStyle(@event, id); 
      break; 
    } 
    return SelectedMusicStyles(); 
} 

私は自分自身で病気のようなコードを書いていますが、別のよりエレガントな方法を見つけることはできません。

この関数は、jquery.post()を使用して呼び出されます。

質問

はどのようにこのコードをリファクタリングでしょう、そしてあなたも、より多くのデータベースを正規化するのでしょうか?私はデータモデルとしてEntity Frameworkを使用しています。

+0

何がデータベースを正常化から獲得したいと考えていますか?どのデータ量が期待していますか(I.E.、何千万行か) – Kane

+0

@Kaneこのケースではベストプラクティスを目指していますが、それはまだわかりません。このデータベースはEntity Frameworkとのスムーズな統合を提供し、コード化が容易になります。バンドル、イベント、メンバーがリンクするMusicStyleCollectionテーブルを作成すれば、コードを難しくすることができます。そして、テーブルが非常に大きくなった場合(おそらくそれはおそらく)、それはパフォーマンス・ヒットになるでしょう。 – Peter

+0

私はまだ考えていない方法でdbを正規化する方法があるかもしれないので、私はそれを提案として追加しました。私は自分自身をすべての開発者だとは考えていませんが、私は決してどちらにもなり得ません... – Peter

答えて

1

idがメンバーのIDを表していると仮定すると、それぞれのタイプを処理する3つの別々の関数を作成することができます。

例:

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByMember(int id) 
{ 
    if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 
    _memberService.DeleteMusicStyle(member, id); 
    return SelectedMusicStyles(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByBand(int id, int typeid) 
{   
    Band band = _bandService.GetBand(typeid); 
    _bandService.DeleteMusicStyle(band, id); 
    return SelectedMusicStyles(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByEvent 
    (int id, int typeid) 
{ 
    Event event = _eventService.GetEvent(typeid); 
    _bandService.DeleteMusicStyle(event, id); 
    return SelectedMusicStyles(); 
} 

次に、あなたはちょうどあなたがやろうとしているものに応じて、それぞれの方法に行くためにあなたのjqueryのポストを変更します。

+0

私はこれを考えましたが、コードを重複させて、避けようとしています。それは魅力的な解決策のように聞こえ、他の論理的な方法がない場合、私はこのようにしています。 – Peter

+0

@Peter複数のメソッド宣言を必要とすることを除いて、これがコードをどのように複製するのかよくわかりません。それとは別に、それぞれのメソッドは、この例でも独自の振る舞いを持っています。事実の後でメソッドが特定の振る舞いを共有していることがわかったら、その時点で再度リファクタリングし、その特定の振る舞いを統合することができます。 – Joseph

+0

@Joseph私はあなたに同意しなければならないと言わなければならない。これはおそらく最良の解決策です。私はちょうど呼び出すべき行動を知っている責任が私のjsを保持する必要があります。 – Peter

1

このコードをどのようにリファクタリングしますか?

1)にログインしているユーザが移動すべきチェックコード:

if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 

これはセキュリティフレームワークを使用して適用されるべき横断的関心事であり、春のように気にポップ例。

2)私は、このユースケースを表現するためにシングルトンパターンを使用することを避け、すぐに大規模になるとコードをどこに配置するのかを知るのが難しいスクリプトの集まりになります。代わりにコマンドパターンの使用を検討してください。

このパターンを使用すると、JSON、XML、またはコマンドに準拠させるインターフェイスに基づく他の形式で結果を返すことができます。

class DeleteMusicStyleByBandCommand : JsonResultModelCommand, XmlResultModelCommand { 

    public DeleteMusicStyleByBand(int id, int typeid) { 
    //set private members 
    } 

    public void execute() { 
    .. 
    } 

    public JsonResult getJsonResult() { .. } 

    public XmlResult getXmlResult() { .. } 
} 

Commandパターンの私見は、サービスの多くの方法よりもユースケースを表すではるかに優れています。..

+0

素晴らしいアイデア!これにより、良好なコード分離が可能になります。私はこれを実装し、どこで終わるのかを見てみよう。 – Peter

+0

これを実装している間も、コントローラでアクションメソッドを作成して、これらのコマンドを呼び出してコードを増やす必要があることに気付きました。結局、これは可読性や保守性を改善しません。これらの関数(deletebandmusicstyleなど)はajaxから呼び出されます。 – Peter

+0

あなたはセキュリティフレームワークを使って100%正しいですが、私はちょうどasp.net mvcとの組み合わせでそこのさまざまなフレームワークのプロと詐欺を通過する時間がありませんでした – Peter

関連する問題