Pull to refresh

Comments 31

В этом контексте есть интересный blog post: getters-and-setters-are-evil,
цитата оттуда:


Can a living organism have a setter? Can you "set" a ball to a dog? Not really. But that is exactly what the following piece of software is doing:
Dog dog = new Dog();
dog.setBall(new Ball());
How does that sound?


Can you get a ball from a dog? Well, you probably can, if she ate it and you're doing surgery. In that case, yes, we can "get" a ball from a dog. This is what I'm talking about:

Спасибо за статью)
Тот случай, когда читать материал по ссылкам из комментариев интереснее, чем статью над комментариями.

Нельзя отождествлять живые организмы и программные сущности.
Нельзя, обсуждая ООП, приводить аналогии из реального мира. Разве что только на этапе изучения ООП, с последующим обязательным проговариванием, что любая аналогия — ложна.
Проблемы джавистов… Нормальные люди на нормальных языках программирования просто создают свойство isCorrect и спокойно пишут что-то вроде obj.isCorrect = true :)
Проблемы джавистов…

В примере код на C++

Нормальные люди пишут на нормальных языках программирования, где by design нет ни классов, ни, прости господи, мутабельности :)
p.s. прошу на шутку (а это именно она) не обижаться, особенно питонистов и сопричастных :)
Нормальные люди пишут на нормальных языках программирования, где by design нет ни классов, ни, прости господи, мутабельности :)

Ага, и называют методы, переменные и все остальное так, что без поллитры не разберешься. Что делают функции с названием pipe, it, connect, put, dispatch?
Нет там переменных. И методов тоже нет :)
Да, в целом вы правы (все-таки 7 утра было, время уже было идти спать), но идею вы поняли.
А именовать функции понятно — это задача и проблема программиста, а не языка.
Какие языки — такие программисты.

по-моему, наоборот: какие программисты, такие и языки

Нормальность — признак большинства. Утверждение, что разработчиков на функциональных ЯП больше чем на императивных, вызывает вопросы.
Слишком толсто. Можно холивар разжечь если кто нибудь подумает что вы это всерьез.
У нас нет проблем, у насть есть JavaBeans стандарт. Он говорит про get/set в общем, и про возможность наличия is/set для булевых свойств (хотя можно и get/set).
А от языков это не зависит, JavaBean может быть скомпилирован из любого языка.
И эту конвенцию не было бы необходимости изобретать, если бы свойства таки были :)
[/толстота]
Зачем нужны свойства, если метод делает больше чем get/set то уже нужен отдельный метод.
В большинстве случаев имя метода должно начинаться с глаголов Is или Has.

А как обзывать переменную, которой присваивается результат выполнения данного метода?
А зачем переменная?
boolean hasElements() {
    return !isEmpty();
}
Если для нижележащего кода точно известно, что это значение не изменится и это значение используется несколько раз, то нашиша каждый раз вызывать какую-либо функцию? Менее затратно присвоить значение переменной.
Мне кажется get — это своеобразное fallback имя метода. Если можно другими словами более конкретно суть происходящего в методе, то лучше так и сделать. Например, getPrice — это явное получение поля, но hasCheck — выяснение, есть ли шах на доске, то есть по сути это действие подразумевает вычисление.
Если возвращается bool, То логичней использовать is, has, can, should. В остальных случаях getИмяСвойства().
По поводу set всё не так однозначно. С одной стороны должно быть setИмяСвойства(), но с другой setIsActive() звучит странновато. Думаю можно использовать глаголы для булевых свойств аля activate() -> выставляет is_active = true, verifyAddress() -> выставляет is_address_verified = true. Также строгое именование setИмяСвойства/getИмяСвойства частенько требует фреймворк например при создании entity.
Сравните:
setIsOldValue
setOldValue

Думаю, разница очевидна =)

Определенно напрашиваются разные типы.

Что мешает использовать для isActive глаголы toggle или change.

Тоже отличный вариант.
Имя метода получения бинарного атрибута должно быть предикатом (вопросом, на который можно ответить Да или Нет). В большинстве случаев имя метода должно начинаться с глаголов Is или Has.

В Ruby все просто: если это вопрос, на который можно ответить Да или Нет, то метод заканчивается знаком вопроса: obj.correct? — безо всяких is. Добавлять к предикатам is_/has_/does_ — моветон.

В моей практике getX и setX методы встречаются редко, в основном я использую establishX, obtainX потому что звучит мощнее.


Car car = new Car();
car.establishManufacturer("Porsche");
car.establishModelName("Cayenne");
int currentFuelAmount = car.obtainFuelAmount();
// ...

get и set выглядят как-то совсем непрезентабельно, мы тут серьезный софт для серьезных людей разрабатываем и нам не по статусу такие имена использовать.




Это всё шутки, конечно, я крайне редко вообще использую геттеры и сеттеры, потому что они в целом не вяжутся с философией класса, так как методы должны отражать его суть, но иногда когда подобный метот нужен, а адекватного названия придумать не выходит я действительно использую эти названия, потому что глаз их цепляет в силу их большей необычности в сравнении с обычными гетсетами. Да и в целом иногда забавно использовать всякие нетипичные слова в своем коде.

Sign up to leave a comment.