Мне просто нужно немного отзывов о проблеме, которую я пытаюсь решить ...
Вот описание проблемы:
Моя компания продает некоторые продукты, для которых клиентможете оплатить за определенный период времени.Клиенты классифицируются как существующие или новые.Чтобы клиенты могли купить продукт, мы проверяем кредитоспособность, и в некоторых случаях клиента могут попросить внести залог, который подлежит возврату.Некоторые клиенты имеют хорошую историю платежей с нами, поэтому нам не нужно взимать с них сумму залога.Чтобы выполнить оценку, я разработал решение следующим образом:
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
для стоимости облигации.Это как-то не правильно.Можно ли это как-то улучшить?Любые комментарии / предложения приветствуются.