Объявление атрибута класса: приватное против публичного - PullRequest
13 голосов
/ 03 апреля 2009

Каковы преимущества определения частного атрибута вместо открытого атрибута? Зачем мне дополнительная работа по созданию методов для доступа и изменения личных атрибутов, если я могу просто сделать их общедоступными?

Ответы [ 9 ]

11 голосов
/ 03 апреля 2009

В краткосрочной перспективе нет ничего, кроме как сделать пуристов ООП несчастными.

(я предполагаю, что вы имеете в виду предоставление свойств, которые иначе использовали бы методы получения / установки - очевидно, есть большая разница, если вы оставите ВСЕ свои атрибуты общедоступными).

В долгосрочной перспективе есть несколько действительно веских причин для этого.

Во-первых, это позволяет вам проверять входные данные в его источнике, вместо того, чтобы впоследствии отслеживать обратный источник с помощью комбинации аппаратных точек останова и черной магии.

1009 * Е.Г. *

void Foo::setWeight(float weight)
{
  ASSERTMSG(weight >= 0.0f && weight <= 1.0f, "Weights must fall in [0..1]");
  mWeight = weight;
}

Позволяет позже изменить поведение вашего объекта без необходимости рефакторинга клиентского кода.

* 1014 Е.Г. *

void Foo::setSomething(float thing)
{
  mThing = thing;
  // 2009/4/2: turns out we need to recalc a few things when this changes..
  ...
}
9 голосов
/ 03 апреля 2009

Если вы используете геттеры / сеттеры, вы можете выполнять логику при изменениях или при доступе. Вы можете проверить ввод, вместо того, чтобы предполагать, что это всегда правильно. Вы можете отслеживать, сколько раз значение получено.

Прежде всего, это хороший дизайн. Это дает вам, разработчику класса, больший контроль над тем, как он используется, и больше возможностей для предотвращения злоупотреблений, злоупотреблений или просто того, кто что-то делает неправильно.

2 голосов
/ 03 апреля 2009

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

Это обязывает вас поддерживать не только интерфейс, но и реализацию.

Кроме того, вы можете выполнять другие интеллектуальные функции, такие как проверка, контроль доступа, учет, если вы используете метод. Если вы сделаете атрибут общедоступным, у вас будет гораздо меньше контроля над тем, что клиент может делать с этим атрибутом

1 голос
/ 03 апреля 2009

Главным образом из-за ОО-концепции инкапсуляции. Используя private, вы инкапсулируете доступ к вашей переменной объекта, сохраняя контроль над состоянием объекта. Запрещение внешним объектам изменять статус вашего объекта, который вы не знаете.

Простым примером будет объект Pocket.

    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;
   }
}

Конечно, это простой пример. однако это показывает, как важно контролировать доступ к полям / атрибутам вашего класса. Представьте себе более сложный объект с гораздо более сложным контролем состояния. Инкапсуляция делает абстракцию и последовательность объекта лучше.

0 голосов
/ 24 августа 2010

Вам лучше в долгосрочной перспективе, если все атрибуты являются личными. Это включает в себя не использование геттеров. Если вы обращаетесь к атрибутам объектов, то вы нарушаете инкапсуляцию и вообще не выполняете ООП. В этот момент большая часть причин для создания класса была потрачена впустую. Зачем строить замок для защиты от злоумышленников, а затем оставить все двери открытыми? Или (с получателями) всегда приветствовать злоумышленников по запросу.

Показано, что методологии "закона деметрии" и "не говорите" уменьшают частоту ошибок в рабочем коде. Использование открытых атрибутов не сделает объектно-ориентированных пуристов несчастными, а просто отразит их с помощью вашего кода.

Скажите вашим объектам, что делать с их атрибутами, не спрашивайте их о значениях, манипулируйте ими и записывайте их обратно. Это все равно, что взять собаку на прогулку, а затем поднять ее ноги одну за другой, чтобы заставить ее двигаться.

Кстати, наоборот, поведение должно быть публичным. Любой метод, который кажется закрытым, на самом деле является неэкстрагированным методом другого класса. Извлеките этот класс и метод и посмотрите, как ваш дизайн упростится на ваших глазах.

0 голосов
/ 27 июля 2009

Обычно вы используете частные объявления для полей, которые вы хотите изолировать в логике вашей программы, ТОЛЬКО если считаете это необходимым.

Публичные объявления дают вам больше контроля над потоком вашей собственной программы; Вы можете изменить общедоступные поля, когда захотите. Вы мужчина в доме.

Итак, почему большинство людей спонтанно отвечают БОЛЬШИМ ДА на частные заявления?

Потому что:

  • Их учили делать это "просто так" в колледже. (самая разумная причина)
  • В конечном счете, они глупо и сразу предполагают, что вы либо создаете библиотеку кода, либо создаете программный компонент, чтобы другие могли его использовать, ИЛИ работаете над реализацией криптографии. ТОЛЬКО в этих случаях вы не уверены, что произойдет с вашими полями.

Итог удивительно "коммерческий" !! Если вы «продаете» его, то идите в приват, иначе делайте что хотите.

0 голосов
/ 03 апреля 2009

В C # это идиоматично. Это означает, что общедоступные поля будут удивительными, и заставят других людей потратить немного времени на понимание вашего кода.

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

0 голосов
/ 03 апреля 2009

Закрытый атрибут обеспечивает вам уровень защиты от пользователей вашего класса для этого атрибута. Если вы используете открытый атрибут, вам нужно будет добавить больше логики для проверки на недопустимые значения заранее, что может потребовать больше усилий, а также более затратных вычислений.

Открытые атрибуты также «загромождают» интерфейс. Чем меньше открытых атрибутов вы представите, тем «чище» и легче будет работать с вашим объектом. Наличие некоторых атрибутов приватных дает вам гибкость, обеспечивая простоту использования, которого в противном случае не было бы.

0 голосов
/ 03 апреля 2009

Если вы создаете метод доступа, вы отделяете реализацию от интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...