C# 一组学生最初只有一个名字。从第一次考试开始,他们将有名字和分数。如何设计这是一个简单的方法?
首先,我有一组C# 一组学生最初只有一个名字。从第一次考试开始,他们将有名字和分数。如何设计这是一个简单的方法?,c#,java,oop,design-patterns,C#,Java,Oop,Design Patterns,首先,我有一组个人s: class Individual { double characteristics[]; abstract double CalculateValue(); ... } 每个人都有一套特征。这些特性将由my library的用户通过继承实现: class MyIndividualABC : Individual { public MyIndividualABC() { characteristics = new doubl
个人s:
class Individual {
double characteristics[];
abstract double CalculateValue();
...
}
每个人都有一套特征。这些特性将由my library的用户通过继承实现:
class MyIndividualABC : Individual {
public MyIndividualABC() {
characteristics = new double[2];
characteristics[0] = 123;
characteristics[1] = 456;
}
public override double CalculateValue() {
return characteristics[0] / characteristics[1]; //for example
}
}
然后我会拿着它们,给每个人一个分数(基于它们的价值)。我将称之为迭代
class EvaluatedIndividual {
double value;
double score; //score was calculated based on value
}
从iteration2和更高版本开始,我手头上总是有EvaluatedIndividual
类型的对象。但第一次,我将不得不以Individual
类型的对象作为引导
我不想以与其他迭代不同的方式对待第一次迭代。我应该如何处理这个问题
一个类比是有一班学生。在第一次考试之前,你只知道他们的名字,从第一次考试开始,你将知道他们的名字和他们考试到那一刻的平均分数
我想出了3种不同的方法来处理这个问题:
我将在程序上有一个Start()
方法,然后是一个Iteration()
。Start()
采用Individual[]
,而Iteration()
采用EvaluatedIndividual[]
。哈奇,但会创造奇迹。如果没有更好的办法,我会用这个
EvaluatedIndividual
继承自Individual
。这看起来很干净,但我不太确定,因为我希望Individual
成为一个接口,我的想法是允许我的库/框架的客户机继承它,并根据需要在Individual
上定义一组方法/字段(例如,Individual
可以有多个值,在计算值时需要考虑这些值)。如果我采用这种方法,我必须让他也实现一个来自EvaluatedIndividual
的类
个体是由值和求值
和被求值
构成的。起初,被求值是错误的,所以任何收集值
的尝试都会引发异常。我不特别喜欢这样,但我不确定为什么
你是怎么做到的?这可能是一种非常常见的模式,但我恐怕不知道有哪种GoF模式符合这种情况:(
谢谢嘿,如果这不是一种课堂练习,不要把事情弄得太复杂。GoF模式并不适用于你所知道的一切。嘿,如果这不是一种课堂练习,不要把事情弄得太复杂。GoF模式并不适用于你所知道的一切。我完全赞成简单;我只在这里上一节课。在C中#可以使用可为空的:
在Java中(显然缺少Nullable
),如果这是false
(或0
),可以只显示分数和isEvaluated
标志(或评估的考试数量计数)你只需要忽略分数。我完全赞成简单;我这里只有一个类。在C#中,可以使用Nullable
:
在Java中(显然缺少Nullable
),如果这是false
(或0
),可以只显示分数和isEvaluated
标志(或评估的考试数量计数)您只需忽略分数。我会让一个类为score
指定一个特殊值,表示该个体尚未被评估:
class Individual {
private double value;
private double score = -1; // score was calculated based on value,
// -1 means not evaluated
public boolean isEvaluated() { return score != -1; }
}
在这里,IMHO继承是一种过火的行为。我会有一个类,它对分数有一个特殊的值,表示该个体没有被评估:
class Individual {
private double value;
private double score = -1; // score was calculated based on value,
// -1 means not evaluated
public boolean isEvaluated() { return score != -1; }
}
class Individual {
double score;
ScoreState scoreState;
}
在这里,继承遗产是一种过火的行为
class Individual {
double score;
ScoreState scoreState;
}
我发现每当我需要一个状态时,我需要2,然后我很快就需要2+n,所以不妨做一个枚举,这允许出现“待审核”等情况和其他类似的考虑因素,这在将来可能会很方便,并且它可以防止标志过多,这可能会造成混乱
我发现每当我需要一个状态时,我需要2,然后我很快就需要2+n,所以不妨做一个枚举,这允许出现“待审核”之类的情况以及其他类似的考虑因素,这些考虑因素在未来可能会很方便,并且可以防止标志过多,这可能会造成混乱。你的意思是,考试后,个人
的一个实例会变成一个被评估的个人
?世界变化真的很快……你的意思是,个人
的一个实例会变成一个Ev考试后,一个学生得了-1分?世界变化真的很快……一个淘气的男孩考试得了0分,他在试卷上画了一只兔子,所以老师多拿了1分。最后他考试得了-1分。也许把-1改成double.minvalue
更好?@vitat:Cent%的一致性。继承在这里并不是一种滥杀,而是c完全没有问题。这不适合这里。@Danny:那个老师应该得到一封终止信,尤其是在绘画/美术考试时。使用这封信会产生if代码。我总是要检查这个人是否被评估过,这是我不觉得有趣的事。@Adeel:我想说的是,有时候我们可能会考试得-1分,这是可能的。一个淘气的男孩考试得0分,他在试卷上画了一只兔子,所以老师多拿了1分。最后他考试得-1分。也许把-1改成double.minvalue
更好?@vitat:Cent%的一致性。继承在这里不是一种过分的做法,但完全没有问题。它不会“不适合这里。@丹尼:那个老师应该得到一封终止信,尤其是在绘画/美术考试时。使用这封信会产生if代码。我总是要检查这个人是否被评估过,这一点我并不觉得有趣。@Adeel:我想说的是,有时我们在考试中可能会得到-1分,这是可能的。”这不是w的真正目的