Объявление атрибута класса: private vs public
В чем преимущества определения частного атрибута вместо публичного атрибута? Почему у меня должна быть дополнительная работа по созданию методов для доступа и изменения атрибутов privates, если я могу просто сделать их общедоступными?
Ответы
Ответ 1
Если вы используете геттеры/сеттеры, вы можете выполнять логику при изменении или доступе. Вы можете проверить ввод, а не предполагать, что он всегда правильный. Вы можете отслеживать, сколько раз это значение извлекается.
Больше всего, это хороший дизайн. Это дает вам, разработчику класса, больше контроля над его использованием и большей способностью предотвращать злоупотребления, злоупотребления или просто делать что-то неправильно.
Ответ 2
В краткосрочной перспективе нет, кроме того, что пуристы ООП недовольны.
(Я предполагаю, что вы имеете в виду выставлять свойства, которые в противном случае использовали бы геттеры/сеттеры - очевидно, существует большая разница, если вы оставите ВСЕ свои атрибуты общедоступными).
В долгосрочной перспективе есть несколько действительно веских причин для этого.
Во-первых, он позволяет вам проверять входные данные в своем источнике, а не на последующее отслеживание происхождения с помощью комбинации контрольных точек и черной магии.
например.
void Foo::setWeight(float weight)
{
ASSERTMSG(weight >= 0.0f && weight <= 1.0f, "Weights must fall in [0..1]");
mWeight = weight;
}
Он также позволяет вам позднее изменить поведение вашего объекта, не требуя рефакторирования клиентского кода.
например.
void Foo::setSomething(float thing)
{
mThing = thing;
// 2009/4/2: turns out we need to recalc a few things when this changes..
...
}
Ответ 3
Потому что вы всегда должны стремиться защищать реализацию от интерфейса. Если вы публикуете атрибут public, вы даете клиенту понять, как ваша реализация для этого атрибута.
Это связывает вас не только с интерфейсом, но и с реализацией.
Кроме того, вы можете использовать другие умные вещи, такие как проверка, контроль доступа, учет, если вы используете метод. Если вы публикуете атрибут public, у вас гораздо меньше контроля над тем, что клиент может сделать с этим атрибутом
Ответ 4
Главным образом из-за концепции инкапсуляции OO. Используя private, вы инкапсулируете доступ к вашей переменной объекта, сохраняя контроль над статусом объекта. Не разрешать внешним объектам изменять статус вашего объекта, о котором вы не знаете.
Простым примером может быть карманный объект.
class Pocket {
public int numberOfCoins = 10;
private boolean haveMoney = true;
public void giveOneCoin(){
if(stillHaveMoney()){
numberOfCoins--;
if(numberOfCoins=<0){
haveMoney=false;
}
}
}
public boolean stillHaveMoney(){
return haveMoney;
}
}
А теперь представьте себе следующий класс:
class PickPockets {
public void getSomeMoney(Pocket pocket){
pocket.numberOfCoins=0;
}
}
Конечно, это простой пример. однако это показывает, как важно контролировать доступ к вашим полям/атрибутам класса.
Представьте себе более сложный объект с гораздо более сложным контролем состояния. Инкапсуляция делает абстракцию и согласованность объекта лучше.
Ответ 5
Если вы создаете метод доступа, вы отделяете реализацию от интерфейса.
Ответ 6
Частный атрибут предоставляет вам уровень защиты от пользователей вашего класса для этого атрибута. Если вы используете общедоступный атрибут, вам нужно будет добавить больше логики для проверки недопустимых значений спереди, что может быть больше работы, а также более дорогостоящим с точки зрения затрат.
Публичные атрибуты также "загромождают" интерфейс. Чем меньше публичных атрибутов вы представляете, тем "более чистым" и легче будет работать ваш объект. Наличие некоторых атрибутов private дает вам гибкость, обеспечивая при этом простоту использования, которая в противном случае не была бы там.
Ответ 7
В С# он идиоматичен. Это означает, что публичные поля будут удивлять, а другим людям потребуется немного больше времени, чтобы понять ваш код.
Причина, по которой она идиоматична, связана с другими объяснениями, которые люди дают, но тот факт, что она идиоматична, означает, что вы должны предпочесть свойство над публичным полем, если нет веских причин использовать поле.
Ответ 8
Обычно вы должны использовать частные объявления для полей, которые вы хотите изолировать в своей логике программы, ТОЛЬКО, если считаете нужным.
Публичные объявления дают вам больше контроля над собственным потоком программ; вы можете изменять публичные поля, когда захотите. Ты мужчина в доме.
Итак, почему большинство людей спонтанно реагируют BIG YES на частные объявления?
Потому что:
- Их учили делать это "просто так" в колледже. (самая разумная причина)
- Они в конечном счете, глупо и сразу же предполагают, что вы либо создаете библиотеку кодов, создавая программный компонент для других, чтобы потреблять ИЛИ работать над некоторой реализацией криптографии. ТОЛЬКО в этих случаях вы не были бы уверены, что произойдет с вашими полями.
Нижняя линия удивительно "коммерческая"! Если вы "продаете" его, то идите в частном порядке, иначе делайте то, что вам нравится.
Ответ 9
Вам лучше в долгосрочной перспективе, если все атрибуты являются частными. Это включает в себя не использование геттеров. Если вы получаете доступ к атрибутам объектов, вы нарушаете инкапсуляцию и вообще не делаете ООП. В этот момент большая часть причин для создания класса была потрачена впустую. Зачем строить замок для защиты от злоумышленников, а затем оставить все двери открытыми? Или (с геттерами) всегда приветствуют злоумышленников по запросу.
Было показано, что методологии "Закона Деметры" и "Сообщить не спрашивать" уменьшают количество ошибок в производственном коде. Использование общедоступных атрибутов не сделает недостоверных объектно-ориентированных пуристов, они просто отгоняют их от использования вашего кода.
Расскажите своим объектам, что делать с их атрибутами, не спрашивайте их о значениях, не манипулируйте ими и не запишите их. Это было бы похоже на то, чтобы взять собаку на прогулку, а затем поднять ноги один за другим, чтобы заставить ее двигаться.
Кстати, наоборот, поведение должно быть общедоступным. Любой метод, который, похоже, должен быть приватным, на самом деле является неэкстрагированным методом другого класса. Извлеките этот класс и метод и посмотрите, как ваш дизайн упростится на ваших глазах.