ulidtko
16.03.2012 05:15
Яростно искореняю из своего стиля геттеры-сеттеры.
Вот в очередной раз наткнулся на недоэкспонированный интерфейс в своём коде: есть приватный мембер, который прямым и тупым образом инициализируется из конструктора, и нужно дать возможность получать значение этого мембера из инстанса. Но давать возможность менять его нельзя, это не несёт смысла для класса. Казалось бы, всего-то добавить геттер и не добавлять сеттер. НО НЕТ СУЧЕЧЬКА ТЫ У МЕНЯ БУДЕШЬ public: const float grid_step; БЛДЖАД!
Арргх. Йеее.
зачем ты их искореняешь?
затем что они говно и не нужны. Ссаная гора бессмысленного бойлерплейта ради призрачной возможности подставить в будущем подпорку под кривой дизайн.
Которой всё равно никто никогда не пользуется.
Посмотрю на те6я, когда вэлью сменится на алгоритм по расчету чего-ни6удь, кекеке.
ну-ну... неосилил инкапсуляцию что-ли?
то есть, для этого есть property syntax. Когда именно в этих целях можно взять и прозрачно подцепить какую-нибудь логику в доступ к lvalue, не ломая клиентский код. Именно вот так легко и изящно, не превращая все мыслимые интерфейсы в унылое get()-set() говно.
Не осилил простейший темплейт на плюсцах для проперти-лайк синтаксиса? Так и скажи же.
няш, сделай себе
#define PROPERTY(t,x) t get_ ## x() {return x;}; void set_ ## x(t v) {x = v;};
лолшто, инкапсуляция ДОСТУПА К ДАННЫМ?
я хочу получать значение этой байды — которая является частью публичной интерфейса, потому что определяет часть состояния инстанса, потому что передаётся при инициализации в конструктор — нахуя мне его инкапсулировать?
и часто тебе такое в личкрафтах приходилось видеть? :3
оророророро, этот темплейт настолько простейший, что о проблемах с его реализацией Страуструпу лично задавал вопрос чувак, бравирующий 25-летней карьерой в плюсах. Ороророро.
если у тебя переменная является частю интерфейса, то, конечно, всего этого не нужно. но ты потом можешь получить детскими граблями по яйцам.
http://нет.jpg.to/
значит, заслуженно получу, изначально хуево задизайнив объектную модель.
но что мне больше всего жжёт попку — это то что Страуструп, видимо, даже слышать не хочет о пропертях. Так кривился от их упоминаний, как от говна натурального.
и проблема даже не в том, что мне лень писать бойлерплейтоссанину. Я это могу делать бесконечно; мне-то не привыкать жрать говноплюсплюс. В конце концов, можно впилить где-то в IDE стиппеты или что-то подобное.
Проблема в другом: необратимо уродуется клиентский код. Просто-напросто чуть меньше половины кода превращается в get()-set()-блевотину.
И это не моё личное отвращение, я своими глазами наблюдал, как чувак мержит в корпоративный транк код вида:
class Foo {
...
private:
Bar bar_;
public:
Bar& bar() { return bar_; }
};
... просто потому что отвратительно видеть все эти get()-set(). Но нахуя тогда вообще, спрашивается, прятать публичные данные под private? Потому что так канонично? Потому что в универе так рассказывали? Какая-то там инкапсуляция — это же святая святых ООП. Ни-ни!
Вот в чём страуструп прав, так это в страхе за образование. Он считает, что в универах сейчас учат устаревшие, местами неправильные и откровенно вредные вещи о C++.
нашёл тред СУЕВЕРИЯ (минусы трём ответам): http://stackoverflow.com/questions/76077... и тред ДОБРА (от меня только плюсы): http://stackoverflow.com/questions/15964...
Во втором объясняют, что геттеры и сеттеры — это не ООП. Также предлагают проперти-подобный темплейт с operator= для тех самых редких случаев факапа с публичными полями.
ещё один тред добра: http://stackoverflow.com/questions/36325...
> Daily vote limit reached; vote again in 19 hours.
> (click on this box to dismiss)
бляяяяяяяяя~~~