Нужен совет по интерфейсам - PullRequest
8 голосов
/ 20 октября 2011

Мне просто нужно немного отзывов о проблеме, которую я пытаюсь решить ...

Вот описание проблемы:

Моя компания продает некоторые продукты, для которых клиентможете оплатить за определенный период времени.Клиенты классифицируются как существующие или новые.Чтобы клиенты могли купить продукт, мы проверяем кредитоспособность, и в некоторых случаях клиента могут попросить внести залог, который подлежит возврату.Некоторые клиенты имеют хорошую историю платежей с нами, поэтому нам не нужно взимать с них сумму залога.Чтобы выполнить оценку, я разработал решение следующим образом:

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 для стоимости облигации.Это как-то не правильно.Можно ли это как-то улучшить?Любые комментарии / предложения приветствуются.

1 Ответ

1 голос
/ 20 октября 2011

Вы можете добавить логическое свойство BondRequired, чтобы сделать намерение явным, вместо того, чтобы полагать, что «нулевая связь не имеет большого смысла; разработчик должен был рассчитывать, что результат не будет представлять никакой связи»."

Однако я согласен с Магнумом в том, что это уже сложнее, чем кажется необходимым, поэтому добавление большего числа членов в тип может быть не лучшим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...