Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Вопрос о стиле геттеров/сеттеров в C++ [дубликат]

#соглашения #ооп #cpp



    На данный вопрос уже ответили:
    
        
            Вопрос о стиле геттеров/сеттеров в C++ (и не только C++) [закрыт]
                
                    2 ответа
                
        
    
    
Что предпочитает уважаемое сообщество, и как аргументирует свои предпочтения:

классический вариант:

class TFoo
{
    int value;
public:
    int ValueGet() { return value; }
    void ValueSet(int v) { value = v; }
};

альтернатива, основанная на перегрузке функций:
class TFoo
{
    int value;
public:
    int Value() { return value; }
    void Value(int v) { value = v; }
};

интересен взгляд со стороны: что выглядит более логичным и корректным?    


Ответы

Ответ 1



в C#, C++, Java делаю одинаково: class TFoo { int _Value; public: int getValue() { return _Value; } void setValue(int v) { _Value = v; } }; средства генерации кода позволяют такое получить :-)

Ответ 2



Зачем нужны эти геттеры и сеттеры? Я конечно не буду предлагать сделать это свойство общедоступным, но можно сделать вот так: #include class TFoo { int val; public: int &value() { return value; } }; int main() { TFoo obj; obj.value() = 235; std::cout << obj.value(); return 0; }

Ответ 3



Дело вкуса. Первый вариант удобен при чтении кода, второй при написании кода. Но. class TFoo { int value; public: virtual int Value() { return value; } virtual void Value(int v) { value = v; } }; Код ниже уже не будет работать. Потому что потребуется переопределить второй метод Value(int v), либо using TFoo::Value в теле класса TBoo. сlass TBoo : public TFoo { .. virtual int Value() { /*Делаем нечто специальное*/ } .. }; ... TBoo *Boo = new TBoo; Boo->Value(5); ... Итог: второй способ возлагает некоторые трудности связаные с перегрузкой функций.

Ответ 4



Если это действительно свойство - т.е. произвольное количество вызозов не изменяет состояние класса - то int Value(), в противном случае - int GetValue(). Setter всегда именуется void SetValue(const ValueType &vt), уж больно выглядит как функция.

Ответ 5



Если уж говорить о свойствах, то разумеется лучше их смоделировать: class TFoo { int value; public: operator int () const { return value; } TFoo& operator = (int v) { value = v; return *this; } }; Соответственно, использование такого класса выглядит красиво и без всяких явных вызовов функций. TFoo foo; foo = 1; int a = foo;

Комментариев нет:

Отправить комментарий