На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> get & set vs overloading
    Достаточно давно пишу одну библиотечку, с использованием OOP.
    Вот, натолкнулся на такие мысли: есть класс, аттрибуты, методы. Очевидно, чтобы не нарушить концепцию, аттрибуты необходимо сделать закрытыми, а пользователя (программиста) снабдить геттерами и сеттерами. Ну, пока всё очевидно :rolleyes:

    Итак, суть вопроса:

    ExpandedWrap disabled
      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.

    ExpandedWrap disabled
      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();


    Как удобнее и нагляднее для конечного пользователя?
      Первое.
      Второе - ф топку!
        Если надо чтобы быстро то первое, если как удобнее, то property на С++
          Оба способа никуда не годятся. Всё равно, что оставить открытое поле.
          Вообще, рекомендуют сначала думать об интерфейсе (о том что класс должен уметь делать), и только потом об внутренностях (о том, как он это делает). При такой очерёдности подобные вопросы не возникают, так как ещё нет атрибутов, к которым хочется предоставить доступ.
            amk, бред какой-то.
            Во-первых, способы эти куда-то да годятся. Во-вторых, оставить открытое поле - это совершенно другое. В-третьих, кто здесь говорит о конкретной реализации чего-либо?


            Sazabis, что-то в мне этот более "удобный" способ не особо показался удобным... :unsure:

            Добавлено
            Имеется в виду в контексте того, кто будет мутить такие проперти..
              Почему вариант с перегрузкой не годится
              ExpandedWrap disabled
                #ifdef GET
                    int a = 123;
                    #define b
                #else
                    #define a
                    int b = 123;
                #endif
                a = attrOne(b);
              :wacko: Ну и что при этом происходит? :D А если серьёзно, то ИМХО, для сопровождения, удобства чтения и модификации кода, требуется явность и чёткость в совершаемых действиях. Представь, что attrOne это действие, которое просят совершить твою библиотеку. :huh:
              - attr мне One!
              - И шо? Тебе установить или показать?
              - Мне установить! Ой... нет, показать!

              Не проще ли "get мне One!" :yes:
                Shaman, :lol:
                Да, в твоих даже словах есть логика :lol:
                Просто зачастую из-за этих get*, set* в некоторых выражения код намного удлинняется, не получается его так быстро набивать.. :ph34r:
                Может, вместо геттеров и сеттеров возвращать ссылку на аттрибут? :whistle:
                  Цитата deil @
                  Имеется в виду в контексте того, кто будет мутить такие проперти..

                  они уже написаны 8-) приинклюдь и все. Тебе только в конструкторе надо присвоить методы которые будет юзать проперти. А конечный класс вообще "чистеньким" выглядит ;)

                  Добавлено
                  Цитата Shaman @
                  - attr мне One!
                  - И шо? Тебе установить или показать?

                  в зависимости rvalue or lvalue запросил.
                    Цитата deil @
                    Может, вместо геттеров и сеттеров возвращать ссылку на аттрибут? :whistle:

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

                    А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый.
                      Цитата nvm, 14.10.2005, 21:48:54, 885787
                      А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый.
                      Не понял...

                      Цитата deil, 14.10.2005, 14:55:16, 885340
                      Просто зачастую из-за этих get*, set* в некоторых выражения код намного удлинняется, не получается его так быстро набивать..

                      Значит, что-то не так с кодом, который ты набиваешь ;) Возможно ты забыл ввести в класс с геттеросетамми какую-нить полезную ф-ность.
                        Shaman, хы, если бы :rolleyes:
                        Такое удлиннение кода замечается в арифметических выражениях с одним из аттрибутов класса.
                        Если он открыт - вопросов нет, легко пользуются всякие attrOne += <аццкая арифметическая формула с тем же самым аттрOne>.
                        А вот когда появляются геттеры-сеттеры, тот же += уже не использовать..
                          Да к стати, а с property'ми +=, -= тоже не работают.
                          Я так думаю, самой удобной в использовании реализацией свойств в C++ было бы нечто вроде функции, возвращающей прокси-класс, содержащий ссылку на хозяина. А в этом прокси-классе можно реализовать уже всё, что надо.
                            Ммм.. Тоже вариант..
                              Цитата amk @
                              Да к стати, а с property'ми +=, -= тоже не работают.

                              кто это сказал :blink: пропиши и будет.
                              Цитата amk @
                              прокси-класс, содержащий ссылку на хозяина.

                              дык, это же и есть property 8-)
                                Цитата Shaman @
                                Цитата nvm, 14.10.2005, 21:48:54, 885787
                                А по вопросу: если запись происходит много реже, чем чтение, то удобнее второй вариант, иначе - первый.
                                Не понял...

                                Соображение такое, что если get_ используется много чаще set_, то его можно подразумевать по-умолчанию.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0660 ]   [ 16 queries used ]   [ Generated: 26.04.24, 04:19 GMT ]