проектирование правильного класса - PullRequest
0 голосов
/ 18 мая 2011

Я хочу разработать класс OilPump, который имеет 2 атрибута. Идентификатор и емкость. Теперь существует ограничение, что нефтяной насос должен иметь емкость <6 и> 0.
1) Является ли хорошей практикой проектирование моего класса, как показано ниже? Исключение исключения из конструкции, если оно не удовлетворяет условиям.
2) Если я предоставлю метод установки, как он будет выглядеть?
3) Должен ли я разработать вспомогательный метод validateCapacity, который фактически вызывается из setCapicity?

public class OilPump {
        private String ID;
        private int Capacity;
        public OilPump(String id,int c)throws MyException{
            if(id.length()==6 && (c<6 && c>0)) {Capacity=c;ID=id;}
            else{
                throw new MyException("Invalid OilpumpID or Capacity");
                //System.out.println("Invalid OilpumpID");
            }
        }
        void start()
        {
            System.out.println("Oil Pump is  started");
        }
        void stop()
        {
            System.out.println("Oil Pump is Stopped");
        }

    }

Ответы [ 4 ]

0 голосов
/ 18 мая 2011

Возможно, вопрос личного стиля, но я бы создал фабричный метод, который инкапсулирует валидацию и сделает конструктор закрытым. Таким способом легче использовать класс OilPump в иерархии, если это потребуется в будущем. Класс будет примерно таким:

public class OilPump {
    private String id;
    private int capacity;


    public static OilPump create(String id, int capacity) {

        if(id.length()==6 && (c<6 && c>0)) {
              return new OilPump(id,capacity;
        }
        else{
            throw new IllegalArgumentException ("Invalid OilpumpID or Capacity");
        }
    }

    private OilPump(String id,int capacity) {
        this.capacity=capacity;
        this.id=id;
    }

    void start()
    {
        System.out.println("Oil Pump is  started");
    }
    void stop()
    {
        System.out.println("Oil Pump is Stopped");
    }

}
0 голосов
/ 18 мая 2011

1) Конструкторы не должны выбрасывать исключения (помните, что это плохая практика - разрешать пользователю переходить к шагу, который может вызвать исключение: рассмотрите контракты данных);2) Вы можете использовать SetCapacity (Int32) для вашего сеттера;3) Да, создание отдельных методов для определенной функциональности является целью проектирования ОО;

Надеюсь, это поможет, --KRG

0 голосов
/ 18 мая 2011

Переменные / поля следует начинать со строчной буквы.

Несмотря на то, что у вас нет ничего плохого, использование класса упрощается, если вы выбрасываете непроверенное исключение IllegalArgumentException, когда параметры неверны вместо пользовательских, отмеченныхисключение.Затем вы должны просто предоставить соответствующий javadoc для определения допустимых параметров.

Установщики / получатели не требуются, если вы не хотите, чтобы класс был изменяемым.

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

Также было бы типично тестировать и завершать с ошибкой, если это необходимо, а затем просто делать оставшуюся часть кода вне блока if.

if ((newId != null) || (newId.length() != 6) || (newCapacity > 6) || (newCapacity < 0))
{
    throw new IllegalArgumentException("Valid values must be ...");
}
id = newId;
capacity = newCapacity;
0 голосов
/ 18 мая 2011

выглядит хорошо. у вас есть частные поля и открытые методы, что правильно. Единственное, на что я укажу:

1) Java-соглашение для camelCasing, поэтому ваши поля должны быть id и capacity.
2) Прямо сейчас ваш класс является неизменным (т.е. данные в нем не могут быть изменены). Если вы хотите этого, хорошо, но если вы хотите иметь возможность изменять емкость, вы должны добавить установщики и получатели стилей java-bean.

...