Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Get*/Set* отдельными методами или одним, какой вариант более православный? / 25 сообщений из 30, страница 1 из 2
20.10.2016, 13:22
    #39330580
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Приветствую, пишу портянку и всплыл вопрос, какой вариант на ваш взгляд православней и почему?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class A {
public:
    int  getVal() { return _val; }
    void setBal(int val) { _val = val; }
private:
    int _val;
}



или получение и установку переменной-члена класса объединить в одном методе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class A {
public:
    int val(int val=-1) { if(val > -1) return _val; else _val = val; }
private:
   int _val;

}


Или так только хипстеры с Ямайки пишут?
...
Рейтинг: 0 / 0
20.10.2016, 13:35
    #39330595
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
I dont knowИли так только хипстеры с Ямайки пишут?
Ага.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 14:02
    #39330642
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry Sibiryakov,

Просто подумалось, что реализация 2 в 1, будет как-то покомпактнее, если N переменных членов, то это будет 2*N методов, вот думаю, нормально ли это.
...
Рейтинг: 0 / 0
20.10.2016, 14:32
    #39330673
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
I dont knowреализация 2 в 1, будет как-то покомпактнее

1. Зависимости от магических констант.
2. Убиение алгоритма предсказания ветвлений.
3. Читаемость нулевая.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 14:33
    #39330674
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
I dont know,

Это как раз тот случай, когда можно макросом генерить аксессоры.
...
Рейтинг: 0 / 0
20.10.2016, 14:36
    #39330682
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Anatoly MoskovskyЭто как раз тот случай, когда можно макросом генерить аксессоры.

Скорее это случай когда они напрочь не нужны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 14:49
    #39330704
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry Sibiryakov,

Разобрался, по сути основная проблема второго способа, это частая неоднозначность, когда получить, а когда установить значение.
Например, сделаем метод

Код: plaintext
1.
int angle(int a=?) { } // какое "а" задать, чтобы однозначно было понятно, что надо вернуть угол, а не установить его.  


А читаемость - это уже вкусовые предпочтения программиста, оба варианта неплохо читаются и вполне понятны
Но всё равно спасибо за комментарии, убрал эти мысли из головы :)
...
Рейтинг: 0 / 0
20.10.2016, 15:01
    #39330724
locked
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
I dont know,

Используй перегрузку, Карл.
...
Рейтинг: 0 / 0
20.10.2016, 15:58
    #39330814
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry SibiryakovСкорее это случай когда они напрочь не нужны.
Необходимость аксессоров тут не рассматривается.
Но если они нужны, то зачем писать их руками?))
...
Рейтинг: 0 / 0
20.10.2016, 16:07
    #39330824
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Anatoly MoskovskyНо если они нужны, то зачем писать их руками?))

Если их можно написать не руками, то они точно не нужны. Ибо доводят саму идею до абсурда.
Что, впрочем, для Java, например, не является ничем новым: она изначально создавалась
таким способом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 17:09
    #39330893
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Код: plaintext
1.
2.
    int  getVal() const { return _val; }
}



Use ‘const’ as much as possible.

А в объединенном варианте константность использовать не получится.
...
Рейтинг: 0 / 0
20.10.2016, 18:29
    #39330971
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A {
public:
    int val(int val=-1) { 
       thread_local static thread_local_index = -1;
       if(val == -1) thread_local_index = val;
       return thread_local_index;
    }
private:

}


Два в одном необходимы только если используешь thread_local, т.к. из двух функций-геттеров ты его использовать не сможешь.
Членом класса его делать нельзя, а глобально - вообще лучше не делать.
...
Рейтинг: 0 / 0
20.10.2016, 18:47
    #39330990
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Вася УткинЧленом класса его делать нельзя
Кто запретил?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 18:54
    #39330997
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Вася Уткинесли используешь thread_local
thread_local вообще мутная тема, может конечно чего придумали, не пробовал, но родной виндовый TLS не всегда доступен. Если твой код в DLL то его нет, пришлось заменить на std::map[GetCurrentThreadId()]
...
Рейтинг: 0 / 0
20.10.2016, 23:05
    #39331112
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry SibiryakovВася УткинЧленом класса его делать нельзя
Кто запретил?

Баг репортович двухлетний запретил: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60702
- GCC 4.8.1 - 7.0 - Bug: http://melpon.org/wandbox/permlink/0v6fHVR4qujQiCyQ
- Clang 3.4 - Bug: http://melpon.org/wandbox/permlink/hpx2w5gqj9Nr57tM
- Clang 4.0 - Ok: http://melpon.org/wandbox/permlink/c83ps1hDIZeBz9je
- MSVC 2015 v140 - Ok.

А с геттером нормально в GCC 7.0: http://melpon.org/wandbox/permlink/plOdCiZeFsLgMTX5

