Есть несколько вопросов, вы можете спросить себя о той области, в которой объект существует:
- ли это член (метод, свойство и т. д.).) требуется для доступа к другим объектам?
- Другие объекты любое предприятие Доступ к этому элементу?
Инкапсулирование часто упоминается как «скрытие данных» или «скрытие членов», которое, как я считаю, приводит к большому путанице. Неопытные разработчики по праву спросили: «Почему я хочу скрыть что-либо от остальной части моего кода? Если он есть, я должен буду использовать его. Это мой код в конце концов».
И хотя я не совсем убежден в том, как ваш руководитель команды изложил свой ответ, у него есть очень хорошая точка. Когда у вас слишком много точек соединения между вашими объектами, вы получаете слишком много соединений. Объекты становятся все более тесно связанными и сливаются в один большой непобедимый беспорядок.
Четкое и строгое разделение проблем по всей архитектуре может значительно помочь предотвратить это. Когда вы разрабатываете свои объекты, подумайте о том, как выглядят их публичные интерфейсы. Какие бы внешне видимые атрибуты и функциональность они имели? Все, что было бы разумно ожидаемо как часть этой функциональности, не должно быть общедоступным.
Например, рассмотрите объект с именем Customer
. Вы бы разумно ожидать, некоторые атрибуты, которые описывают Customer
, такие как:
- Имя
- Адрес
- Телефон
- Список заказов обработано
- т.д.
Вы могли бы также ожидаются некоторые функциональные возможности:
- Процесс оплаты
- Держите все заказы
- т.д.
Предположим, что у вас также есть некоторые технические соображения, в рамках этой Customer
. Например, возможно, методы на объекте Customer
напрямую обращаются к базе данных через объект соединения уровня класса. Должен ли этот объект связи быть общедоступным? Ну, в реальном мире у клиента нет связанного с ним подключения к базе данных. Итак, ясно, что нет, это не должно быть публично. Это проблема внутренней реализации, которая не является частью внешнего видимого интерфейса для Customer
.
Это довольно очевидный пример, конечно, но иллюстрирует точку. Всякий раз, когда вы открываете публичный член, вы добавляете к видимому на виду «контракт» функциональности для этого объекта. Что делать, если вам нужно заменить этот объект другим, который удовлетворяет одному и тому же контракту? В приведенном выше примере предположим, что вы хотели создать версию системы, которая хранит данные в XML-файлах вместо базы данных. Если другие объекты за пределами Customer
используют соединение с общедоступной базой данных, это проблема. Вам придется изменить гораздо больше об общем дизайне, чем просто внутреннюю реализацию Customer
.
Как правило, обычно предпочтительнее выбирать самые строгие видимости участников и открывать их по мере необходимости.Объедините это руководство с подходом к размышлению о своих объектах с точки зрения того, какие объекты реального мира они представляют и какая функциональность будет видна на этих объектах, и вы должны быть в состоянии определить правильный курс действий для любой конкретной ситуации.
Целые книги написаны по нюансам дизайна и рефакторинга. Я не думаю, что SO подходит для вопроса об этой области. – millimoose
Кроме того, этот вопрос не имеет смысла. Вы никогда не решаете «сделать этот метод общедоступным или приватным?», То, что вы пытаетесь достичь, - это минимальная связь между модулями кода - то есть какие услуги они предоставляют друг другу. Любые методы, соответствующие этим службам, обычно должны быть общедоступными или в интерфейсе. Лес/деревья и т. Д. – millimoose
Частично, но вам может быть интересно узнать о ['internal'] (http://msdn.microsoft.com/en-us/library/7c5ka91b (v = vs.71). aspx) модификатор – Sayse