The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Что, по вашему мнению, представляет собой объект в ООП? Независимо от того, на каком языке вы программировали, вы, скорее всего, согласитесь с Брюсом Экелом, автором книги Thinking in Java, который сказал, что “каждый объект имеет состояние и операции, которые вы можете запросить у него”, или с Бенджамином Эвансом, автором книги Java in a Nutshell, который утверждает, что это “совокупность полей данных, которые содержат значения, и методов, которые оперируют этими значениями”. Однако, подождите… Что, если я скажу вам, что объект может не иметь “операций” и все же быть идеальным “эквивалентом квантов, из которых состоит Вселенная”, как предложил Дэвид Уэст в своей замечательной книге Object Thinking?
В EO, нашем экспериментальном языке программирования, мы попытались переопределить ООП и его объекты. В EO есть два типа вещей: атомы и объекты. Атом является наименьшим уровнем языкового примитива, который не может быть выражен другими атомами. Например, атомом является арифметическое сложение двух других объектов (оставайтесь со мной, это синтаксис EO, вы привыкнете):
В более традиционной Java-подобной инфиксной нотации этот код будет выглядеть так:
Атом - это add
, а его два конкретных аргумента - 5
и y
. Этот оператор создает новый атом, используя существующий и указывая его аргументы. Имя нового созданного атома - x
. Когда мы просим этот новый созданный атом сделать что-либо, он берет то, что есть в y
, добавляет 5
и начинает вести себя как их сумма. До этого момента он остается тихим. EO - это декларативный язык.
Атомы предоставляются EO-рантаймом. Например, add
, sub
, mul
и div
предназначены для арифметических операций; if
и for
- для разветвления и итерации; less
, and
, eq
, or
- для логических операций и так далее. Атомы могут напоминать функции низкого уровня с аргументами. Однако они не вычисляют результаты немедленно, а только по мере необходимости. Сказать add(5, file)
не приведет к немедленному чтению содержимого файла и добавлению к нему 5. Чтение файла произойдет только тогда, когда будет обработан созданный атом.
Затем, на основе этих атомов, программист может создавать объекты. Например, это объект, представляющий круг:
Первая строка создает “абстрактный” объект с именем circle
. Он абстрактный, потому что один из его атрибутов r
является “свободным”. Он не указан в этом объекте, и поэтому объект нельзя использовать как есть, его нужно скопировать с указанием значения r
. Например, это круг c
с радиусом 30.
Объект circle
имеет три атрибута. Первый из них - r
, который является свободным. Другие два - perimeter
и area
. Они “ограничены”, так как их атомы уже определены: mul
в обоих случаях. Чтобы получить площадь круга c
, мы делаем следующее:
Похоже на вызов метода, но на самом деле им не является. Мы не вызываем метод, мы просто берем объект area
из объекта c
. Он не создается для нас в момент, когда мы делаем c.area
! Он уже был там, ожидая, чтобы мы его взяли. Он был создан в тот момент, когда объект c
был создан.
Это разница между методами в Java и атрибутами в EO. В Java каждый метод - это процедура, которая выполняется сразу после вызова. Этот механизм вызова метода (или отправки сообщения, согласно ранним сторонникам ООП) был унаследован от функций C, которые, в свою очередь, мы унаследовали от процедур ALGOL, насколько я знаю. EO делает это по-другому. Здесь нет вызова метода. Он просто берет атрибуты из объектов и передает их другим объектам, пока управление не передается им и не опустится до уровня атомов.
В приведенном выше примере объект a
не является вычисленным числом. Это атом mul
, который инкапсулирует 3.14
и 30
(радиус). Результат вычисления еще неизвестен. Если мы ничего не делаем с a
, ЦП никогда не выполнит вычисление. Однако, если мы решим, скажем, вывести число на консоль, то вычисление произойдет:
Здесь атом sprintf
формирует строку, которая инкапсулирует три атрибута: текст, r
и a
. Кстати, возможно использовать как вертикальную, так и горизонтальную нотацию для создания объектов. Код выше можно написать так:
Атом stdout
инкапсулирует строку, созданную с помощью sprintf
, и остается безмолвным. Он ничего не печатает! Только когда кто-то в какой-то момент пытается “касаться” этого объекта, извлекая один из его атрибутов, атом stdout
выведет строку на консоль.
В stdout
, sprintf
, mul
и большинстве других атомов нет атрибутов, кроме одного: 𝜑. Любой объект или атом имеет этот определенный атрибут, также известный как “тело” объекта. Когда кто-то пытается обратиться к stdout.𝜑
, консоль видит строку.
Таким образом, у нас есть объекты, но у нас нет методов. Есть только атрибуты, представляющие другие объекты.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 13:50