LINUX.ORG.RU

но зачем?


0

1

сабж. надоело, не могу понять, почему пишут так:

int foo;
int getFoo() { return foo; } void setFoo(int bar) { foo = bar; }
еще большее недоумение вызывают свойства с явно заданными дефолтными акцессором и мутатором. ЛОР, объясни: зачем так делать и что это дает?


Очевидно, что bar private. В set можно добавить проверку значения, в get инициализацию, если объект еще не инициализирован.

four_str_sam
()
Ответ на: комментарий от Lincor

Так когда понадобится, будешь в 100500 местах менять. А тут всем все ясно(явно указываешь на инкапсуляцию), да и изменения каснутся только реализации класса.

anonymous
()

ООП головного мозга.

И если уж на то пошло, то пожалуйста

static int foo;

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

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

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

Пока ты будешь грепать более опытный товарищь украдёт твою невесту.

nanoolinux ★★★★
()

Не делай. Никто не заставляет.
Так обычно пишут «на вырост», чтобы иметь в будущем возможность навесить дополнительную логику или какие-то проверки.
Без этого потом пришлось бы бегать по исходникам и заменять тупые присваивания на функции.

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

В большинстве соглашусь. Но можно найти применение и для отложенной инициализации. Что в этом плохого, если есть соотвествующие геттер/сеттер и деструктор?

four_str_sam
()

Например это делает класс бинарное совместимым если ты решишь таки добавить код в аксессоры и мутаторы. А так релизнешь либу и сразу всем по всему миру переписывать и перекомпиливать. А если они юзеры третьего уровня и юзают другую проприетарную либу, которая юзает твою?

Плюс в Java есть такая штука как JavaBean, её много либ хочет

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от Stahl

но ведь это можно легко сделать автоматически, через sed, например. и зачем тогда явно указывают методы для свойств? пример:

int foo { get; set; }
или вот совсем маразм:
int foo { get { return foo; }; set; }

Lincor
() автор топика

Тут должны быть ссылки на статью Голуба про геттеры/сеттеры и нарушение инкапсуляции, и на предыдущий мегатред на ЛОРе по этому поводу.

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

легко сделать автоматически, через sed,

Да никто не будет c этой фигнёй возиться. Какой sed? Программисты в массе своей довольно умные люди. И если геттер пишется, значит надо что-то проверять. А почему геттер пустой? Потому что сейчас есть более важные проблемы.

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

вот когда это нужно, тогда и надо так делать. так нет же, пихают там, где не надо такого.

А когда понадобится, то придется рефакторить кучу кода или плодить костыли.

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

Отложеная инициализация добавляет лишнее, ненужное состояние объекта, которое только всё усложняет без надобности.

nanoolinux ★★★★
()

Инкапсуляция, один из столпов ООП
По большому счету, не нужно, но принято.
Например, чтобы какой-нибудь юзер твоей либы не взял указатель на foo, и не передал его куда-нибудь где его изменят, и начнется бардак и мясо

Progressive
()

зачем?

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

mm3 ★★★
()

повышает инкапсуляцию.

x0r ★★★★★
()

Кстати, а есть языки, в которых при присваивании можно неявно вызывать сеттер, а при использовании — геттер? В JS вон недавно нечто подобное появилось вроде. Не, ну присваивание, допустим, ещё можно через перегруз оператора накостылять, но использование...

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

В Dylan всегда вызываются сеттер и геттер. Выражение object.slot синтаксически идентично вызову slot(object), который вызывает метод-геттер. А выражение slot(object) := some-value синтаксически идентично slot-setter(object, some-value), то есть вызывает метод-сеттер. Присваивание := специальное только для локальных и глобальных переменных. Аксессоры генерируются автоматически.

ilammy ★★★
()

это тяжелое наследие жабо программеров у них там так принято, к каждой переменной писать доп геттер и сеттер, так код быстрее дуется с ней зп жабистов еще для увеличения кода они любят пихать везде к каждой переменной ключевое слово this-> тоесть еще +6 символов на мембер переменную

anonymous
()
Ответ на: комментарий от MiniRoboDancer

На С++ вполне можно, если вместо допустим int - выставлять наружу WrapperInt, у которого переопределить константный и не константный операторы пристаивания. Вызывается константный - используем getter, не константный - setter

ReanGD
()
Ответ на: зачем? от mm3

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

anonymous
()

ЛОР, объясни: зачем так делать и что это дает?

ООП во все поля.

no-such-file ★★★★★
()
Ответ на: комментарий от MiniRoboDancer

это называется «свойства». есть в Vala, C#, еще много где.

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