Там ещё какие-то проблемы по моему были.
...
Рейтинг: 0 / 0
21.10.2016, 00:15
    #39331126
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry SibiryakovЕсли их можно написать не руками, то они точно не нужны. Ибо доводят саму идею до абсурда.
Нет. Назначение тривиальных аксессоров в том, чтобы когда понадобится нетривиальный, то просто переписывается аксессор, а не весь код который использует эту переменную.

Это называется инкапсуляция
...
Рейтинг: 0 / 0
21.10.2016, 00:57
    #39331132
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Anatoly MoskovskyDimitry SibiryakovЕсли их можно написать не руками, то они точно не нужны. Ибо доводят саму идею до абсурда.
Нет. Назначение тривиальных аксессоров в том, чтобы когда понадобится нетривиальный, то просто переписывается аксессор, а не весь код который использует эту переменную.

Это называется инкапсуляция А в остальных 98% случаев это называется дроч по учебнику.
...
Рейтинг: 0 / 0
21.10.2016, 06:38
    #39331159
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Anatoly MoskovskyЭто называется инкапсуляция о, я долго ждал эту тему. (+пятница)
у меня такой вопрос: нужна ли инкапсуляция 100%?
моё мнение: инкапсуляция нужна только там, где требуется валидировать входящие(иногда исходящие) значения, используя информацию самого объекта.
Иначе, класс превращается в монстра, у которого на 1 переменную 8 строчек кода. Читать и отлаживать такой код - убийство. А с интерфейсами - убийство в квадрате.
Надо придерживаться принципа минимализма, и вообще, касаемо инкапсуляции: чтение многих книжек и повторение вслух написанного там, не делает человека программистом и не отменяет надобности постоянного анализа и наличия головы.
Дальше я буду говорить ересь: принцип минимализма, если переменная 1 раз где-то на старте устанавливается, а потом только читается - надо сделать её открытой, у меня, например, это строковые идентификаторы, признаки, частные свойства, определяемые на старте, и, частично, вектора базовых функциональных объектов. Меня будут ругать, что "вооот, это может тогда кто угодно переписаааать...". Да, может. Это называется "выстрелить себе в ногу", да, но моё мнение: это всё упирается в умение пользоваться кодом и понимать архитектуру. Для меня гораздо удобнее напрямую обращаться к вектору в объекте, чем звать геттер, который будет: 1. усложнять читаемость, 2. добавлять (мелкие, но всё же) тормоза в код. Тормоза, с другой стороны, начинают сказываться, когда у вас в аксессорах довольно большая валидация, которая и не всегда нужна-то, но вы перестаёте её замечать, так как этот код скрыт. Тут даже не знаю, как быть, палка о двух концах... на ранних этапах разработки можно это сразу как-то исправить. Наверно.
Кроме того, наличие сеттеров точно так же даёт возможность пострелять себе по ноге. При этом проблема отлова кода, который меняет переменную, имеет одинаковую сложность что при сеттерах, что при прямом доступе. Разве что брек-поинт будет в одном месте. И я готов этим пожертвовать ради читаемости и простоты кода. Чем меньше кода, чем он более модульный - тем меньше таких проблем.
В той же отладке, если я где-то проверяю переменные объекта, в случае геттера, мне надо провалиться в геттер(это если там просто указатель или объект...) и там посмотреть значение переменной vs просто сразу её увидеть.
__declspec(property) меня тоже не устраивает, потому что это получается: 1. этажерка в хедере 2. дополнительная гетаница путаница в коде.

Ещё одна печаль с аксессорами: это их общепринятая форма написания: Get/Set(Entity), сначала глагол, потом свойство. Как так при повальном ООП получилось, янипанимаю!.. Т.о. когда, к примеру, intellisence тебе выдаёт список, или ты сам тыкаешь в комбо с методами: после первых трёх букв, тебе ещё там надо покопаться, или понабирать дальше. Кроме того, визуально ты сначала видишь первые буквы, потом вчитываешься в остальные. Искать по первым буквам удобнее, чем по средним. У себя во внутренних проектах я в именах использовал сначала центральную Entity, потом, если надо, идёт(ут) уточнение(я) в порядке иерархии, и в конце идёт глагол (Get/Set/Reset/Backup/....). Во-первых, искать быстро, во-вторых, в первые же миллисекунды видно, с чем я работаю, в третьих видно в intellisence, какие действия свойство для себя допускает (Get/Set/Reset/Backup/....), что при обычном написании, когда глагол идёт вначале, практически невозможно, во-первых, из-за порядка, во-вторых, из-за неравномерности, при поиске итемы с Get/Set занимают обычно процентов 60-80 всех методов, а у меня всё равномерно распределено по именам свойств. Но, увы, я такой один

Однако, как бы там ни было, если проект открытый, т.е. его(код) кто-то будет использовать, надо придерживаться общих правил и делать "нормальный" стандартный доступ к переменным класса через функции, даже просто потому что так удобнее понимать чужой код.

