Инкапсуляция – это объединение различных элементов в единый блок, обычно в целях безопасности. Обычно инкапсуляция происходит с использованием класса для объединения методов одного типа.
Инкапсулированный объект допускает внешнее взаимодействие только через интерфейс объекта. Все взаимодействие с объектом осуществляется посредством вызова методов, доступных в интерфейсе.
Инкапсуляция играет жизненно важную роль в объектно-ориентированном программировании; это обеспечивает большую безопасность программы, предоставляющей только необходимые данные для общедоступного интерфейса объекта. Это подвергает риску непреднамеренное вмешательство как можно меньшего количества данных.
Ruby реализует инкапсуляцию через:
— Частные ключевые слова
— Открытые ключевые слова.
Частный:
Область доступа для закрытого метода ограничена только областью действия класса. Это означает, что закрытый метод недоступен из-за пределов класса. Единственный способ получить доступ к данным в закрытом методе — это вызвать его из общедоступного метода.
Access Scope: Where in a program a varaible/method can be accessed. Public Method: Method exposed from a public interface. Private Method: Method available only within a class, cutting access from outside of the class.
В строке 1 конструктор определен в строках 3–4 для назначения аргументов name
и age
переменным экземпляра @name
и @age
. Эти переменные экземпляра недоступны из-за пределов класса _5, поскольку в общедоступном интерфейсе не определен метод получения.
Защищено:
Защищенный метод очень похож на частный метод, за исключением того, что защищенный метод может быть вызван только из класса, но не каким-либо несвязанным классом.
Например:
В приведенном выше коде introduce()
ссылается на методы получения и установки для переменных name
и age
. Методы доступа инициализируются ключевым словом protected
, что делает attr_reader :name, :age
защищенными методами.
Если теория верна, я должен иметь доступ к :name
и :age
в классах Pet
и Dog
, с NoMethodError
выброшенным, когда я вызываю sparky.name
и sparky.age
.
Этот пример кода демонстрирует поведение защищенных методов: когда я пытаюсь вызвать защищенный метод/состояние в его классе или производных классах, я могу. Однако к защищенному методу нельзя получить доступ за пределами его класса/производных классов, это вызовет ошибку.
Кроме того, защищенные методы позволяют производному классу получить доступ к поведению суперкласса, которое в противном случае было бы скрыто от общедоступного интерфейса. Это демонстрируется с помощью introduce()
доступа к защищенным методам получения. Хотя эти методы получения недоступны из общедоступного интерфейса, использование ключевого слова protected
позволяет программисту предоставить доступ к скрытому поведению для повышения производительности программы.
Инкапсуляция также описывает «объединение» данных в отдельные блоки. Это демонстрируется с помощью:
- Классы: инкапсуляция методов
- Методы: инкапсуляция логики
- Объекты: инкапсуляция состояния
Классы «объединяют» методы в отдельные блоки, методы «объединяют» логику в один блок, а объекты объединяют «состояние» в один блок. Доступом к данным в этих блоках можно управлять на основе интерфейса объекта.
Interface: Logical point where objects can communicate with one another.
Резюме:
Эта статья была написана, чтобы четко сформулировать концепции объектно-ориентированного программирования, в частности, инкапсуляции. Я надеюсь, что это помогло вам (читателям) в вашем путешествии по пути к овладению искусством ремесла разработки программного обеспечения.
Большое спасибо чрезвычайно услужливому и дружелюбному персоналу Launch School за то, что они сыграли такую большую роль в этом путешествии.