2015-08-26 10 views
0

Во-первых, я предполагаю, что Java Enums должны соответствовать тем же правилам, что и обычные классы.Является ли это Enum нарушением принципа единой ответственности?

Я немного туманно о значении «Единой ответственности». Со следующим кодом мне интересно, является ли метод hasSucceed нарушением, поскольку его логика выходит за рамки проведения уровня.

Если это нарушает принцип, как я буду реорганизовать?

package foo; 

public enum Level { 
    AWFUL(-4), 
    TERRIBLE(-3), 
    POOR(-2), 
    MEDIOCRE(-1), 
    FAIR(0), 
    GOOD(1), 
    GREAT(2), 
    SUPERB(3), 
    LEGENDARY(4); 

    private final int level; 

    Level(int level) { 
     this.level = level; 
    } 

    public int getValue() { 
     return this.level; 
    } 

    public boolean hasSucceeded(Level requiredLevel, Level roll) { 
     return getValue() + roll.getValue() >= requiredLevel.getValue(); 
    } 
} 
+0

Как и где вы используете 'hasSucceeded'? Возможно, этот метод относится к классу вызывающих. –

+1

Просто, чтобы вы знали, что вы можете заменить 'level' и' getValue' на 'ordinal() - 4' – resueman

+0

. Я думал, что метод hasSucceeded был лучшим в уровне, потому что я думал, что лучше абстрагировать весь -4 ... 4 системы. – HedgepigMatt

ответ

2

Я рекомендую вам оставить Обязанность hasSuccessed метода к другим классу, которые вы можете попросить ли это другие методы.

Я предпочитаю ставить только перечислений отделенных кода или логики и использовать перечисление уровня как «хранилище» из перечислений.

3

Вы должны подумать о причинах изменения: выполняются ли требования для hasSucceeded change по разным причинам, чем требования к списку уровней? Это нельзя судить только на основе кода, вам нужно подумать о вариантах использования. Например, если перечисление уровней является частью библиотеки, которая используется для разных игровых проектов, это может вызвать проблемы, если разные игры могут нуждаться в другой логике успеха.

Обратите внимание, что в другом принципе the principle of information hiding предполагает, что этот метод должен быть указан в этом перечислении, поскольку его аргументы также имеют тип Level.

BTW, вполне нормально обрабатывать перечисления как классы и добавлять к ним методы. Это одна из сильных сторон перечислений Java.

+0

+1 Разработчики не должны бояться использовать полномочия java enums как классы, если они будут последовательными. –