需要有关接口的建议

muk*_*ngh 8 c# design-patterns interface

我只是需要一些关于我想解决的问题的反馈......

以下是对问题的描述:

我公司销售一些客户可以在一段时间内支付的产品.客户被归类为现有或新的.为了让顾客购买产品,我们检查信誉,有时可以要求客户存入保证金,可以退还.有些客户与我们有良好的付款记录,因此我们无需向他们收取保证金金额.为了实施评估,我设计了一个解决方案如下:

public interface ICreditAssessor
{
    CreditAssessment Process();
    Decimal CalculateBond(BondCalculator bc);
}
Run Code Online (Sandbox Code Playgroud)

定义了两个实现此接口的类.

public class GoodClientProcessor : ICreditAssessor{
    ..... methods
}

public class OtherClientProcessor : ICreditAssessor{
    ..... methods
}
Run Code Online (Sandbox Code Playgroud)

根据客户是否与我们有良好的付款历史记录,有一个类返回适当的处理器.

另外,我实现了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

界面IRiskEvaluator如下:

public interface IRiskEvaluator
{
    Decimal EvaluateRisk();
}
Run Code Online (Sandbox Code Playgroud)

实现此接口的两个类如下:

public class FinancialRiskEvaluator : IRiskEvaluator
{
    Decimal IRiskEvaluator.EvaluateRisk()
    {
        ... calculate risk amount
    }
}
Run Code Online (Sandbox Code Playgroud)

public class ProductRiskEvaluator : IRiskEvaluator
{        

    Decimal IRiskEvaluator.EvaluateRisk()
    {
        ... calculate risk amount
    }
}
Run Code Online (Sandbox Code Playgroud)

现在调用所有这些都是通过一种方法完成的.相关代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

这个设计还可以,还是可以进一步改进?我看到的一个问题是,由于具有良好支付历史的客户不需要债券,我仍然需要调用该方法CalculateBond并返回0债券价值.这种感觉不对.这可以以某种方式得到改善吗?任何意见/建议表示赞赏.

pho*_*oog 1

您可以添加一个布尔值 BondRequired 属性来明确意图,而不是依赖人们来推断“零键没有多大意义;开发人员一定希望该结果代表根本没有键。”

然而,我同意 Magnum 的观点,即这已经比看起来必要的更加复杂,因此向该类型添加更多成员可能不是最好的做法。