7 つの潜在的な入力を考慮して、重要な値を導出する必要があります。ボブおじさんは、それほど多くのパラメーターを持つ関数を避けるように私に促したので、クラスを抽出しました。すべてのパラメーターがプロパティになりました。引数のない計算方法が残っています。
「あれ」は、「プロパティかもしれないが、慣用的な C# かどうかはわからない」と思います。
最終結果をプロパティとして、または引数なしのメソッドとして公開する必要がありますか? 平均的な C# プログラマーは、プロパティを混乱させたり不快に感じたりするでしょうか? Alt.Net クラウドはどうですか?
decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious
後者の場合:中間結果を [private] properties として宣言する必要がありますか? 重いメソッド抽出のおかげで、いくつかの中間結果が得られました。これらの多くは、パブリック API の一部であってはなりません。ただし、それらのいくつかは興味深いものになる可能性があり、それらにプロパティとしてアクセスできれば、私の式はよりきれいに見えます。
decimal interim2 = this.ImportantInterimValue * otherval;
ハッピー実験部:
VS2008 で自分のコードをデバッグしているときに、中間結果を計算するメソッド呼び出しの上にマウスを置いたままにして、戻り値が表示されることを期待していることに気付きました。すべてのメソッドをプロパティに変換した後、中間結果をプロパティとして公開すると、デバッグに非常に役立つことがわかりました。私はそれで十分満足していますが、可読性について長引く懸念があります。
暫定的な値の宣言はより乱雑に見えます。ただし、式は括弧なしで読みやすくなります。メソッド名を動詞で始める必要はもうありません。対照的に:
// Clean method declaration; compulsive verby name; callers need
// parenthesis despite lack of any arguments.
decimal DetermineImportantInterimValue() {
return this.DetermineOtherInterimValue() * this.SomeProperty;
}
// Messier property declaration; clean name; clean access syntax
decimal ImportantInterimValue {
get {
return this.OtherInterimValue * this.SomeProperty;
}
}
おそらく、私は 10 年間 Python でコーディングしてきたことを説明する必要があります。私は、自分のコードを書くよりも呼び出しやすくするために余分な時間を費やす傾向にありました。ただし、Python コミュニティがこのプロパティ指向のスタイルを受け入れ可能な「Pythonic」と見なすかどうかはわかりません。
def determineImportantInterimValue(self):
"The usual way of doing it."
return self.determineOtherInterimValue() * self.someAttribute
importantInterimValue = property(
lambda self => self.otherInterimValue * self.someAttribute,
doc = "I'm not sure if this is Pythonic...")