Как мне сделать хороший дизайн для этой модели? - PullRequest
0 голосов
/ 09 августа 2011

Я новичок в создании классов диаграмм. Необходимость обязывает меня сделать хорошую модель.

Решение для математической викторины. Система должна генерировать каждую проблему и проверять ответ.

Я собираюсь показать мои общие классы:

Здесь есть сундуки

interface IProblemFactory<T> where T : Problem<T>
{
    T Create();
}

public class ArithmeticProblemFactory : IProblemFactory<Arithmetic>
{
    // This generates Arithmetic problems
    public Arithmetic Create() { }
}

// And the others types of problems

Тогда у меня есть классы, которые содержат проблему:

public abstract class Problem<T> : IEquatable<T>
{
    public abstract int ResultCount { get; }
    public abstract bool CheckTheAnswer();
    protected abstract bool CheckTheAnswer(params object[] results);
    public abstract bool Equals(T other);
}

public class Arithmetic : Problem<Arithmetic>
{
    public decimal Number1 { get; set; }

    public Operations Operation { get; set; }

    public decimal Number2 { get; set; }

    public override int ResultCount
    {
        get { return 1; }
    }

    protected override bool CheckTheAnswer(params object[] results)
    {
        if (results.Length != ResultCount)
            throw new ArgumentException("Only expected " + ResultCount + " arguments.");

        decimal result = (decimal)results[0];

        switch (Operation)
        {
            case Operations.Addition:
                return Number1 + Number2 == result;
            case Operations.Subtraction:
                return Number1 - Number2 == result;
            case Operations.Multiplication:
                return Number1 * Number2 == result;
            case Operations.Division:
                return Number1 / Number2 == result;
            default:
                throw new Exception("Operator unexpected");
        }
    }

    public override bool Equals(Arithmetic other)
    {
        if (other == null)
            return false;

        return this.Number1 == other.Number1 && Number2 == other.Number2;
    }
}

Проблема, я думаю, я не делаю хорошего дизайна. Потому что все проблемы будут содержать CheckTheAnswer (params obj ..). Но все проблемы имеют разные результаты.

Например, в Арифметике необходимо только десятичное значение, для сравнения 2 мне нужно сохранить два значения, другие мне нужно сохранить результат как класс дроби.

Может быть, мне нужно разделить их .. Арифметика может содержать только два свойства: проблему и ответ, но я не уверен.

1 Ответ

1 голос
/ 09 августа 2011

Если все возможные проблемы имеют различный набор результатов, то какую функциональность вы надеетесь преобразовать в интерфейс?Они не имеют какой-либо общей функциональности.Это твоя проблема.Вы могли бы быть в состоянии сделать что-то простое, например

interface Problem {
    void OutputProblem(OutputStream stream);
    void AcceptAnswer(InputStream stream);
    bool IsAnswerCorrect();
}

Однако ваша текущая архитектура просто не подходит для цели.

...