その記事では、プロパティのゲッター/セッターの代わりにメソッドを使用する必要があると説明しています。基本的に、セッターが状態を変更できるようにするのではなく、メソッドが状態を変更するアクションを実行する必要があることを示唆しています。たとえば、Month プロパティと Day プロパティを持つクラスを作成できます。次に、これを行うコードを作成できます。
obj.Day = 28;
obj.Month = Months.February;
obj.Day = 30;
obj.Month = Months.March;
月が 2 月のときに 1 日を 30 に設定すると、状態が無効になります。
この記事では、クラスはこの種のことを許可するべきではなく、特定のアクションを実行するための特定のメソッドを提供する必要があることを示唆しています。
obj.ChangeDate(Months.March, 30);
DateTime が原因で日時の類似性がわかりにくい場合は、緯度/経度座標を使用した同様の例を使用できます。
obj.Latitude = 45.4112;
obj.Longitude = -75.6981;
//...
obj.Latitude = 39.73;
obj.Longitude = -86.27;
緯度が 39.73 に設定されている場合、場所は、オタワ (最初の緯度/経度) またはインディアナポリス (2 番目の緯度/経度) ではなく、ニューアークの近くの場所になります。緯度/経度の設定をそのままにしておくと、インターフェイスが開いたままになり、その不変条件を検証できなくなり、真のオブジェクト指向ではないと言う人もいるかもしれません。したがって、代わりにメソッドを使用できます。
obj.MoveTo(39.73, -86.27);
OO は、カプセル化された状態と動作の両方を意味します。プロパティが状態を「カプセル化」していると考える人もいますが、通常はそうではありません。プロパティのバッキング ストアとして使用されるものを変更できるように、インターフェイスから実装を分離しますが、変更されることはめったにありません。したがって、プロパティは、パブリック フィールドを提供するのとは異なる方法で実装の詳細を利用できるようにするだけです。
インターフェイスが状態またはクエリ状態のいずれかを更新する必要があるが、両方を更新する必要がないことを示唆する、この考えに基づいたコマンド クエリ分離のような概念があります。ゲッターとセッターの両方を持つプロパティは、状態の更新と状態のクエリの両方を行うインターフェイスを提供します。上記の例MoveTo
でChangeDate
は、「コマンド」になります。概念的には、状態を照会する他の方法を提供します。それが必要な場合。
プロパティに関するその他の問題の 1 つは、単にプロパティであるという理由だけで、getter と setter の両方を習慣的に追加することです。プロパティを取得または設定する機能は必要ない場合があり、単純に getter と setter の両方を追加するだけで、必要とされないテストとメンテナンスを必要とするインターフェイスが作成されます。
微妙?もちろん; しかし、彼が話しているのはオブジェクト指向の設計であり、「機能する」コードではありません。