Генерация getter/setter с многострочным макросом stringfy

Недавно я видел классную игру в стиле c, которая автоматически генерирует сеттеры / геттеры для класса. Так вот о чем я говорю.

#define BOOL_VARIABLE(name)\
    void set##name(bool iValue)\
    {\
        // set the boolean
    }\ 
    const bool get##name() const\
    {\
       // get the boolean
    }

    BOOL_VARIABLE(AVariableName); // and calling them inside the class
  • а теперь подумайте об одном из них для всех переменных string/int/double и т. д.

Я знаю обо всех типах замечаний по избеганию использования макросов, но на самом деле я нахожу это довольно круто, потому что длинные строки getter / setter действительно меня беспокоят. Можете ли вы придумать что-нибудь, что может пойти не так с этим подходом.

2 ответа

Решение

Нет прямого преимущества по сравнению с прямым доступом членов. Почему он вообще должен существовать?

Как правило, тело метода доступа является хорошим местом для проверки входных данных и состояния this, но макрос не позволяет этого, поэтому он действительно не вносит "достаточно" для использования (IMO) в кодовой базе. В типичных программах также часто бывает достаточно вариаций, чтобы не оправдать их использование. Конечно, это не должен быть единственный способ объявить переменную и / или ее методы доступа.

Просто так нет путаницы: я за аксессоры и инкапсуляцию. Этот макрос просто блокирует вас от их более важных преимуществ.

Следующий * является лучшим вариантом (с типом также в качестве параметра). Тем не менее, я бы избегал реализации, чтобы в полной мере использовать методы доступа, как упомянуто @justin. Ваш компилятор будет генерировать ошибки, если вы забудете их реализовать.

* http://cppkid.wordpress.com/2008/09/04/getters-and-setters-for-a-class-using-a-macro/

#define GETSET(type, var) \         
    private: \         
       type _##var; \         
    public: \         
       type Get##var() \         
       {\         
          return _##var; \         
       }\
       void Set##var(type val) \         
       {\         
          _##var = val; \         
       }
Другие вопросы по тегам