需要关于接口的建议

本文关键字:接口 于接口 | 更新日期: 2023-09-27 18:11:51

我只是需要一些关于我正在努力解决的问题的反馈…

问题描述如下:

我的公司销售一些产品,客户可以在一定时期内付款。客户分为现有客户和新客户。为了让客户购买产品,我们会检查客户的信用状况,有时还会要求客户交保证金,保证金是可以退还的。有些客户与我们有良好的付款记录,所以我们不需要向他们收取保证金。为了实现评估,我设计了如下解决方案:

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以获得债券值。这感觉不太对劲。这一点可以改进吗?

需要关于接口的建议

你可以添加一个布尔bondrerequired属性来明确意图,而不是依赖于人们推断"零键没有多大意义;开发商一定是有意让这个结果表示根本没有债券。"

但是,我同意Magnum的观点,这已经比看起来必要的更复杂了,所以向类型中添加更多成员可能不是最好的方法。