Почему я не должен делать переменные общедоступными, но должен использовать публичные геттеры /сеттеры? [Дубликат]

    

У этого вопроса уже есть ответ:

    

Я смотрю обучающее видео на C ++. Речь идет о переменных внутри классов и утверждать, что переменные должны быть выделены как частные. В нем объясняется, что, если я хочу использовать их публично, я должен делать это косвенно через функции.

Почему? Какая разница? Похоже, результат тот же, за исключением того, что вместо одной строки кода у меня теперь есть 9 или 10 LOC, чтобы сделать то же самое.

Может ли кто-нибудь объяснить, почему преобразование частной переменной в класс в общедоступную часть класса, а не просто ее публикацию прямо из простого способа, является любым другим и более эффективным?

8 голосов | спросил Kendra Kaye Coffey 13 J000000Sunday14 2014, 02:51:51

2 ответа


10

Есть несколько причин использовать сеттеры и аксессоры, а не просто публиковать переменные.

1. Разделение проблем . Потребители класса не должны знать или даже заботиться о том, является ли то, к чему они обращаются, примитивной переменной или чем-то более сложным. Например, допустим, у меня был класс Car, и у этого автомобиля есть лошадиная сила. Вы можете получить мощность, вызвав метод getHorsepower (), и вы можете установить его с помощью setHorsepower (int power).

Теперь потребителю этого класса действительно все равно, что происходит под капотом, просто есть метод лошадиной силы. Но что, если на бэкэнде установка лошадиной силы означала изменение двигателя? Когда вы вызываете setHorsepower, он найдет механизм, который может обеспечить это, и вызовите частный метод setEngine (Engine newEngine), чтобы убедиться, что поведение автомобиля согласовано!

2. Поддержка кода . Когда вы настраиваете класс, может иметь смысл иметь только общедоступную переменную, но вы быстро обнаружите, что вам нужно выполнить проверку ошибок в переменной или вам нужно изменить эту переменную обновить другой объект. Если вы предоставили общедоступную переменную, вам нужно будет изменить все классы, которые ее используют, и затем использовать их: A) Внедрите все необходимые функции, например, проверку ошибок, или B) Измените их, чтобы использовать аксессор. Используя их, вы можете изменить все это в одном месте, вместо того, чтобы отслеживать все места, в которых используется эта переменная.

ответил Ampt 13 J000000Sunday14 2014, 02:56:48
5

У получателей и сеттеров плохой дизайн. Они лучше, чем общедоступные переменные, потому что они позволяют классу применять инварианты. Заимствовать пример Ampt setHorsepower лучше, чем переменная общедоступной лошадиной силы, потому что класс автомобиля может гарантировать, что лошадиная сила никогда не будет отрицательной с установщиком, но не может ничего гарантировать публичной переменной. Хотя это лучше, чем ничего, лучший дизайн будет иметь автомобильные экземпляры, отвечающие за их собственную лошадиную силу. Любой код, который держится с внутренним состоянием автомобиля, должен быть отдельно от класса автомобиля. Он не должен был удивляться и терялся где-то в другом месте.

ответил stonemetal 13 J000000Sunday14 2014, 04:48:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132