2016-07-26 16 views
0

多くの場合、データベースからそれらを構築する必要がありますが、テスト用の偽物を作成したり、ファイルから読み込んだりすることもあります。不変クラスのコンストラクタに渡すパラメータは?

  1. アンのIDataReader
  2. をすべて単一のフィールド:

    我々は取るコンストラクタを持つ必要があります。

  3. クラスの変更可能なバージョンです。したがって、レポは変更可能なバージョンを作成し、更新して、このコンストラクタを使用して不変のバージョンに変換できますか?
  4. 私はオプション1を好きではない完全
  5. 何か他

すべてのクラスを約System.Dataを知っている必要があります意味するので、2は大丈夫そうですが、我々は、フィールドを追加したいメンテナンスいつでもの多くを必要としているようだ、と3は大丈夫ですが、フィールドが追加されたときはいつでもメンテナンスされます(2未満です)。

ありがとうございます。

答えて

1

不変オブジェクトは、ビルダーを作成し、それに関連するすべてのプロパティを設定し、最後にCommit()を呼び出して不変バージョンを取得することで構築されることがよくあります。

私は個人的にはこのようになります「偽」不変クラスのかなり好きです:

public interface IPlanet 
{ 
    string Name { get; } 
} 

internal class PlanetBuilder : IPlanet 
{ 
    public string Name { get; set; } 

    public IPlanet Commit() 
    { 
     return this; 
    } 
} 

このような構造との良好なそれは書くためのかなり小さなオーバーヘッドがあるということです。 Commit()メソッドは、汎用ベースクラスにリファクタリングすることもできます。

誰もがファクトリクラスの型にキャストしてオブジェクトを改ざんすることができます。

+0

私が考えなかったもう一つのアプローチを指摘するために+1。そして、それが何を構築したのか分かっていれば、彼らはそれを戻すことができるのは残念です。私はPlanetBuilderにIPlanetを実装させる必要があると思います。 – user420667

+1

@ user420667一方、オブジェクトユーザーにオブジェクトを意図的に使用させることを「信用しない」場合は、オブジェクトに常に反映され、足元のものを変更できることに注意する必要があります。オブジェクトの送信者を信頼しない場合は、オブジェクトを使用する前にオブジェクト全体を常に検証する必要があります。自己検証する必要があるため信頼できません。 –

+0

@ user420667 "PlanetBuilderにIPlanet" OOppsを実装する必要があります。それは一種の重要なポイントでした!この例を修正しました。ありがとう –

関連する問題