2012-01-03 20 views
2

私は以下の年齢のような特定の要件に応じて割引に特定の値を与えることができるようにしたい:> 25と職業を=教師/教授10%の割引を取得し、年齢< 25とgradepoint> 7は、25%の割引if文を使用して属性の値を変更するにはどうすればよいですか?

を取得

これはこれまでのところ、私は二重のOOパラダイムを使用しています私のコードです:

public class customer { 

    //attribute definitions 
    private String name; 
    private String address; 
    private String profession; 
    private Integer age; 
    private Integer gradepoint; 
    private double discount; 

    //constructor 
    public customer(String newName, String newAddress, String newProfession, Integer newAge, Integer newGradepoint, double newDiscount) 
    { 
     setName(newName); 
     setAddress(newAddress); 
     setProfession(newProfession); 
     setAge(newAge); 
     setGradepoint(newGradepoint); 
     setDiscount (newDiscount); 
    } 

    //getters 
    public String getName() 
    { return name;} 
    public String getAddress() 
    { return address;} 
    public String getProfession() 
    { return profession;} 
    public Integer getAge() 
    { return age;} 
    public Integer getGradepoint() 
    { return gradepoint;} 
    public double getDiscount() 
    { return discount;} 

    //setters 
    public void setName (String newName) 
    { name = newName;} 
    public void setAddress (String newAddress) 
    { address = newAddress;} 
    public void setProfession (String newProfession) 
    { profession = newProfession;} 
    public void setAge (Integer newAge) 
    { age = newAge;} 
    public void setGradepoint (Integer newGradepoint) 
    { gradepoint = newGradepoint;} 
    public void setDiscount (double newDiscount) 
    { discount = newDiscount;} 

    //methods 


} 

は私が割引と呼ばれるサブクラスまたは割引の各タイプを作成する必要がありますか?割引を管理するためにこの顧客クラスに直接メソッドを書くことができますか?

答えて

3

は割引を制御するには、この顧客のクラスにメソッドを直接書くのか?

これです。それを計算フィールドにします。 setDiscount機能を殺し、discount変数を殺す、とのようなものにgetDiscount機能します

public double getDiscount() { 
    if (...) return ...; 
    if (....) return ...; 
    ... 
} 

...あなたは、デフォルトの割引としてこれを持っている場合を除き、まだ変更を許可、としてdiscountを保つ、その場合にはこの完全なロジックをコンストラクタに移動します。条件付きのsetDiscount()呼び出しがあります。

+0

あなたはsetDiscount setterを削除してgetDiscount()を使い、複数のif文を使用したいと思ってもいいですか? @amadan –

1

あなたのgetDiscount関数は理想的には計算を行い、現在のオブジェクトに対して適切な割引を返します。たとえば:

public double getDiscount() 
{ 
    if (getAge() < 25 && getGradepoint() > 7) 
    { 
     return .25; 
    } 
    else if // other logic... 
} 
+0

私はそれが文字列値だと思うので、それは「&&」オペランドでは動作しませんので、私はもしgetAge> 25とgetProfession =「先生」がどのように行うのでしょう。何か案が? @jknupp –

0

おそらく時間の経過とともに、さまざまなルールが進化します。割引が行われる現場では、注文時に、割引と適用されたルールへの参照を一緒に保存する必要があります。 この種のビジネスロジックは、独自のクラスを持つことができます。包括的な解決策は、ルールをスクリプト可能なコード(BeanShell = Java、またはJavaScript)として保存し、javaのスクリプトAPIを使用することです。このようなビジネスロジックがビジネスマネージャーとより多くのものになり、ルールを提示して編集できるようになります。

1

最も単純な解決策ではありませんが、私は割引計算を別のインターフェイスとクラスに抽象化し、顧客オブジェクトに優先割引値を持つようにします。

など。

public interface DiscountManager<T> 
{ 
    public double getDiscount(T discountObject); 
} 

public abstract class AbstractCustomerDiscountManager extends DiscountManager<Customer> 
{ 
    public double getDiscount(Customer customer) 
    { 
    if (customer.hasCustomDiscount()) { return customer.getDiscount(); } 
    else { return calculateDiscount(customer); } 
    } 

    public abstract double calculateDiscount(Customer customer); 
} 

public class DefaultDiscountManager extends AbstractCustomerDiscountManager 
{ 
    public double calculateDiscount(Customer customer) 
    { 
    double discount = 0; 
    if ((customer.getAge() != null) && (customer.getAge() < 25)) { discount += 25; } 
    ... 
    return discount; 
    } 
} 
関連する問題