Если мы говорим об ООП, то термин "передача сообщений" происходит от Smalltalk . В нескольких словах основные принципы Smalltalk:
- Объект является базовой единицей объектно-ориентированной системы.
- Объекты имеют свое собственное состояние .
- Объекты взаимодействуют, отправляя и получая сообщения .
Если вы заинтересованы в Smalltalk, взгляните на Pharo или Squeak .
Java / C # / C ++ и многие другие языки используют немного другой подход, вероятно, полученный из Simula . Вы вызываете метод вместо передачи сообщения.
Я думаю, что эти термины более или менее эквивалентны. Единственным интересным отличием может быть то, что передача сообщений (по крайней мере в Smalltalk) всегда зависит от динамической диспетчеризации и поздней привязки, тогда как в случае вызова метода можно использовать статическую диспетчеризацию и раннюю привязку. Например, C ++ (AFAIK) выполняет раннее связывание по умолчанию, пока где-то не появится ключевое слово «virtual» ...
В любом случае, независимо от того, какой формализм использует ваш язык программирования для связи между двумя объектами (передача сообщений или вызов метода), всегда считается хорошим стилем ООП, чтобы запретить прямой доступ к переменным экземпляра в терминологии Smalltalk или к членам данных в терминологии C ++ или какой бы термин не использовался в вашем языке программирования.
Smalltalk напрямую запрещает доступ к переменным экземпляра на уровне синтаксиса. Как я уже упоминал выше, объекты в программе Smalltalk могут взаимодействовать только путем передачи / получения сообщений. Многие другие языки разрешают доступ к переменным экземпляра на уровне синтаксиса, но это считается плохой практикой. Например, знаменитая книга Effective C ++ содержит соответствующую рекомендацию: Элемент 22: Объявление элементов данных личными.
Причины:
- синтаксическая согласованность (единственный способ для клиентов получить доступ к объекту через функции-члены или передачу сообщений);
- более точный контроль доступности элементов данных (вы можете реализовать отсутствие доступа, доступ только для чтения, доступ для чтения и записи и даже доступ только для записи);
- вы можете позже заменить элемент данных, не нарушая ваш публичный интерфейс.
Последний является наиболее важным. В этом суть инкапсуляции - скрытие информации на уровне класса.
Вопрос об инкапсуляции важнее, чем может показаться на первый взгляд. Если вы скрываете свои элементы данных от своих клиентов (то есть инкапсулируете их), вы можете гарантировать, что инварианты классов всегда поддерживаются, потому что только функции-члены могут влиять на них. Кроме того, вы оставляете за собой право изменить свои решения по реализации позже. Если вы не будете скрывать такие решения, вы скоро обнаружите, что даже если вы владеете исходным кодом для класса, ваша способность изменять что-либо публично крайне ограничена, поскольку слишком много клиентского кода будет нарушено. Публичный означает неинкапсулированный, и практически говоря, неинкапсулированный означает неизменяемый, особенно для классов, которые широко используются. Тем не менее, широко используемые классы больше всего нуждаются в инкапсуляции, потому что именно они могут извлечь наибольшую выгоду из возможности заменить одну реализацию лучшей.
(с) Скотт Мейерс, Эффективный C ++: 55 конкретных способов улучшить ваши программы и разработки (3-е издание)