Я попытаюсь обобщить некоторые из уже приведенных здесь моментов, с которыми я согласен.
Лично я не думаю, что есть ответ «чувствует себя лучше». Веские причины существуют, почему вы не хотите, чтобы служебный класс заполнялся статическими методами.
Короткий ответ: в объектно-ориентированном мире вы должны использовать объекты и все хорошее, что с ними связано (инкапсуляция, полиморфизм).
Полиморфизм
Если метод расчета расстояния между генами варьируется, следует использовать примерно (скорее всего, Strategy) имеют класс Gene для каждого варианта. Инкапсулируйте то, что варьируется. В противном случае вы получите несколько ifs.
Это означает, что если появится новый метод расчета расстояния между генами, вы не должны изменять существующий код, а скорее добавлять новый. Иначе вы рискуете сломать то, что уже есть.
В этом случае вам следует добавить новый класс Gene, а не изменять код, написанный в #geneDistance.
Вы должны указывать своим объектам, что делать, а не спрашивать их об их состоянии и принимать за них решения. Внезапно вы нарушаете принцип единой ответственности, поскольку это полиморфизм.
Тестируемость
Статические методы легко тестировать изолированно, но в будущем вы будете использовать этот статический метод в других классах. Когда дело доходит до тестирования этих классов на изоляции, вам будет трудно это сделать. Или, скорее, нет.
Я позволю Миско есть его высказывание, которое, скорее всего, лучше, чем то, что я могу придумать.
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));
}
}
person
Community
schedule
11.11.2009