Objects Without Methods

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

sixnines availability badge   GitHub stars