[英]Need advice on interfaces
關於我要解決的問題,我只需要一些反饋...
這是問題的描述:
我公司出售某些產品,客戶可以在一定時間內付款。 客戶分為現有客戶或新客戶。 為了讓客戶購買產品,我們會檢查您的信譽,有時可能會要求客戶存入保證金,該保證金可以退還。 一些客戶在我們這里有很好的付款歷史,因此我們不需要向他們收取保證金。 為了實施評估,我設計了以下解決方案:
public interface ICreditAssessor
{
CreditAssessment Process();
Decimal CalculateBond(BondCalculator bc);
}
定義了兩個實現此接口的類。
public class GoodClientProcessor : ICreditAssessor{
..... methods
}
public class OtherClientProcessor : ICreditAssessor{
..... methods
}
有一個類可根據客戶與我們之間是否有良好的付款歷史來返回適當的處理器。
另外,我實現了一個BondCalculator
,如下所示:
public class BondCalculator
{
List<IRiskEvaluator> riskEvaluators;
public BondCalculator()
{
riskEvaluators = new List<IRiskEvaluator>();
}
public Decimal GetSuggestedBond()
{
Decimal riskAmount = 0;
foreach (IRiskEvaluator ire in riskEvaluators)
{
Decimal tempRisk = ire.EvaluateRisk();
if (tempRisk > riskAmount)
{
riskAmount = tempRisk;
}
}
return riskAmount;
}
public void SetRiskEvaluator(IRiskEvaluator re)
{
this.riskEvaluators.Add(re);
}
}
界面IRiskEvaluator
如下:
public interface IRiskEvaluator
{
Decimal EvaluateRisk();
}
實現此接口的兩個類如下:
public class FinancialRiskEvaluator : IRiskEvaluator
{
Decimal IRiskEvaluator.EvaluateRisk()
{
... calculate risk amount
}
}
和
public class ProductRiskEvaluator : IRiskEvaluator
{
Decimal IRiskEvaluator.EvaluateRisk()
{
... calculate risk amount
}
}
現在調用所有這些都是通過方法完成的。 相關代碼如下:
ICreditAssessor creditAssessor = CreditAssessorFactory.GetAssessor(somecriteria);
CreditAssessment assessment = creditAssessor.Process();
.
.
.
BondCalculator bc = new BondCalculator();
bc.SetRiskEvaluator(new FinancialRiskEvaluator(xmlResults));
bc.SetRiskEvaluator(new ProductRiskEvaluator(productCost));
creditCheckProcessor.CalculateBond(bc);
這種設計是否可行,還是可以進一步改進? 我看到的一個問題是,由於付款歷史良好的客戶不需要保證金,因此我仍然需要調用CalculateBond
方法,並為保證金值返回0
。 這有點不對勁。 可以在某種程度上加以改進嗎? 任何意見/建議表示贊賞。
您可以添加一個布爾的BondRequired屬性以使意圖明確,而不是依賴於人們推斷“零鍵沒有多大意義;開發人員必須打算使結果根本不代表任何鍵。”
但是,我同意Magnum的說法,這已經比看起來必要的要復雜得多,因此,向該類型添加更多成員可能不是最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.