我只需要一点关于我试图解决的问题的反馈…
以下是对问题的描述:
我公司出售一些产品,顾客可以在一定时期内付款。客户被归类为现有的或新的。为了让客户购买产品,我们会检查产品的信用状况,有时会要求客户交纳保证金,保证金可以退还。有些客户在我们这里有很好的付款记录,所以我们不需要向他们收取保证金。为了实施评估,我设计了如下解决方案:

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以获取保证金值。不知怎么的,这感觉不对。这能有所改进吗?如有任何意见/建议,我们将不胜感激。

最佳答案

您可以添加一个boolean bondnerquired属性来明确意图,而不是依赖于人们来推断“一个零的键没有多大意义;开发人员一定是故意让这个结果表示根本没有键”。
但是,我同意magnum的观点,这已经比看起来必要的要复杂得多,因此在类型中添加更多成员可能不是最好的做法。

07-28 13:33
查看更多