怀疑如何组织我的课程
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 类中 :)以上是关于怀疑如何组织我的课程的主要内容,如果未能解决你的问题,请参考以下文章
优质师资:莫建明老师《企业组织架构设计》课程,授课邀请:17744561971