Я из мира С# изначально, и я изучаю С++. Мне интересно, как получить и установить функции в С++. В С# их использование довольно популярно, и такие инструменты, как Visual Studio, способствуют использованию, делая их очень легкими и быстрыми в реализации. Однако это не похоже на мир С++.
Здесь код С# 2.0:
public class Foo
{
private string bar;
public string Bar
{
get { return bar; }
set { bar = value; }
}
}
Или, в С# 3.0:
public class Foo { get; set; }
Пусть люди скажут, ну в чем смысл? Почему бы просто не создать публичное поле, а затем сделать его потомством, если вам нужно; честно говоря, я на самом деле не уверен. Я просто делаю это из хорошей практики, потому что видел это много раз.
Теперь, потому что я так привык к этому, я чувствую, что должен перекладывать эту привычку на свой код на С++, но действительно ли это необходимо? Я не вижу его так часто, как с С#.
В любом случае, здесь С++ из того, что я собираю:
class Foo
{
public:
std::string GetBar() const; // Thanks for the tip Earwicker.
void SetBar(std::string bar);
private:
std::string bar;
}
const std::string Foo::GetBar()
{
return bar;
}
void Foo::SetBar(std::string bar)
{
// Also, I always wonder if using 'this->' is good practice.
this->bar = bar;
}
Теперь мне кажется, что много работы на ногах; учитывая использование инструментов Visual Studio, реализация С# потребует буквально секунд для реализации, а С++ взял меня намного дольше, чтобы напечатать - я считаю, что это не стоит усилий, особенно когда альтернатива длится 5 строк:
class Foo
{
public:
std::string Bar;
}
Из того, что я собираю, это преимущества:
- Вы можете изменить детали реализации для функций get и set, поэтому вместо возвращения частного поля вы можете вернуть что-то более интересное.
- Вы можете удалить get/set позже и сделать его только для чтения/записи (но для открытого интерфейса, кажется, это не хорошо).
И недостатки:
- Принимает возраст, чтобы напечатать, действительно ли это стоит усилий? Вообще говоря. В некоторых случаях преимущества приносят пользу, но я имею в виду, говоря о "хорошей практике", не так ли?
Ответ:
Почему я выбрал ответ с меньшим количеством голосов? Я был очень близок к выбору veefu answer; однако мое личное мнение (которое, по-видимому, противоречиво), заключается в том, что ответ на вопрос о поджаривании пудинга.
Ответ, который я выбрал, с другой стороны, кажется, спорит с обеих сторон; Я думаю, что геттеры и сеттеры являются злыми, если они используются чрезмерно (под этим я имею в виду, когда это не нужно и нарушало бизнес-модель), но почему бы нам не воспользоваться функцией GetBalance()
?
Конечно, это было бы гораздо более универсальным, чем PrintBalance()
; что, если я хочу показать это пользователю по-другому, чем того, что хотел меня класс? Теперь, в некотором смысле GetBalance()
может быть недостаточно релевантным, чтобы утверждать, что "геттеры и сеттеры хороши", потому что он (или, возможно, не должен) иметь сопутствующий сеттер, и, говоря о котором, функция, называемая SetBalance(float f)
может быть плохим (на мой взгляд), потому что это будет означать, что разработчик функции должен манипулировать учетной записью со стороны класса, что не очень хорошо.