如何为这个型号做好设计?

时间:2011-08-08 20:53:25

标签: c# oop uml

我是创建图表类的初学者。必要性使我有必要做一个好的模型。

解决方案是进行数学测验。系统必须生成每个问题并检查答案。

我将展示我的普通课程:

这里有casses

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 ..)。但所有问题都有不同的结果。

例如在Arithmetic中只需要一个十进制值,比较2我需要存储两个值,其他我需要存储结果,如Fraction类。

也许我需要将它们分开..算术可能只包含两个属性:问题和答案,但我不确定。

1 个答案:

答案 0 :(得分:1)

如果所有可能的问题都有不同的结果集,那么您希望将哪些功能重构为接口?他们没有任何常见功能。这是你的问题。你可能能够做一些简单的事情,比如

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

但是,您目前的架构根本不适合。