TotalCostなどの計算フィールドを持つエンティティがいくつかあります。現在私はそれらすべてをプロパティとして持っていますが、それらが実際にメソッドである必要があるかどうか疑問に思っています。このためのC#標準はありますか?
public class WorkOrder
{
public int LaborHours { get; set; }
public decimal LaborRate { get; set; }
// Should this be LaborCost()?
public decimal LaborCost
{
get
{
return LaborHours * LaborRate;
}
}
}
計算にそれほど時間がかからない限り、メソッドではなく計算されたプロパティを使用してもかまいません。
メソッドはオブジェクトに対してアクションを実行する必要があると思います。通常はオブジェクトの状態を変更します。プロパティは、プロパティが計算された場合でも、オブジェクトの現在の状態を反映する必要があります。したがって、プロパティはIMOのままにしておく必要があります。
それらはすべてプロパティである必要があると思います。オブジェクトの状態を変更しない限り、私はそれをプロパティとして使用できます。
さらに、データバインディング(WPFなど)にクラスを使用している場合は、クラスを変更または拡張する必要なく、プロパティに直接バインドできます。
それらがa)軽量でb)副作用がない場合、私はそれらをプロパティにします。
もちろん、軽量は少しあいまいですが、経験則としては、(ループ内または他の場所で)プロパティを呼び出すことを心配する必要がある場合は、おそらくメソッドでなければなりません。
プロパティとして残しておきます。しかし、何らかの方法で物事を行う「標準的な」理由はありません。一人でいる場合は、好きなことをしてください。チームに参加している場合は、チームの他のメンバーが従う規則に従ってください。
私の意見では、それは好みです。それはあなたがしたいことです。ロジックが含まれていない限り、ほとんどの場合は私が所有します。さらに、機能を変更するためにパラメーターを渡す必要がある場合は、明らかにメソッドが適用されます...
場合によっては、「プロパティ」がマンモスになり、プロパティであってはならない大量のビジネスロジックが必要な場合は、メソッドが必要です。あなたが投稿した例はプロパティに問題がないように見えます。それを行うための標準的な方法はありません、あなたの直感と一緒に行ってください。多くのことを行う必要があるように見える場合は、おそらくメソッドが必要です。
プロパティの計算に特にコストがかかる場合は、GetWhatever()メソッドに変更する可能性があります。これは、この値に到達するためにいくつかの重要な作業が必要であり、呼び出し元がメソッドを複数回呼び出すのではなく値をキャッシュする必要があるという私のクラスを使用する人へのヒントとして役立ちます。
簡単な計算は、プロパティの内部では完全に適切です。
とにかく、それは主に構文上の砂糖にすぎないので、オブジェクトに関する情報を返すだけで、それを変更したり、他のオブジェクトと相互作用したりしない限り、チームの慣習、またはあなたが好むものにしたいです。
MSDNはこれに関する情報を提供します ここ
クラスライブラリの設計者は、多くの場合、クラスメンバーをプロパティとメソッドのどちらとして実装するかを決定する必要があります。一般に、メソッドはアクションを表し、プロパティはデータを表します。
どちらだと思いますか?アクション計算/ getLaborCostまたはデータ?
WorkOrder workOrder = new WorkOrder();
workOrder.LaborHours = 8;
workOrder.LaborRate = 20;
decimal cost = workOrder.LaborCost; // This is OK here
しかし、同じオブジェクトに対してこれを行う場合も:
worOrder.LaborHours = 18;
decimal newCost = workOrder.LaborCost
これはプロパティにはなりません。メソッドである方がはるかに良いでしょう。
時には、何をモデリングしているかについても検討する必要があります...一部のドメインでは、計算された値は、モデルの属性であるプロパティであることが多く、または予想されます。これが当てはまる場合は、計算がそれほど簡単ではないか、計算するのに少し高価ではない場合でも、プロパティとして記述します。このプロパティの再計算を最小限に抑えるために、APIに文書化するか、キャッシュメカニズムを実装してください。