2013-07-15 3 views
0

Прежде чем спуститься вниз, позвольте мне объяснить мой вопрос. У меня есть небольшой опыт в проектировании архитектур и попытка прогресса. Когда я исправлял ошибку, я пришел к выводу, что нам нужно сделать наш метод private равным public, а не использовать его. Это был самый быстрый способ сделать мою работу, и исправлена ​​ошибка. Я пошел к своему руководителю и сказал это. После того, как я получил от него гримасу, мне объяснили, что каждый метод public является очень дорогим удовольствием. Мне сказали, что каждыйpublicметод должен поддерживаться на протяжении всего жизненного цикла проекта. И многое другое ..Почему мы должны избегать публичных методов? Преимущества инкапсуляции

Мне было интересно. В самом деле! Почему это было не так ясно, когда я смотрел в коде. Это было не так очевидно, когда я разработал свои собственные архитектуры. Я помню свои мысли об этом:

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

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

Мой вопрос:

Как вы можете объяснить себе, если метод действительно важен и достоин быть public? Есть ли контрпримеры для проверки? Как вы тренируетесь, чтобы сделать выбор private/public, не тратя часы на астрале?

+1

Целые книги написаны по нюансам дизайна и рефакторинга. Я не думаю, что SO подходит для вопроса об этой области. – millimoose

+2

Кроме того, этот вопрос не имеет смысла. Вы никогда не решаете «сделать этот метод общедоступным или приватным?», То, что вы пытаетесь достичь, - это минимальная связь между модулями кода - то есть какие услуги они предоставляют друг другу. Любые методы, соответствующие этим службам, обычно должны быть общедоступными или в интерфейсе. Лес/деревья и т. Д. – millimoose

+0

Частично, но вам может быть интересно узнать о ['internal'] (http://msdn.microsoft.com/en-us/library/7c5ka91b (v = vs.71). aspx) модификатор – Sayse

ответ

5

Я предлагаю вам прочитать на YAGNI http://c2.com/cgi/wiki?YouArentGonnaNeedIt

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

Моя любимая цитата

Совершенство достигается не тогда, когда нечего больше добавить, но когда нечего отнять.

- Антуан де Сент-Экзюпери французский писатель (1900 - 1944)

+1

+1 только для аптечной цитаты, также один из моих любимых. –

+0

Я получаю эту цитату, пробуренную мне в голову каждый раз, когда я играю в Civ 4 - по исследованию Engineering, я думаю. Также: «Никогда не доверяйте компьютеру, вы не можете выбросить окно». –

+0

YAGNI - BS. Это приводит к случайному прохождению через пространство возможных конструкций, поскольку оно отвергает саму возможность предвидения и планирования. –

2

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

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

2

Есть несколько вопросов, вы можете спросить себя о той области, в которой объект существует:

  • ли это член (метод, свойство и т. д.).) требуется для доступа к другим объектам?
  • Другие объекты любое предприятие Доступ к этому элементу?

Инкапсулирование часто упоминается как «скрытие данных» или «скрытие членов», которое, как я считаю, приводит к большому путанице. Неопытные разработчики по праву спросили: «Почему я хочу скрыть что-либо от остальной части моего кода? Если он есть, я должен буду использовать его. Это мой код в конце концов».

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

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

Например, рассмотрите объект с именем Customer. Вы бы разумно ожидать, некоторые атрибуты, которые описывают Customer, такие как:

  • Имя
  • Адрес
  • Телефон
  • Список заказов обработано
  • т.д.

Вы могли бы также ожидаются некоторые функциональные возможности:

  • Процесс оплаты
  • Держите все заказы
  • т.д.

Предположим, что у вас также есть некоторые технические соображения, в рамках этой Customer. Например, возможно, методы на объекте Customer напрямую обращаются к базе данных через объект соединения уровня класса. Должен ли этот объект связи быть общедоступным? Ну, в реальном мире у клиента нет связанного с ним подключения к базе данных. Итак, ясно, что нет, это не должно быть публично. Это проблема внутренней реализации, которая не является частью внешнего видимого интерфейса для Customer.

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

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

Смежные вопросы