Генерация 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; \
}