Откуда я знаю? Всё зависит от целей. Возможно, нужен более сложный метод. Ведь на каждый случай не напасёшся методов: getNameWithGreetings, getFullNameWithGreetings, getFullNameWithBirthday, getBirthdayWithFullName, getNameWithThirdName и т.п. А сделать один метод: getInfoFormated('%greetings %second_name, %first_name'); или как-то так.
Только я не знаю как это связано с инкапсуляцией. Ведь реализация класса в любом случае скрыта от Вас. Хоть есть там этот метод, хоть нет.
Я не знаю что это за язык. Поэтому в данном случае я могу сказать, что формирование fullName от меня скрыто, потому что оператор + мог быть перегружен. Не инкапсулировано, потому что оператор это не метод класса, а просто скрыто. Но от чего зависит fullName от меня не скрыто.
У меня есть задача, получить fullName и у меня есть класс person, из которого я могу получить имя и фамилию. Ну… беру и получаю. Но при этом я не знаю откуда они там: из Базы, из файлов, из памяти, из кэша и т.п… И не знаю что происходит во время получения: срабатывает событие, что-то логируется, лениво загружается, инициализируется, отправляется что-то по почте и т.п…
Хочу сказать, что я соглашаюсь, что это косяк. Что есть достаточное количество функций, которые несогласованы между собой. Как порядок аргументов, так и названия. И мне непонятны порывы оправдать это. Да это так.
Да, Вы правы. В php тоже можно сделать. И, да, реализация инкапсулирована, потому что я как пользователь класса не знаю как реализована та или иная часть, а могу только предполагать. Ведь для этого такие возможности и были добавлены в языки, чтобы можно было изменить реализацию не изменяя интерфейс класса.
Если я вынужден смотреть как реализован класс, то это как раз говорит, что интерфейс продуман плохо.
С другой стороны класс никогда не будет инкапсулирован для разработчика этого класса потому что он будет знать его внутренности «с ног до головы». Так?
Прочтите, пожалуйста: «Скрывайте секреты (к вопросу о сокрытии информации)» главы «Компоненты проектирования: эвристические принципы» книги «Совершенный код» С. Макконнелл. А потом выскажете своё мнение по поводу прочитанного.
От кого сокрытие?
От пользователя экземпляра класса.
Если о реализации этих методов ничего не известно
Вот Вы пользователь. Как реализован метод Вы не знаете. Значит реализация от Вас скрыта. Значит всё-таки соблюдается инкапсуляция или нет?
Так же непонятен ответ с обфусцированными методами. Ведь реализация от пользователя скрыта, почему нарушена инкапсуляция?
Не могу ответить, зависит от логики.
Так… как тогда различить где скрывается реализация от пользователя и где нет. Ведь из Ваших ответов следует, что изменение логики (да, небольшое, но изменение) не влияет на сокрытие? А что тогда влияет?
И читали ли Вы раздел «Скрывайте секреты (к вопросу о сокрытии информации)» главы «Компоненты проектирования: эвристические принципы» книги «Совершенный код» С. Макконнелл?
Давайте попробуем прояснить непонятные мне моменты.
1.
Под инкапсуляцией я понимаю просто скрытие реализации.
От кого сокрытие?
2. Представим, что я разработчик ядра, а Вы разработчик модулей. Я даю Вам интерфейс некоторого класса, у которого только два метода: setName($name), getName(). Нарушена ли инкапсуляция?
3. Представим, что Вы разработчик класса, у которого только два метода: setName($name), getName(). Нарушена ли инкапсуляция в следующих случаях, если методы...?
а. просто устанавливают и получают значение защищённого свойства $name.
б. просто устанавливают и получают значение защищённого свойства $value.
в. просто устанавливают и получают значение защищённого свойства $name и выводят его значение на экран.
г. просто устанавливают и получают значение защищённого свойства $name и выводят его значение записывают в лог.
д. просто устанавливают и получают значение защищённого свойства $name, но перед установкой умножают на 100, а получаемое значение увеличивают в 100 раз.
е. просто устанавливают и получают значение защищённого свойства $name, но при этом содержат по 15 строчек комментариев о том как метод будет изменён в будущем.
ё. обфусцированы и просто устанавливают и получают значение защищённого свойства $name.
ж. обфусцированы, но логика в них сложнее, чем в предыдущем варианте.
Благодаря такой простой заметке люди, которые не смогли осилить важную статью, пересядут на другой язык где, в свою очередь, так же не будут читать статьи.
Т.е. получается, что Вы стараетесь для людей, которые не смогли осилить важную статью для языка, на котором они пишут? Вы уверены, что Вам именно это нужно?
habrahabr.ru/post/142140/ — здесь уже много сказано. В том числе и это. Автор (как и переводчик), очевидно, не в курсе того, что там изложено, и сейчас ему явилось откровение. И этот момент показывают, что они лишь поверхностно владеют проблемой.
Только я не знаю как это связано с инкапсуляцией. Ведь реализация класса в любом случае скрыта от Вас. Хоть есть там этот метод, хоть нет.
У меня есть задача, получить fullName и у меня есть класс person, из которого я могу получить имя и фамилию. Ну… беру и получаю. Но при этом я не знаю откуда они там: из Базы, из файлов, из памяти, из кэша и т.п… И не знаю что происходит во время получения: срабатывает событие, что-то логируется, лениво загружается, инициализируется, отправляется что-то по почте и т.п…
Тоже самое и с остальными методами.
Но меня как-то это не трогает.: )
Если я вынужден смотреть как реализован класс, то это как раз говорит, что интерфейс продуман плохо.
С другой стороны класс никогда не будет инкапсулирован для разработчика этого класса потому что он будет знать его внутренности «с ног до головы». Так?
Прочтите, пожалуйста: «Скрывайте секреты (к вопросу о сокрытии информации)» главы «Компоненты проектирования: эвристические принципы» книги «Совершенный код» С. Макконнелл. А потом выскажете своё мнение по поводу прочитанного.
Вот Вы пользователь. Как реализован метод Вы не знаете. Значит реализация от Вас скрыта. Значит всё-таки соблюдается инкапсуляция или нет?
Так же непонятен ответ с обфусцированными методами. Ведь реализация от пользователя скрыта, почему нарушена инкапсуляция?
Так… как тогда различить где скрывается реализация от пользователя и где нет. Ведь из Ваших ответов следует, что изменение логики (да, небольшое, но изменение) не влияет на сокрытие? А что тогда влияет?
И читали ли Вы раздел «Скрывайте секреты (к вопросу о сокрытии информации)» главы «Компоненты проектирования: эвристические принципы» книги «Совершенный код» С. Макконнелл?
1.
От кого сокрытие?
2. Представим, что я разработчик ядра, а Вы разработчик модулей. Я даю Вам интерфейс некоторого класса, у которого только два метода: setName($name), getName(). Нарушена ли инкапсуляция?
3. Представим, что Вы разработчик класса, у которого только два метода: setName($name), getName(). Нарушена ли инкапсуляция в следующих случаях, если методы...?
а. просто устанавливают и получают значение защищённого свойства $name.
б. просто устанавливают и получают значение защищённого свойства $value.
в. просто устанавливают и получают значение защищённого свойства $name и выводят его значение на экран.
г. просто устанавливают и получают значение защищённого свойства $name и выводят его значение записывают в лог.
д. просто устанавливают и получают значение защищённого свойства $name, но перед установкой умножают на 100, а получаемое значение увеличивают в 100 раз.
е. просто устанавливают и получают значение защищённого свойства $name, но при этом содержат по 15 строчек комментариев о том как метод будет изменён в будущем.
ё. обфусцированы и просто устанавливают и получают значение защищённого свойства $name.
ж. обфусцированы, но логика в них сложнее, чем в предыдущем варианте.