Подтвердить что ты не робот

Стиль кодирования Java, локальные переменные и повторные вызовы методов

Я предпочитаю использовать локальные переменные, а не несколько вызовов одного и того же метода.

/*
 * I prefer this
 */
Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
   Car car = (Car) vehicle;
   car.openSunroof();
} else if (vehicle instanceof Bike) {
   Bike bike = (Bike) vehicle;
   bike.foldKickstand();
}
/*
 * Rather than this
 */
if (person.getVehicle() instanceof Car) {
   Car car = (Car) person.getVehicle();
   car.openSunroof();
} else if (person.getVehicle() instanceof Bike) {
   Bike bike = (Bike) person.getVehicle();
   bike.foldKickstand();
}
  • Я считаю, что первый способ будет выполнять крошечный бит быстрее
  • Я думаю, что второй способ нарушает принцип СУХОЙ
  • Я нахожу первый способ более удобочитаемым и более легким для отладки (... ОК незначительно, потому что я мог бы перешагнуть)
  • Я не хочу иметь дело с возможностью изменения состояния объекта.

Что вы предпочитаете и почему?

4b9b3361

Ответ 1

Да, первое, безусловно, лучше. Я бы никогда не пошел на второй метод. Но вы должны думать о более широком использовании полиморфизма. Опираясь на instanceof, так тяжело, это не хорошая конструкция OO.

Ответ 2

Я предпочитаю первую версию по всем причинам, о которых вы упомянули. В частности (просто для того, чтобы изложить ваш четвертый пункт), это означает, что вы обязательно получите согласованные результаты... вы можете получить ужасно неприятные результаты со второй версией, если getVehicle() возвратил Car при первом вызове, то a Bike на втором...

Сторона производительности меня не беспокоит (например, я буду счастливо называть List.size(), например), но читаемость, согласованность и неповторение важны. По сути, первый фрагмент передает идею "получить значение, а затем использовать его" гораздо эффективнее, чем второй.

Итак, да, я с тобой... кто-нибудь рекомендует вам вторую форму?

Ответ 3

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

Но переменная обязательно должна быть final!

Ответ 4

Я согласен, но я также стараюсь уменьшить использование "instanceof" тоже на уровне дизайна класса.

Ответ 5

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

Вероятно, второе немного быстрее (если вы используете Java 1.6), потому что в первом примере вы делаете копию переменной, тогда как Java-виртуальная машина, вероятно, будет встроить вызов функции в оба примера. Конечно, оптимизация никогда не является аргументом в таких вызовах. Компилятор делает так много оптимизаций, что мы не должны беспокоиться (часто это просто уменьшает скорость, потому что мы не знаем об этом достаточно хорошо).

Ответ 6

Как все, кто ответил на этот вопрос до сих пор, я определенно предпочитаю первый стиль. Это может быть даже более чистым, хотя:

Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
   ((Car) vehicle).openSunroof();
} else if (vehicle instanceof Bike) {
   ((Bike) vehicle).foldKickstand();
}

Ответ 7

Оба примера нуждаются в некоторой работе. Попробуйте подтолкнуть поведение к абстрактному (или защищенному) методу на Автомобиле. Если это код, который вы не можете изменить, используйте композицию, чтобы поместить его внутри интерфейса в базу кода, чтобы вам не пришлось загрязнять остальную часть вашего кода плохим дизайном библиотеки, которую вы используете. Это определенно запах кода. См. "Замена условного с полиморфизмом" в книге рефакторинга Фаулера.