オブジェクトの種類
説明のために、オブジェクトを3つの異なる種類に分けましょう。
これらは作業を完了するオブジェクトです。彼らは、ある当座預金口座から別の当座預金口座に資金を移動し、注文を遂行し、ビジネスソフトウェアがとると予想される他のすべてのアクションを実行します。
ドメインロジックオブジェクトは通常、アクセサー(ゲッターとセッター)を必要としません。むしろ、コンストラクターを介して依存関係を渡すことでオブジェクトを作成し、メソッドを介してオブジェクトを操作します(聞かないでください)。
データ転送オブジェクトは純粋な状態です。ビジネスロジックは含まれていません。常にアクセサーがあります。不変の方法でそれらを書いているかどうかに応じて、セッターを持っている場合と持っていない場合があります。コンストラクタでフィールドを設定し、オブジェクトの有効期間中は値が変更されないか、アクセサが読み取り/書き込み可能になります。実際には、これらのオブジェクトは通常、ユーザーが編集できるように変更可能です。
ビューモデルオブジェクトには、表示/編集可能なデータ表現が含まれています。通常、データ検証に限定されたビジネスロジックが含まれる場合があります。View Modelオブジェクトの例としては、Customerオブジェクト、Invoice Headerオブジェクト、およびInvoice Line Itemsを含むInvoiceViewModelがあります。View Modelオブジェクトには常にアクセサーが含まれます。
したがって、フィールドアクセサが含まれていないという意味で「純粋」になる唯一のオブジェクトは、ドメインロジックオブジェクトです。このようなオブジェクトをシリアル化すると、現在の「計算状態」が保存されるため、後で取得して処理を完了できます。ビューモデルとDTOは自由にシリアル化できますが、実際にはそれらのデータは通常データベースに保存されます。
シリアル化、依存関係、結合
シリアル化によって依存関係が作成されるのは事実ですが、互換性のあるオブジェクトにデシリアライズする必要があるという意味では、必ずしもシリアル化構成を変更する必要があるわけではありません。優れたシリアル化メカニズムは一般的な目的です。プロパティまたはメンバーの名前を変更しても、メンバーに値をマップできる限り、彼らは気にしません。実際には、これは、オブジェクトインスタンスを再シリアル化して、新しいオブジェクトと互換性のあるシリアル化表現(xml、jsonなど)を作成する必要があることを意味します。シリアライザーの構成を変更する必要はありません。
オブジェクトがシリアル化される方法を気にするべきではないのは事実です。このような懸念をドメインクラスから切り離すことができる1つの方法、つまりリフレクションについては既に説明しました。ただし、シリアライザーは、オブジェクトのシリアル化および逆シリアル化の方法を考慮する必要があります。結局のところ、それがその機能です。オブジェクトをシリアル化プロセスから切り離したままにする方法は、シリアル化を汎用機能にし、すべてのオブジェクトタイプで動作できるようにすることです。
人々が混乱することの1つは、デカップリングが両方向で発生しなければならないということです。ありません; それだけで動作するように持っている1つの方向。実際には、完全に分離することはできません。常に何らかのカップリングがあります。疎結合の目標は、すべての依存関係を削除するのではなく、コードの保守を容易にすることです。