ulidtko 16.03.2012 05:15

Яростно искореняю из своего стиля геттеры-сеттеры.

Вот в очередной раз наткнулся на недоэкспонированный интерфейс в своём коде: есть приватный мембер, который прямым и тупым образом инициализируется из конструктора, и нужно дать возможность получать значение этого мембера из инстанса. Но давать возможность менять его нельзя, это не несёт смысла для класса. Казалось бы, всего-то добавить геттер и не добавлять сеттер. НО НЕТ СУЧЕЧЬКА ТЫ У МЕНЯ БУДЕШЬ public: const float grid_step; БЛДЖАД!
Арргх. Йеее.

dev, C++
1. gelraen 16.03.2012 05:16

зачем ты их искореняешь?

2. ulidtkogelraen /1 16.03.2012 05:18

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

3. 0xd34df00d 16.03.2012 05:20 Jabiru

Посмотрю на те6я, когда вэлью сменится на алгоритм по расчету чего-ни6удь, кекеке.

4. gelraenulidtko /2 16.03.2012 05:23 imax

ну-ну... неосилил инкапсуляцию что-ли?

5. ulidtkoulidtko /2 16.03.2012 05:26

то есть, для этого есть property syntax. Когда именно в этих целях можно взять и прозрачно подцепить какую-нибудь логику в доступ к lvalue, не ломая клиентский код. Именно вот так легко и изящно, не превращая все мыслимые интерфейсы в унылое get()-set() говно.

6. 0xd34df00dulidtko /5 16.03.2012 05:27 Jabiru

Не осилил простейший темплейт на плюсцах для проперти-лайк синтаксиса? Так и скажи же.

7. gelraenulidtko /5 16.03.2012 05:29 imax

няш, сделай себе
#define PROPERTY(t,x) t get_ ## x() {return x;}; void set_ ## x(t v) {x = v;};

8. ulidtkogelraen /4 16.03.2012 05:30

лолшто, инкапсуляция ДОСТУПА К ДАННЫМ?
я хочу получать значение этой байды — которая является частью публичной интерфейса, потому что определяет часть состояния инстанса, потому что передаётся при инициализации в конструктор — нахуя мне его инкапсулировать?

9. ulidtko0xd34df00d /3 16.03.2012 05:31

и часто тебе такое в личкрафтах приходилось видеть? :3

10. ulidtko0xd34df00d /6 16.03.2012 05:32

оророророро, этот темплейт настолько простейший, что о проблемах с его реализацией Страуструпу лично задавал вопрос чувак, бравирующий 25-летней карьерой в плюсах. Ороророро.

11. gelraenulidtko /8 16.03.2012 05:32 imax

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

12. ulidtkogelraen /7 16.03.2012 05:33

http://нет.jpg.to/

13. ulidtkogelraen /11 16.03.2012 05:36

значит, заслуженно получу, изначально хуево задизайнив объектную модель.

14. ulidtkoulidtko /10 16.03.2012 05:37

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

15. ulidtkogelraen /7 16.03.2012 05:49

и проблема даже не в том, что мне лень писать бойлерплейтоссанину. Я это могу делать бесконечно; мне-то не привыкать жрать говноплюсплюс. В конце концов, можно впилить где-то в IDE стиппеты или что-то подобное.
Проблема в другом: необратимо уродуется клиентский код. Просто-напросто чуть меньше половины кода превращается в get()-set()-блевотину.
И это не моё личное отвращение, я своими глазами наблюдал, как чувак мержит в корпоративный транк код вида:
class Foo {
...
private:
Bar bar_;
public:
Bar& bar() { return bar_; }
};

... просто потому что отвратительно видеть все эти get()-set(). Но нахуя тогда вообще, спрашивается, прятать публичные данные под private? Потому что так канонично? Потому что в универе так рассказывали? Какая-то там инкапсуляция — это же святая святых ООП. Ни-ни!

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

16. ulidtko 19.03.2012 03:24

нашёл тред СУЕВЕРИЯ (минусы трём ответам): http://stackoverflow.com/questions/76077... и тред ДОБРА (от меня только плюсы): http://stackoverflow.com/questions/15964...

Во втором объясняют, что геттеры и сеттеры — это не ООП. Также предлагают проперти-подобный темплейт с operator= для тех самых редких случаев факапа с публичными полями.

17. ulidtko 19.03.2012 03:29

ещё один тред добра: http://stackoverflow.com/questions/36325...

18. ulidtko 19.03.2012 04:55

> Daily vote limit reached; vote again in 19 hours.
> (click on this box to dismiss)

бляяяяяяяяя~~~

Do you really want to delete ?