我试图总结我同意的这里已经提出的一些问题。
我个人并不认为有一个“更好”的答案。 有效原因do存在于上,原因是你不放弃用固定方法填充的公用事业类别。
简短的回答是,在一个以目标为导向的世界里,你应当使用物体和与物体(资本、多变)相关的所有“货物”。
Polymorphism
如果计算基因距离的方法varies,请roughly。 (很可能是Strategy) 每个变式都有一个通用类别。 概述不同之处。 你们最后会有多个方面。
这意味着,如果计算基因之间距离的新方法落下,请shouldn t 修改现有代码,但 添加新的。 你们冒着打破那里已经存在的东西的风险。
在这种情况下,你应当增加一个新的基因组,而不是修改在#geneDistance上写的代码。
你们应该告诉你们要做些什么,不要问他们自己的国家,并为他们作出决定。 http://en.wikipedia.org/wiki/Single_responsibility_principle” rel=“nofollow noretinger”>,single responsibility principle since that s poly吗?
Testability
静态方法可能很容易孤立地加以测试,但是,你将在其他班子使用这一固定方法。 在孤立地测试这些班级时,你将很难做。 或者不是。
页: 1 他的话比我能够说的话要好。
import junit.framework.Assert;
import org.junit.Test;
public class GeneTest
{
public static abstract class Gene
{
public abstract int geneDistance(Gene other);
}
public static class GeneUtils
{
public static int geneDistance(Gene g0, Gene g1)
{
if( g0.equals(polymorphicGene) )
return g0.geneDistance(g1);
else if( g0.equals(oneDistanceGene) )
return 1;
else if( g0.equals(dummyGene) )
return -1;
else
return 0;
}
}
private static Gene polymorphicGene = new Gene()
{
@Override
public int geneDistance(Gene other) {
return other.geneDistance(other);
}
};
private static Gene zeroDistanceGene = new Gene()
{
@Override
public int geneDistance(Gene other) {
return 0;
}
};
private static Gene oneDistanceGene = new Gene()
{
@Override
public int geneDistance(Gene other) {
return 1;
}
};
private static Gene hardToTestOnIsolationGene = new Gene()
{
@Override
public int geneDistance(Gene other) {
return GeneUtils.geneDistance(this, other);
}
};
private static Gene dummyGene = new Gene()
{
@Override
public int geneDistance(Gene other) {
return -1;
}
};
@Test
public void testPolymorphism()
{
Assert.assertEquals(0, polymorphicGene.geneDistance(zeroDistanceGene));
Assert.assertEquals(1, polymorphicGene.geneDistance(oneDistanceGene));
Assert.assertEquals(-1, polymorphicGene.geneDistance(dummyGene));
}
@Test
public void testTestability()
{
Assert.assertEquals(0, hardToTestOnIsolationGene.geneDistance(dummyGene));
Assert.assertEquals(-1, polymorphicGene.geneDistance(dummyGene));
}
@Test
public void testOpenForExtensionClosedForModification()
{
Assert.assertEquals(0, GeneUtils.geneDistance(polymorphicGene, zeroDistanceGene));
Assert.assertEquals(1, GeneUtils.geneDistance(oneDistanceGene, null));
Assert.assertEquals(-1, GeneUtils.geneDistance(dummyGene, null));
}
}