The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Как создаются объекты в вашем объектно-ориентированном языке? Давайте возьмем что-то классическое, например C++, Java или C#. Сначала вы определяете класс, а затем создаете его экземпляр. Первый шаг известен как абстракция, а второй - как инстанциация. В функциональном программировании существуют похожие операции: объявление функции является абстракцией, в то время как вызов ее с конкретными аргументами - применением. Вопрос в том, почему ООП нуждается в классах и объектах, тогда как ФП обходится только функциями?
Вот абстрактный объект на EO:
Название объекта - book
. Он имеет три атрибута: id
, db
и title
. Первые два атрибута являются “свободными”: они еще не привязаны к каким-либо объектам. Третий атрибут title
уже привязан к копии объекта db.query
. Объект book
является абстрактным, потому что у него есть свободные атрибуты - он не является достаточно конкретным, чтобы относиться к конкретной сущности в реальном мире.
Конструкция db.query
берет абстрактный объект query
из объекта, привязанного к атрибуту db
, и делает копию, указывая два аргумента: SQL-строку и id
. Процесс копирования абстрактного объекта называется “применением”, поскольку он очень похож на применение аргументов к функции в ФП.
Правильным способом использования абстрактного book
является создание его копии, указывая аргументы:
Здесь 42
является id
, mysql
является db
, а b
является новым объектом - копией book
. В 𝜑-исчислении, которое является основой для языка программирования EO, это будет записано в виде следующей формулы:
Для получения title
элемента b
и называния его t
, мы просто выполняем:
Мы также можем объединить все в одну строку:
Возможно применить некоторые аргументы к абстрактному объекту, оставив другие атрибуты свободными. Например, это создаст другой абстрактный объект, для которого все еще требуется указать id
, чтобы он стал закрытым объектом.
Суффикс :db
помогает компилятору понять, какой свободный атрибут должен быть привязан к объекту mysql
. Позже, x
может быть скопирован снова, и будет создан закрытый объект b
.
Несмотря на то, что синтаксис EO позволяет использовать book.title
, это приведет к ошибке компиляции: запрещено изменение свободных атрибутов абстрактного объекта или атрибутов, зависящих от других свободных атрибутов. Однако, предположим, мы добавляем новый атрибут print
к book
, чтобы вывести его id
в консоль, мы сделаем следующее:
Атрибут print
не требует привязки атрибута db
, так как он не использует его. Можно скопировать book
только с id
и затем вызвать print
(предполагается, что это происходит в интерактивной консоли EO).
Кстати, ты знаешь другие языки с абстрактными объектами или Эсперанто впервые представило такой дизайн?
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:24