2011-07-12 7 views
1

私はOOPの学習を始めました。機能がどこに属するのかを決めるのは本当に難しいことです。我々は1をキャストすると、次のトランザクションで発生しなければならない、OOPでオブジェクトの責任をどのように判断するのですか?

:デクリメント

  1. 有権者のrepdownVotes回数のが私たちの例えばSOでdown投票を使用してみましょう。
  2. 受信者のrepをデクリメントします。
  3. 投稿を減らすscore

そう...

  1. がどのように我々がどのオブジェクトに属するアクションを決定しますか?
  2. このような機能はどこにありますか? DAO層、サービス層、または実際のオブジェクト自体では?

私の例のように、オブジェクトが相互に作用するとますます面倒になります。どのような機能がどのオブジェクトに属しているかなどを決めるのは難しいことがあります。

答えて

4

&結束をカップリング、オブジェクト指向設計の原則SOLIDを見てみましょう:

はここに例のために非常に人気のあるMVCデザインパターンです。

OOは、多くの場所で使用することができますが、これに限定されません。ビジネス層。あなたはオブジェクト指向のJavascriptを書くことができます。

私はこのような(C#の)あなたの例のSOドメインをモデル化したいと思います。これは理想的なOOコードであり、現実世界では、ORMのフィールドを公開するなど、いくつかの妥協が行われます。私が見せようとしているのは、各オブジェクトがそのデータを担当しており、誰もそれを直接変更することはできません。彼らはパブリックメソッドの1つを呼び出すことによって、何かを行うオブジェクトを求めなければなりません。

public class User 
{ 
    private int _reputation; 
    private int _downvotes; 

    public void Downvote(Post post) 
    { 
     DecreaseReputation(); 
     IncrementDownvotes(); 
     post.Downvote(); 
    } 

    public void RegisterDownvote() 
    { 
     DecreaseReputation(); 
    } 

    private void DecreaseReputation() 
    { 
     _reputation--; 
    } 

    private void IncrementDownvotes() 
    { 
     _downvotes++; 
    } 
} 

public class Post 
{ 
    private int _score; 
    private User _poster; 

    public void Downvote() 
    { 
     DecreaseScore(); 
     _poster.RegisterDownvote(); 
    } 

    private void DecreaseScore() 
    { 
     _score--; 
    } 
} 
+0

ありがとうございました。そのような行為がVoteServiceに属していると言うのは公正でしょうか?サンプルコードの所在を理解しようとしています。私はC#を知らないが、私はいくつかの推論をすることができます。コードは別々のクラスファイル内の個別のスニペット、またはオブジェクトがインスタンス化されて変更される単一の投票クラスの振る舞いのみを表しますか?私は、第4の行動が投票表に投票を書くことでなければならないと私の例では言及しなかった。 – Mohamad

+0

これは従来の3層アーキテクチャ(プレゼンテーション層/ビジネス層/データアクセス層)のビジネス層に属しますが、これは一般的なドメインコードです(DDDのように、一部の人々はDDDが正しく行われたOOPです)。それがDALの懸念事項であるため、永続性(テーブルへの書き込み)はありません。ビジネスにとっては、SQLデータベース、ドキュメントDB、またはRAM内のすべてを、年間であれば書いている場合はそれほど重要ではありませんこのようにデータが失われることを保証することはできません。これは、あなたの懸念を分ける良い方法です。 – driushkin

1

これは簡単な質問ではなく、OOPの質問そのものよりもデザインパターンの質問のようです。 SOの場合(私は自分のサイトの想定デザインパターンに基づいて前提を設定しています)、デザインパターンのすべての「レイヤー」は、あなたが「トランザクション」と呼んでいるものに関係します(DB用語ではなく、あなたがそれを使用している方法)。 UIレイヤーまたはビューは「下位投票」を受け入れ、ビジネスルールを処理するレイヤーに最もよく似たajaxリクエストであるように見せ、ユーザーに対して「下位投票」がキャストされたときに実際に何が起こるかを決定します。その時点で、ビジネス層はデータ層の要求を行い、データベースをどこかで更新してユーザーのスコアや評判などを更新します。これは、Webサービスを使用して少し異なる方法で実行できます。 。 OOPまで。おそらく、OOPがたくさんあり、どこでも、すべてのレイヤーで、スクリプティングや他の言語であると確信していますが、あなたの例の場合、SOは "User"クラスオブジェクトの周りを回っていないと思います投票が行われる。必要はありません。 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

関連する問題