А как у вас с инкапсуляцией по пятницам?
...
Рейтинг: 0 / 0
21.10.2016, 10:25
    #39331264
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
CEMb,

Инкапсуляция по пятницам противопоказана... пятница же :)
...
Рейтинг: 0 / 0
21.10.2016, 11:29
    #39331344
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Anatoly MoskovskyНазначение тривиальных аксессоров в том, чтобы когда понадобится нетривиальный, то просто
переписывается аксессор, а не весь код который использует эту переменную.

Именно поэтому в борланде изобрели property.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.10.2016, 11:56
    #39331394
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
CEMbесли переменная 1 раз где-то на старте устанавливается, а потом только читается - надо сделать её константой!!! :)

Если вы пишите код, с которым будете работать только вы, значит вы пишете никому не нужный код :) Это так, мысль в сторону, ни к кому конкретно.

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

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

А голый доступ к членам класса, это большой соблазн написать алгоритм там, где он нужен "прямо сейчас". А это может привести к дублированию кода(ужас!) и/или к непоняткам при поддержке.
...
Рейтинг: 0 / 0
21.10.2016, 11:57
    #39331398
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
Dimitry SibiryakovИменно поэтому в борланде изобрели property.я вот тут подумал...
Если кому надо, можно просто написать шаблон(+макрос?), который будет неявно обрабатывать запись/чтение в параметр. Сейчас shared_ptr используем, например, и нормально. Просто добавится ещё один шаблон сверху.
Плюсы:
- Кода меньше: если обработчик не нужен, он не создаётся. Не надо заводить отдельные property
- "Инкапсуляция" искаробки.
Минусы:
- Посмотреть значение под дебагом будет сложно так же, как в случае с аксессорами
- Слегка теряется прозрачность кода

я уже даже так делал, где-то тут писал про систему параметров+GUI+события+сериализация. Но у меня там только не было пользовательских обработчиков -_-
...
Рейтинг: 0 / 0
21.10.2016, 12:16
    #39331424
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
alex_kконстантой!!! :)она читается из настроек
alex_kЕсли вы пишите код, с которым будете работать только вы, значит вы пишете никому не нужный код :) Это так, мысль в сторону, ни к кому конкретно.О_о
а я код потом компилю, и у меня получаются ехе-шники, которые используются другими людьми
alex_kУ класса может быть геттер без сеттера. В своих кишках класс будет копаться своими алгоритмами, другим до этого дела нет.да, но, imho, геттер, просто возвращающий значение, не нужен. Меня задалбывает страшно, когда надо просмотреть работу, например, одного условия, и приходится пройти по двум макросам и внутри их по пять геттеров, потому что шибко умные программисты сделали всё, как надо. Открыть сам объект и найти нужные значения по имени тоже не представляется простым, потому что:
1. иерархия
2. чёрдовы проперти со своими другими названиями
alex_kЕсли кто то реализует алгоритм, который работает с членами класса напрямую, этот алгоритм может быть реализован как метод класса. И, наверное, это будет нагляднее и понятнее?да, только так. Против этого я ничего и не говорил.
alex_kА голый доступ к членам класса, это большой соблазн написать алгоритм там, где он нужен "прямо сейчас". А это может привести к дублированию кода(ужас!) и/или к непоняткам при поддержкеИстинный программианин не должен соблазняться голым доступом для осуществления грешных помыслов


В общем, у меня нет проблем, чтобы использовать внутренние переменные классов в других частях кода только на get в большинстве случаев. Меньшинство, например: чисто информационные структуры, без функционала внутри класса, используемые только для передачи информации от блока к блоку.
И не использовать прямой доступ там, где это требует валидации внутри класса.
...
Рейтинг: 0 / 0
21.10.2016, 13:12
    #39331496
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get*/Set* отдельными методами или одним, какой вариант более православный?
CEMbИстинный программианин не должен соблазняться голым доступом для осуществления грешных помыслов
Все лгут ошибаются. Но компилятор реже всех :)
...
Рейтинг: 0 / 0
21.10.2016, 21:24
    #39331943
Get*/Set* отдельными методами или одним, какой вариант более православный?
alex_kCEMbИстинный программианин не должен соблазняться голым доступом для осуществления грешных помыслов
Все лгут ошибаются. Но компилятор реже всех :)Да компилятору вообще всё равно, лишь бы компилировалось. Дело в другом: быстрая и удобная разработка. Для людей. Это мы тут уже давно в двух темах обсуждаем. Я просто подкинул идею, как можно упростить процесс разработки. Есть риск ошибок, да, я уже писал про это, но этот риск, по сравнению с другими рисками, очень мал и быстро вычисляется и фиксается. И то, в данном случае мы больше обнаруживаем кривых программистов
Сплошная польза.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Get*/Set* отдельными методами или одним, какой вариант более православный? / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]