怀疑如何组织我的课程

Posted

技术标签:

【中文标题】怀疑如何组织我的课程【英文标题】:Doubt about how to organize my classes 【发布时间】:2011-08-08 03:52:36 【问题描述】:

这只是我的代码中的一个示例。我正在寻找一种好方法来维护我的课程并遵循一些 OOP 规则。

这是我的抽象类问题:

public abstract class Problem<T> : IEquatable<T>

    public abstract int ResultCount  get; 
    protected abstract bool CheckTheAnswer(params object[] results);
    public abstract bool Equals(T other);

以下是从 Problem 派生的一个类,Arithetic 类包含数学问题中包含的所有必要内容,以及如何解决它:

public enum Operations

    Addition, Subtraction, Multiplication, Division


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;
    


public class Addition : Arithmetic

    public Addition(decimal addend1, decimal addend2)
        : base()
    
        Number1 = addend1;
        Number2 = addend2;
        Operation = Operations.Addition;
    


// Subtraction, Multiplication and Divison here

然后我有另一个生成算术问题的类,它接收一个元组,其中包含一些指示条件的属性

interface IProblemFactory<T> where T : Problem<T>

    T Create();


public class ArithmeticProblemFactory : IProblemFactory<Arithmetic>

    private Tuple<Operations, Range, Range> _condition;

    public ArithmeticProblemFactory(Tuple<Operations, Range, Range> condition)
    
        this._condition = condition;
    

    public Arithmetic Create()
    
        Operations operation = _condition.Item1;
        decimal a = _condition.Item2.GetNumber();
        decimal b = _condition.Item3.GetNumber();

        switch (operation)
        
            case Operations.Addition:
                return new Addition(a, b);
            case Operations.Subtraction:
                return new Subtraction(a, b);
            case Operations.Multiplication:
                return new Multiplication(a, b);
            case Operations.Division:
                return new Division(a, b);
            default:
                throw new Exception("Operator unexpected");
        
    

问题是...我需要更多属性,例如 Result(在算术类中只需要 1 个,相比之下 2 个数字我们需要两个属性 result)、问题编号、解决问题的时间(秒)。

问题是,我不知道我应该把这些属性放在哪里。一种方法是在 Problem 类中添加其中一些,或者创建另一个类似这样的类:

算术题

Problem Problem

结果

时间

问题编号

我只想按照必须的方式组织我的课程。 提前致谢。

【问题讨论】:

我建议首先清理您现在拥有的设计,然后继续前进。 Operation 枚举的意义何在?对于每种类型的算术运算,您都有子类,因此您不需要枚举。通过将 switch 分支中的代码移动到算术类中抽象方法的实现中,将这些 switch 语句重构为类层次结构。此外,如果您想使用 Equals 方法,请考虑比较操作的类型。 【参考方案1】:

您可以有不同的结果类,并且在您的算术类中接受结果类型作为通用:

public class Arithmetic < TResult> : ...

Addition可以如下:

public class Addition : Arithmetic <decimal>
...

但如果参数的数量(如结果、时间、...)不固定(动态),您可以拥有一个字典并将它们存储在字典中(它们的类型)并编写特定的操作并将它们设置为字典的值.

【讨论】:

请看这个问题..这是同一个问题,但更具体***.com/questions/6988431/… @oscar.fimbres,我找不到这个问题之间的任何区别,请编辑当前问题。 嗯,我想让您知道的唯一一件事是我需要保留不同的数据类型,例如答案,并且问题可能有多个结果(结果 1 和结果 2)。我在想是否有必要创建另一个类来存储每个数学问题的所有答案 @oscar.fimbres,您可以为不同的结果定义一个类并将它们作为通用参数传递(我在回答中提到了这一点)。 但是你不认为创建另一个类来存储这个问题的答案更好吗?我的意思是,一类用于问题,另一类用于答案(这些包含 CheckThe...)我之所以说这些,是因为稍后我可能需要对这些中的每一个进行转换以获得结果。【参考方案2】:

我建议将结果、时间(生成或解决)和问题编号都放在问题类中。每个问题都有自己的结果、时间和编号;他们也可以包括在内。这使您无需将另一个课程与每个问题联系起来,并且拥有一个包罗万象的问题课程。

【讨论】:

一方面我也这么认为,但是问题包含在Result中的不同数据类型..其中一些Result是类Fraction,其他是小数等。您认为方便吗?答案类? 好吧,如果您想将结果存储为浮点值,您可以添加一个方法将其转换为分数,并且仍然将其全部保存在您的 Problem 类中 :)

以上是关于怀疑如何组织我的课程的主要内容,如果未能解决你的问题,请参考以下文章

Jquery:我的课程在第二次通话期间不起作用

NoSuchFieldError Java

Katacoda - 创建课程

优质师资:莫建明老师《企业组织架构设计》课程,授课邀请:17744561971

一种基于问题观察和组织的SVVR方法,在文化课程中提高学生的演示表现课堂参与度和技术接受度

大学二年级数据结构课程设计问题