主にの値を持つ整数IDをコンストラクターに渡すことにより、新しいオブジェクトを作成する関数があります。この関数は、(編集ではなく)新しく作成されたレコードを保存するときに呼び出されます。
public class RecordController
{
private int _recordId;
private int _subRecordId;
private string _xmlData;
private SubRecordA CreateSubRecordA()
{
_xmlData = LoadXmlData();
ParseXmlData();
return new SubRecordA(
SubRecordTypeId.A // leaky DAL abstraction
0,
0,
_xmlData);
}
}
ただし、2つの0
パラメーターは、Init()
メソッドで0
に既に初期化されているプライベートフィールドと一致します
private void Init()
{
_recordId = 0;
_subRecordId = 0;
}
代わりに、これらのゼロ値フィールドをSubRecordA's
コンストラクターに明示的に渡す方がよいかどうかわかりませんか?
return new SubRecordA(
SubRecordTypeId.A // leaky DAL abstraction
_recordId,
_subRecordId,
_xmlData);
リテラル0
を渡すと、意図がより明確になりますが、フローからこれらのフィールドを除外することでロジックが弱くなるようです(たとえば、_recordId
は-1
将来のある時点で)。
更新
Robert Harveyの提案を使用して、デフォルトのコンストラクターでプロパティ/フィールドをゼロにすることで、必要なパラメーターのみを受け取り、: this()
を呼び出す明示的なコンストラクターを作成しました。
public class SubRecordA : SubRecord
{
public override int SubRecordTypeId { get {return (int)SubRecordTypeId.A; } }
public int ParentRecordId { get; set; }
public int RecordId { get; set; }
public string XmlData { get; set; }
public SubRecordA(string xmlData) : this()
{
//SubRecordTypeId = SubRecordTypeId.A;
XmlData = xmlData;
}
}
根本的な問題は、0がIDの値が正しくないことです。
理想的にはそれらをGUIDに変更しますが、次善の策はそれらをnull許容のuintに変更することです。
これにより、オブジェクトが永続化されて実際のIDが取得されるまで、それらをnullに設定できます。