web-dev-qa-db-ja.com

フィールドのセッターで計算を実行するか、別の方法を使用する方が良いですか?

Quotamaximumに基づいて使用率を決定する単純なusedオブジェクトを実装しています。

_private int maximum;
private int used;

public Quota(int used, int maximum) {
    this.maximum = maximum;
    this.used = used;
}

public double getUsagePercentage() {
    return ((double) used / (double) maximum) * 100.0;
}

public int getMaximum() {
    return maximum;
}

public void setMaximum(int maximum) {
    this.maximum = maximum;
}

public int getUsed() {
    return used;
}

public void setUsed(int used) {
    this.used = used;
}
_

しかし、私はそれを別の方法で行うことができ、実際にロジックを持っていることに気づきましたinセッター:

_private int maximum;
private int used;
private double percentageUsed;

public Quota(int used, int maximum) {
    this.maximum = maximum;
    this.used = setUsed(used);
}

public int getMaximum() {
    return maximum;
}

public void setMaximum(int maximum) {
    this.maximum = maximum;
    percentageUsed = ((double) used / (double) maximum) * 100.0;
}

public int getUsed() {
    return used;
}

public void setUsed(int used) {
    this.used = used;
    percentageUsed = ((double) used / (double) maximum) * 100.0;
}

public double getUsagePercentage() {
    return percentageUsed;
}
_

2番目の方法は、私にとってははるかに醜いように見えますが、たぶん私はただ教えられているだけです。ロジックが2つのセッター間でコピーされることは明らかですが、独自のprivateヘルパーメソッドにロジックを抽出したとしても、要点はわかります。 getUsagePercentage()メソッドが呼び出されるたびにパーセンテージの計算を行う必要がないように、おそらくこれがより良いアプローチだと思いました。 maximumusedのどちらの値も変更されていない場合、すでに答えがわかっている操作を実行し続けるのは無駄に思えます。

どちらを選択するかについての前例はありますか? Javaを永遠に続けているという理由だけで、最初の方が好きですが、それを実際にそのように維持するための確固たる議論ではありません。両方の長所と短所は何ですか?または本当に1つです、他より客観的に良いですか?

1
asteri

1つの値(最大)を設定してから次の(使用済み)を更新すると(さらに頻繁に-プログレスバーを考えて)、計算を2回実行し、さらに悪いことに、setXY操作の間に値を要求する人は誰もいません。誰も実際に要求しないことに時間を費やすのはなぜですか。したがって、必要なときにいつでもゲッターを使用して実際の値を計算することはまったく問題ありません。あなたが気づいたように、あなたはDRY(自分自身を繰り返さないでください)-原則に違反しています。より複雑なセッターと複雑な計算を使用すると、トレードオフはさらに悪化します。最初の例は問題ありません。

6
thepacker

一般的なガイドラインの1つは、システムで認識されている事実について、それが保存される場所は1つだけである必要があるということです。データベースでは、これは正規化と呼ばれます。オブジェクト設計では、この原則は「信頼できる唯一の情報源」または頭字語SPOTと呼ばれることがあります。これは、「自分を繰り返さない」(DRY)の原則と密接に関連しており、実際、DRYの1つの定式化では、実際には同じです。

「すべての知識は、システム内で単一の明確で信頼できる表現を持たなければなりません。」

あなたの例では、パーセンテージには2つの真実があります。それは、パーセンテージを直接格納する変数と、それが計算される完全な整数値を保持する変数です。これは特に悪い問題ではありません。2つは1つの小さなクラス内にあり、したがって管理できるためですが、これを行う正当な理由がない限り、回避します。

4
Jules