LINUX.ORG.RU

[java] Вопрос

 


0

1

Читаю тут статейку http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html , в которой рассказывается про то, что interface inheritance предпочтительнее implementation inheritance. В общем-то, статья занятная, имхо, но заинтересовал следующий момент. Автор пишет

For example, an object's instance variables (member fields that aren't constants), should always be private. Period. No exceptions. Ever. I mean it. (You can occasionally use protected methods effectively, but protected instance variables are an abomination.) You should never use get/set functions for the same reason—they're just overly complicated ways to make a field public.

Обычно рекомендуют делать через сеттеры и геттеры - а здесь категоричное Нет. Что имеет в виду автор?

И вообще, что скажете про статью?

★★★★★

Ну типа инкапсуляция, сокрытие данных, все дела. В каком-то смысле геттеры-сеттеры (если в них нет никаких дополнительных проверок) эквивалентны тем же публичным полям.

С другой стороны, если рассматривать объект, как нечто, обладающее поведением и способное принимать команды, то геттеры-сеттеры действительно выглядят не очень уместными. К примеру, вместо

myCar.setSpeed(myCar.getSpeed() + 5);
будет куда естественнее вызывать
myCar.accelerate(5, Unit.KM_PER_HOUR);

Более того, есть довольно популярная практика, состоящая в том, чтобы лишать объекты какого-либо состояния. Нужно что-то изменить в объекте — создаём целиком новый объект, но с измененным свойством. Благодаря этому можно достичь большей потокобезопасности в программе. А в том же Haskell вообще такое понятие как «переменная» отсутствует. И ничего, жить можно.

CARS ★★★★
()
Ответ на: комментарий от CARS

Так а есть ли особая разница между setSpeed и accelerate ? Выглядит как просто синтаксический сахар...

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

В данном конкретном случае - есть. Принцип структурного программирования - соответствие структуры программы структуре задачи в предметной области. В данном случае это автомобиль. Когда мы сидим в автомобиле мы не задаем его скорость - мы жмем на педаль газа или тормоза, а «объект автомобиль» уже сам решает как на это реагировать. Менять скорость явным образом - суть уже вторжение во внутреннее устройство автомобиля. Так ведь и скорость выше скорости света задать можно

morse ★★★★★
()
Ответ на: комментарий от kovrik

Get/Set — это всё-таки более низкий уровень абстракции, чем accelerate. Второй вызов несет в себе больше полезной для человека информации, а именно, что ускоряется машина не на 5 чего-то там, а именно на 5 км/ч. А в каких единицах хранится скорость внутри объекта myCar, нас не должно волновать: пусть там будут хоть мили в час, хоть морские узлы. Автор метода accelerate по идее должен предусмотреть, чтобы внутри всё конвертнулось в нужную единицу.

CARS ★★★★
()
Ответ на: комментарий от morse

Это все прикольно и круто, только в программах автомобили редкость, там обычно из реального имра только баги (не те что багги), и все. А все остальное уже зависит от архитектора - практически любую логику можно представить как в виде структур данных и операторов над нимим, так и в виде опухших от индусокода объектов типа твоего автомобиля. Вопрос - нафейхуя сей фанатизм?

_________

//wfrr

anonymous
()

> No exceptions. Ever. I mean it. < Фанатизм в клинической стадии детектед.

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

_________

//wfrr

anonymous
()

И вообще, что скажете про статью?

всё правильно пишет

jtootf ★★★★★
()

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

dizza ★★★★★
()

>Обычно рекомендуют делать через сеттеры и геттеры

Вам надо чаще бывать на лоре :) Тут такого не рекомендуют. Присоединяясь к вышеотписавшимся, скажу что если вы _можете_ прикрутить геттер/сеттер к объекту, то это сигнал о том, что по вам нужен не такой объект.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Можно подробнее? Почему?

kovrik ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.