Публичный против частного? - PullRequest
3 голосов
/ 22 февраля 2012

Я не очень понимаю, почему, как правило, рекомендуется делать приватными переменные-члены и функции-члены.

Это делается для того, чтобы не допустить, чтобы люди занимались чем-то вроде организационного инструмента?

Ответы [ 7 ]

16 голосов
/ 22 февраля 2012

По сути, да, это для того, чтобы люди не совались с вещами.

Инкапсуляция (скрытие информации) - это искомый вами термин.

Публикуя только минимум информациидля внешнего мира вы можете изменять внутренние устройства столько, сколько хотите.

Например, допустим, вы реализуете свою телефонную книгу как массив записей и не скрываете этот факт.

Затем приходит кто-то и пишет код, который ищет или манипулирует вашим массивом без прохождения через ваш «нормальный» интерфейс.Это означает, что когда вы захотите начать использовать связанный список или какую-либо другую более эффективную структуру данных, их код будет поврежден, потому что он использует эту информацию.

И это ваша ошибка для публикацииэта информация, а не их информация об использовании: -)

Классическими примерами являются сеттеры и геттеры.Вы можете подумать, что вы можете просто выставить саму переменную температуры в классе, чтобы пользователь мог просто сделать:

Location here = new Location();
int currTemp = here.temp;

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

int currTemp = here.getTemp();

, и вы могли бы изменить реализацию этого метода так, как вам хочется.Единственное, что вам нужно сохранить - это API (имя функции, аргументы, тип возвращаемого значения и т. Д.).


Интересно, что дело не только в коде.Некоторые крупные компании будут перенимать свою документацию с такими фразами, как:

Эта техническая информация предназначена только для учебных целей и может измениться в будущих выпусках.

Это позволяет им предоставлять то, чтоклиент хочет (дополнительную информацию), но не привязывает его к поддержке на всю вечность.

6 голосов
/ 22 февраля 2012

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

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

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

2 голосов
/ 22 февраля 2012

Это для того, чтобы люди не баловались с вещами - но не с точки зрения безопасности.

Вместо этого он предназначен для того, чтобы пользователи вашего класса могли заботиться только о разделах public, предоставляя вам (автору) свободу изменять реализацию (private), не беспокоясь о нарушении чужого кода.

Например, большинство языков программирования, похоже, хранят String s как char[] (массив символов). Если по какой-то причине было обнаружено, что связанный список узлов (каждый из которых содержит один символ) работал лучше, внутренняя реализация, использующая массив, могла быть переключена, без (теоретически), нарушая любой код, используя String класс.

1 голос
/ 22 февраля 2012

Это для того, чтобы представить контракт с четким кодом любому (вам, кому-то еще), который использует ваш объект ... отдельно от того, «как его использовать» и от того, «как он работает».Это известно как Инкапсуляция .

Кстати, по крайней мере, в .NET (возможно, и на других платформах), для тех, кто действительно хочет получить доступ, не очень сложно получить доступ кчастные части объекта (в .NET, используя отражение).

0 голосов
/ 22 февраля 2012

Полезно знать, как объект, «сложенный вместе», может посмотреть это видео на YouTube

http://www.youtube.com/watch?v=RcZAkBVNYTA&list=PL3FEE93A664B3B2E7&index=11&feature=plpp_video

0 голосов
/ 22 февраля 2012

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

По моему личному мнению, я быотдавать предпочтение обнародованию методов.Но я бы предложил использовать шаблон Фасад.Проще говоря, у вас есть класс, который инкапсулирует сложные функции.Например, в .net Framework WebClient - это Фасад, который скрывает сложную логику запроса / ответа http.

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

0 голосов
/ 22 февраля 2012

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

теперь эта вещь определяется так:

public class Counter{
   private int count = 0;
   public void increment()
   { 
      count++;
   }
   public void decrement()
   { 
      count--;
   }
}

Как видите, для подсчета нет сеттеров / геттеров, потому что мы не хотим, чтобы пользователи (программисты) этого класса могли вызывать myCounter.setCount (100) или, что еще хуже, myCounter.Count - =10;потому что это не то, что делает эта штука, она повышается на единицу для всех, кто входит, и вниз, на всех, кто уходит.

...