2011-07-04 5 views
2

Beanの永続属性と派生属性をどのように分ける可能性がありますか?あなたの意見では何がベストプラクティスですか?以下の単純な例を仮定してください。spentMoneynumberOfDaysは永続属性、avrageSpendingPerDayは派生属性です。このデザインの質問にお答えいただき、ありがとうございます。永続フィールドと派生フィールドを分離します

class Person implements Serializable { 
    private BigDecimal spentMoney; 
    private int numberOfDays; 

    public Person() { 
    } 

    public BigDecimal getSpentMoney() { 
     return spentMoney; 
    } 

    public void setSpentMoney(BigDecimal spentMoney) { 
     this.spentMoney = spentMoney; 
    } 

    public int getNumberOfDays() { 
     return numberOfDays; 
    } 

    public void setNumberOfDays(int numberOfDays) { 
     this.numberOfDays = numberOfDays; 
    } 

    public BigDecimal getAvrageSpendingPerDay() { 
     return spentMoney.divide(new BigDecimal(numberOfDays), 2, RoundingMode.HALF_EVEN); 
    } 
} 

答えて

2

あなたはそれらを分ける必要はありません。それがカプセル化の要点です。呼び出し側はgetAvrageSpendingPerDayメソッドがあることを知っていますが、永続属性で実装されているかどうかは気にしません。

コードの残りの部分を変更することなく、またはsetNumberOfDaysが呼び出されるたびに、平均を再計算してフィールド内に格納することができます。だからゲッターを使うのは、パブリックフィールドに直接アクセスするよりも優れています。

+0

ありがとうございます。私はそれを明確にしなければならない。 Personクラスが成長するにつれ、あまりにも多くのメソッドが存在するため、明確なコードのためにのみ分離したいと思います。私は、永続的なものとそうでないものとを分けることは良いことだと思います。 –

+0

I class Personが大きくなり過ぎると、永続属性を派生属性から分離してはいけません。その代わりに、いくつかのフィールドを別々のオブジェクト(例:アドレス、連絡先、支出など)にグループ化する必要があります。 –

0

属性の中には永続性があり、他の属性は派生しているという情報だけでは、デザインの選択について考える必要はないと思います。あなたはすでに派生した属性のメンバーフィールドを持たないという重要なことをすでに処理しています。

0

あなたはちょっと混乱していると思います...シリアル化は、メソッドではなくフィールドを保持しています...あなたの例ではavrageSpendingPerDay FIELDはありません。

最後に、consumMoneyとnumberOfDaysを最終的にする(つまり、コンストラクタによってのみ設定され、その後は不変になる)場合は、getAverageSpendingPerDayメソッドの結果を(最初のリクエスト時に)フィールドにキャッシュできます。 「キャッシュフィールド」_averageSpendingPerDayをtransientとマークするだけです。

乾杯。キース。

関連する問題