Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.37.169] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Достаточно давно пишу одну библиотечку, с использованием OOP.
Вот, натолкнулся на такие мысли: есть класс, аттрибуты, методы. Очевидно, чтобы не нарушить концепцию, аттрибуты необходимо сделать закрытыми, а пользователя (программиста) снабдить геттерами и сеттерами. Ну, пока всё очевидно Итак, суть вопроса: class SomeClass { public: SomeClass(); virtual ~SomeClass(); int getOne() { return attrOne_; } void setOne(int value) { attrOne_ = value; } protected: int attrOne_; } <..> SomeClass instance; instance.setOne(1); int b = instance.getOne(); vs. class SomeClass { public: SomeClass(); virtual ~SomeClass(); int attrOne() { return attrOne_; } void attrOne(int value) { attrOne_ = value; } protected: int attrOne_; } <..> SomeClass instance; instance.one(1); int b = instance.one(); Как удобнее и нагляднее для конечного пользователя? |
Сообщ.
#2
,
|
|
|
Первое.
Второе - ф топку! |
Сообщ.
#3
,
|
|
|
Если надо чтобы быстро то первое, если как удобнее, то property на С++
|
Сообщ.
#4
,
|
|
|
Оба способа никуда не годятся. Всё равно, что оставить открытое поле.
Вообще, рекомендуют сначала думать об интерфейсе (о том что класс должен уметь делать), и только потом об внутренностях (о том, как он это делает). При такой очерёдности подобные вопросы не возникают, так как ещё нет атрибутов, к которым хочется предоставить доступ. |
Сообщ.
#5
,
|
|
|
amk, бред какой-то.
Во-первых, способы эти куда-то да годятся. Во-вторых, оставить открытое поле - это совершенно другое. В-третьих, кто здесь говорит о конкретной реализации чего-либо? Sazabis, что-то в мне этот более "удобный" способ не особо показался удобным... Добавлено Имеется в виду в контексте того, кто будет мутить такие проперти.. |
Сообщ.
#6
,
|
|
|
Почему вариант с перегрузкой не годится
#ifdef GET int a = 123; #define b #else #define a int b = 123; #endif a = attrOne(b); - attr мне One! - И шо? Тебе установить или показать? - Мне установить! Ой... нет, показать! Не проще ли "get мне One!" |
Сообщ.
#7
,
|
|
|
Shaman,
Да, в твоих даже словах есть логика Просто зачастую из-за этих get*, set* в некоторых выражения код намного удлинняется, не получается его так быстро набивать.. Может, вместо геттеров и сеттеров возвращать ссылку на аттрибут? |
Сообщ.
#8
,
|
|
|
Цитата deil @ Имеется в виду в контексте того, кто будет мутить такие проперти.. они уже написаны приинклюдь и все. Тебе только в конструкторе надо присвоить методы которые будет юзать проперти. А конечный класс вообще "чистеньким" выглядит Добавлено Цитата Shaman @ - attr мне One! - И шо? Тебе установить или показать? в зависимости rvalue or lvalue запросил. |
Сообщ.
#9
,
|
|
|
Цитата deil @ Может, вместо геттеров и сеттеров возвращать ссылку на аттрибут? Тогда лучше не комплексовать предрассудками и сделать открытым, потому что открытое поле для использования заведомо удобнее всего. Другое дело, что так редко возможно сделать из-за необходимости контроля целостности. А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый. |
Сообщ.
#10
,
|
|
|
Цитата nvm, 14.10.2005, 21:48:54, 885787 Не понял...А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый. Цитата deil, 14.10.2005, 14:55:16, 885340 Просто зачастую из-за этих get*, set* в некоторых выражения код намного удлинняется, не получается его так быстро набивать.. Значит, что-то не так с кодом, который ты набиваешь Возможно ты забыл ввести в класс с геттеросетамми какую-нить полезную ф-ность. |
Сообщ.
#11
,
|
|
|
Shaman, хы, если бы
Такое удлиннение кода замечается в арифметических выражениях с одним из аттрибутов класса. Если он открыт - вопросов нет, легко пользуются всякие attrOne += <аццкая арифметическая формула с тем же самым аттрOne>. А вот когда появляются геттеры-сеттеры, тот же += уже не использовать.. |
Сообщ.
#12
,
|
|
|
Да к стати, а с property'ми +=, -= тоже не работают.
Я так думаю, самой удобной в использовании реализацией свойств в C++ было бы нечто вроде функции, возвращающей прокси-класс, содержащий ссылку на хозяина. А в этом прокси-классе можно реализовать уже всё, что надо. |
Сообщ.
#13
,
|
|
|
Ммм.. Тоже вариант..
|
Сообщ.
#14
,
|
|
|
Цитата amk @ Да к стати, а с property'ми +=, -= тоже не работают. кто это сказал пропиши и будет. Цитата amk @ прокси-класс, содержащий ссылку на хозяина. дык, это же и есть property |
Сообщ.
#15
,
|
|
|
Цитата Shaman @ Цитата nvm, 14.10.2005, 21:48:54, 885787 Не понял...А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый. Соображение такое, что если get_ используется много чаще set_, то его можно подразумевать по-умолчанию. |