我只是需要一些关于我要解决的问题的反馈......
以下是对问题的描述:
我的公司销售一些客户可以在一段时间内支付的产品。客户被归类为现有或新的。为了让顾客购买产品,我们检查信誉,有时可以要求客户存入保证金,可以退还。有些客户与我们有良好的付款记录,因此我们无需向他们收取保证金金额。为了实施评估,我设计了一个解决方案如下:
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
作为债券价值。这种感觉不对。这可以以某种方式得到改善吗?任何意见/建议都表示赞赏。
答案 0 :(得分:1)
你可以添加一个布尔值的BondRequired属性来使意图显式化,而不是依赖于人们推断“零的关系没有多大意义;开发人员必须要求该结果根本不代表任何债券。 “
但是,我同意Magnum的说法,这已经比看起来更复杂了,所以添加更多成员可能不是最好的选择。