Стиль кодирования Java, локальные переменные и повторные вызовы методов - PullRequest
11 голосов
/ 09 февраля 2010

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

/*
 * 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();
}
  • Я считаю, что первый способ будет работать чуть-чуть быстрее
  • Я думаю, что второй способ нарушает принцип СУХОЙ
  • Я считаю,первый способ более читабелен и проще в отладке (... нормально, ничтожно, потому что я могу перешагнуть)
  • Я не хочу иметь дело с возможностью изменения состояния объекта

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

Ответы [ 7 ]

8 голосов
/ 09 февраля 2010

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

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

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

3 голосов
/ 09 февраля 2010

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

2 голосов
/ 09 февраля 2010

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

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

1 голос
/ 09 февраля 2010

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

1 голос
/ 09 февраля 2010

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

Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
   ((Car) vehicle).openSunroof();
} else if (vehicle instanceof Bike) {
   ((Bike) vehicle).foldKickstand();
}
1 голос
/ 09 февраля 2010

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

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

1 голос
/ 09 февраля 2010

Я согласен, но я также стараюсь сократить использование 'instanceof' на уровне разработки классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...