2013-03-22 11 views
18

私はblogpostsのテストデータビルダパターンの長所を熟読しています。それは良いアイデアのようだが、すべての投稿は年をとっている。Object InitializersよりもTest Data Builderパターンのメリットは何ですか?

C#でObject Initializesが導入されたとき、Test Data Builderパターンは廃止されましたか?

Person person = new PersonBuilder() 
     .WithFirstName("John") 
     .WithLastName("Doe") 
     .WithPhoneNumber("555-555-1234"); 
:ビルダーは、このようなコードをクリーンアップしているだろう持つ、当時

Person p = new Person("John", "Doe", "555-555-1234"); 

:オブジェクト初期化子の前に、あなたは人のオブジェクトを初期化するために、次のコードを

を必要としているだろう

オブジェクトイニシャライザでは、ビルダーメソッドを記述しなくても、次のようになります。

Person p = new Person() {FirstName="John", LastName="Doe", Phone="555-555-1234"}; 

この単純な例では、ビルダーパターンは必要ないと思われます。何か不足していますか?人々はまだビルダーパターンを使用していますか?もしそうなら、どのような利点がありますか?

+2

たとえば、不変オブジェクトを扱うときには、ビルダーはまだ良い選択肢です。 –

+8

なぜこの質問を閉じるに投票しますか?それはよく書かれ、面白いIMOです。 – ken2k

+2

@RogerAlsingあなたがその点を拡大した場合、それは良い答えになります。 – AlexFoxGill

答えて

2

多くの場合、ビルダーをオブジェクト初期化子に置き換えることができます。

しかし、ビルダーが依然として優れた選択肢であるケースはいくつかあります。

不変オブジェクトがその一例です。例: Jon Skeets protobuffの実装は、変更不可能なオブジェクトの実際のビルダーパターンの良い例です。 (https://codeblog.jonskeet.uk/2008/08/20/lessons-learned-from-protocol-buffers-part-1-messages-builders-and-immutability/

Person john = new Person.Builder() 
    .SetFirstName("John") 
    .SetLastName("Doe") 
    .Build(); //creates an immutable person 

他の場合には、予め設定された値を適用するかもしれません。例えば、 。

Rectangle rect = RectangleBuilder.MakeSquare(10).Build(); 
Car car = CarBuilder.MakeVolvo().PimpIt().SetColor(Color.Red).Build(); 

この場合、複数のプロパティを一度に設定して、ある種のプロトタイプから開始してそこから続けることができます。

1

たとえば、StringBuilderを使用します。高性能な新しい文字列 を構築するためには、まだ有用であり、必要です(コンパイラの最適化ではすべてのシナリオがカバーされないため)。 他の不変オブジェクトの場合は、既にコメントされているので同じです。

また、ビルダーパターンを使用する場合は、(依存性注入のための)緩やかな結合を与える初期化タイプを置き換える方が簡単です。 テスト目的では必ずしも必要なわけではありませんが、時にはまだ役立つかもしれません。

+2

2つ目のポイントを拡張するために、オブジェクトの作成を専用の工場やビルダーに委任することが常に賢明です(カップリングとユニットテストのために)。このようにして、テストを書くとき、モック/スタブを生成するファクトリをインジェクトすることができます。 – AlexFoxGill

関連する問題