0

このクラスがあり、ドキュメントを作成して保存します。

public class DocCreator
{
  private IDocumentStore _documentStore;

  public DocCreator(IDocumentStore documentStore)
  {
    _documentStore = documentStore;
  }

  public void CreateAndSave()
  {
    var doc = new Document();
    doc.Title = "this is a title";
    doc.Content = whateverStream;
    doc.Hash = CalculateHash(doc.Content);
    //[do more things to create a doc]

    _documentStore.PersistToDisk(doc);
  }
}

物事を保存するコードがに隠されているので、それはまともだと思いますDocumentStore。しかし、それをさらに一歩進めて、次のよう_documentStore.PersistToDisk(doc);に別のクラスへの呼び出しを削除することができます。

public class DocCreatorWorkflow
{
  private IDocumentStore _documentStore;

  public DocCreatorWorkflow(IDocumentStore documentStore)
  {
    _documentStore = documentStore;
  }

  public void CreateAndSave()
  {
    var docCreator = new DocCreator();
    var doc = docCreator.Create();

    _documentStore.PersistToDisk(doc);
  }
}

上記の例では、2つのクラスを呼び出す別のクラスを作成lowerしたため、「ワークフロー」を担当します。それはよりきれいかもしれませんが、それはまた物事をより複雑にします。そうですね。

または、常に2番目のオプションを選択する必要がありますか?

4

2 に答える 2

0

オプション2を使用します。ただし、DocCreatorClassはディスクに保存する必要がなくなったため、変更する必要があります。

public static class DocCreatorClass
{
    public static Document Create()
    {
        Document doc = new Document();
        // Property assignment code here.

        return doc;
    }
}

静的であるため、DocCreatorClassをインスタンス化する必要はありません。また、DocCreatorWorkflowクラスでCreateとSaveの別々の関数を作成します。

public class DocCreatorWorkflow
{
    public IDocumentStore _documentStore;

    public DocCreateWorkflow(IDocumentStore documentStore)
    {
    }

    public void Document Create()
    {
        return DocCreatorClass.Create();
    }

    public void Save(Document doc)
    {
        _documentStore.PersistToDisk(doc);  
    }

    public void CreateAndSave()
    {
        Save(Create());
    }
}

このように、新しく作成されたドキュメントをすぐにディスクに保存する必要はありません。CreateAndSave()は、プログラムが新しいドキュメントをすぐに十分な頻度で保存したい場合に備えて、その中のSave()とCreate()の両方を呼び出す便利な関数です。

このタイプの設計は間違いなくより多くのコーディングであり、より複雑になる可能性があります。長期的には、各関数は1つのことしか実行しないため、見たり保守したりするのが簡単です。

私は個人的に(例外があるかもしれないので、ほとんどの場合)1つのクラス、1つの責任ルールを守ります。これにより、機能が機能しないことに気付いたときに、プロジェクトの一部を簡単に見つけることができます。それを修正する作業をするとき、アプリケーションの残りの部分(他のタスク、つまりクラス)は変更されていないので安心できます。関数については、クラス内で2つ以上の異なる場所でコードブロックが繰り返されないように作成するのが好きです。このように、更新するためにそれらの同一のコードブロックをすべて探す必要はありません。

于 2012-12-01T13:42:15.593 に答える
0

オプション2は、入手可能な情報に基づいて見栄えが良くなります(ただし、この判断を変更する可能性のある他の情報がある可能性があります)。

しかし、一般的に、どちらが優れているかをどのように判断しますか?最初は、コードを使用せずに、懸念事項を概念化することから始める方がよいと思います。たとえば、この場合、私の意見では、3つの懸念があります。1)ドキュメントの作成2)ドキュメントの永続化3)ドキュメントの作成と保存を含むロジック(作業単位)の実行。重要な点は、この3番目の懸念は最初の2つとは別であるということです。DocCreatorもDocumentStoreも、これらがこのように呼び出されていること、またはその他の方法で呼び出されていることを知りません。したがって、それは彼らの関心事ではありません。

于 2012-12-01T17:29:51.230 に答える