Pull to refresh

Типы и классы

Reading time6 min
Views4.4K
1. Типы и классы. Объекты. Значения.

Определение типов и классов в языке Lada отличаются лишь ключевым словом. И типы, и классы могут иметь свойства, методы, события и даже операции (отношения или предикаты) можно определять и для класса и для типа. Иногда, даже трудно определить, что создавать тип или класс.

Пример 1. Создание класса Time.
Class Time
{
Dim Hour: Integer
Dim Minute: Integer
Dim Second: Integer
}
Пример 2. Создание типа Time.
Type Time
{
Dim Hour: Integer
Dim Minute: Integer
Dim Second: Integer
}
И в типах и в классах операторами Dim определяются свойства. И, так же как и в классах, мы можем говорить свойство Hour типа (или класса) Time. Но между ними есть существенное отличие в том, что типы создают объекты-значения, а классы создают так называемые ссылочные объекты, на которые можно ссылаться и каждый объект обладает индивидуальностью. Если для данных определенных как тип индивидуальность не важна, то для объектов создаваемых классом это принципиальный момент. Объект, создаваемый классом (например, Клиент) имеет свою индивидуальность и может присутствовать в единственном экземпляре (и соответствовать только одному реальному клиенту). Любой объект, обращающийся к объекту Клиент, делает это по ссылке или указателю. Таким образом, все объекты, обращающиеся к объекту Клиент, могут быть уверены, что имеют дело с одним объектом. Изменения, сделанные в объекте Клиент, будут доступны всем пользователям этого объекта.
Если мы хотим сравнить два объекта созданных классом, то должны сделать идентификацию самих объектов по ссылке или указателю. Как правило, копии ссылочных объектов не делаются. Разве что при необходимости репликации в сети или архивирования. Но в любом случае если копии созданы, то необходимо синхронизировать их обновление. Напротив сравнение двух объектов-значений происходит сравнением свойств этих объектов, даже если они фактически являются разными объектами и находятся в разных областях памяти.
Ценность объектов-значений именно в самом значении. Одновременно могут существовать сотни объектов с одинаковым значением времени и все они взаимозаменяемы. Изменять значение можно, но тогда это будет новый объект. Напротив изменение одного из свойств (например, изменение должности или зарплаты у объекта Клиент) в ссылочном объекте не создает новый (в смысле другой) объект. Изменяет свойства, но это по-прежнему тот, же самый объект.
Применение оператора Dim к типу создает объект-значение (выполнение всех операций необходимых для создания объекта). Применение оператора Dim к классу создает ссылку на объект-класс и никоим образом не выполняет никаких других действий по созданию собственно объекта. Однако надо же и создать объект, что б на него ссылаться. Объекты типы и классы можно отличать цветом. Вот изменяя его можно создавать объект оператором Dim для классов, и наоборот создавать ссылки на объекты значения. Такое тоже бывает нужно.


2. Операция отношение равенства. Присвоение.

Сравнение значений если они одного типа вопросов не вызывает. Совсем другая ситуация с объектами порожденными классами. Здесь мы говорим не о сравнении, а об идентификации объекта и определяется эта идентификация в общем случае не равенством значений всех или группы свойств, а в некоем внутреннем содержании объекта, которое зависит не только от самого объекта, но и нашего к нему отношении и его значимости в рассматриваемом контексте. Опуская философские детали, реализация данной концепция заключается в проверке ссылки на объект (идентификация объекта).
Итак, операция отношения равенства выполняется по-разному для значений и для ссылочных объектов. Для значений это проверка объекта на равенство свойств, а для ссылочных объектов это идентификация объекта.
Это же различие приводит к разному содержанию выполнения операции присваивания. Так объекты-типы при присваивании копируют значения. Т.е. значение, которое определяет идентификатор справа от знака равенства, полностью копируется в значение, которое определяет идентификатор слева от знака равенства. Совсем иная картина при выполнении операции присваивания ссылочных объектов, они копируют не объект, а ссылку на него. Поэтому изменения свойств в любом из объектов классов доступны всем пользователям этого объекта. Изменение значения в объектах-типах действуют только на изменяемый объект.
Еще одно следствие этой разницы проявляется в параметрах, передаваемых в процедуру по умолчанию. Для значений по умолчанию передается значение, а для ссылочных объектов передается в качестве параметра ссылка на объект. Но это можно изменить, манипулируя цветом можно передавать в процедуру непосредственно копию ссылочного объекта или ссылку на объект-значение.

3. Значения в лексическом анализе.

Так как объекты-типы имеют значения, то они выражаются каким-то значением десятичными, двоичными, в текстовой форме, цифрами через точку, префиксами, суффиксами и тому подобное. Но это явно влияет на лексический разбор, так как в результате лексического разбора мы получаем не лексему, а объект-значение. Получается так, что создавая новый тип, мы создаем новые значения, выражение которых в текстовой форме должно анализироваться как значение и значение соответствующего типа. Да еще и однозначно.
Определять лексику языка с определением типа было бы и сложно и ответственно, однако обратим внимание, что с наследованием свойств мы наследуем и правила лексического разбора. Приняв за разделитель по умолчанию знак точка “.” с определением типа Time в примере 2 можем создать следующее значение типа Time.

Пример 3. Присваивание значения типа Time.

Dim T: Time
T=2.30.45

Понятно, что так просто не обойтись и потребуется отличать типы значений с одинаковым количеством разделителей и здесь необходимо просто добавить суффиксы (или префиксы). Дальше транслятор в состоянии определить однозначность определения значения нового типа.
Необходимость определения значений (создание объектов-значений) во время лексического разбора (а он происходит во время набора текста) вызвана тем, что значения как объекты фактически существуют в тексте с того момента как только мы их набрали. И для сопровождения документов эти значения могут играть существенную роль. Так, например даты согласования, сроки окончания работ, суммы, комментарии и т.п. не просто набранный текст, а существенные характеристики документа, анализ которых может понадобиться не только во время создания документа, но и при его перемещении, архивации и в общем случае в любой момент. Напомним, что в системе Lada редактирование текста, программы, схемы, карт и планов делается в универсальной среде (язык меняется, среда остается.).

Пример 4. Создание типа Weight с суффиксом Т.

Type Weight
{
Dim Ton: Integer
Dim Kilogram: Integer
Dim Gram: Integer
T
}

Пример 5. Присваивание значения 253 килограмма, 26 грамм типа Weight.

Dim W: Weight = 0.253.26T

Неприятность здесь только одна. Так как определение типов влияет на лексический разбор, пользовательские типы должны быть определены в пространстве до трансляции и даже до лексического разбора.
Существенным моментом для лексического анализа служит наличие значения до точки и после. Обычно если перед точкой нет значения, то подразумевается 0. Аналогично и отсутствие значения за последней точкой говорит о том, что значение соответствующего свойства равно 0. Однако если мы наследуем тип Integer, то в лексическом разборе типа Integer не предусмотрено отсутствие цифр. Можно и тут что-то принять по умолчанию.
Определение типа Weight будет выглядеть следующим образом.

Пример 6. Создание типа Weight с суффиксом Т, и определением значений по умолчанию.

Type Weight
{
Dim Ton: Integer=0
Dim Kilogram: Integer=0
Dim Gram: Integer=0
T
}

Но можно определить и несколько синтаксисов для одного типа. Делается это группировкой вариантов синтаксиса с признаком Extract=1.
Пример 6. Создание типа Weight с разным синтаксисом.

Type Weight
{ Extract=1
{ Dim Ton: Integer=0
Dim Kilogram: Integer=0
Dim Gram: Integer=0
T
}
{
Dim Kilogram: Integer=0
Dim Gram: Integer=0
кг
}
{
Dim Gram: Integer=0
гр
}

}

Тогда в лексическом анализе будут опознаны как тип Weight следующие равные значения.

Пример 7. Равные значения типа Weight.

0.2.0Т, 2.0кг, .2.0Т, .2.Т, 2.кг, 2000гр

Последнее значение будет тоже 2 килограмма, но выполнение операций (в том числе и сравнение) с новым типом необходимо еще определить.

4. Агрегаты.

По аналогии с определением типов можно присваивать свойства и ссылочным объектам приняв за соглашение, что по умолчанию разделителем для значений свойств в классе служит точка с запятой “;”. Назовем такую конструкцию не значением, а агрегатом (Aggregate).
При всей похожести грамматики агрегата на определение значений определение классов не влияет на лексический анализ. Разбор значений (а возможно и объектов) и согласование типов происходит на следующих этапах трансляции. Во-первых, потому что выполнение каких-то действий со ссылочными объектами вопрос уже созданного документа. Ведь даже создание ссылочного объекта происходит не при наборе текста, а как минимум в результате трансляции, а как максимум в процессе выполнения программы. Во-вторых, в качестве элементов агрегата могут быть не только значения, но и объекты, класс которых до момента выполнения агрегата может быть не определен и вообще этот объект может быть не создан до момента выполнения.

Пример 6. Определение класса Location.

Class Location
{
Dim Top: Integer
Dim Left: Integer
}

Пример 7. Присваивание значений свойств Top и Left объекту класса Location агрегатом.

Dim L: Location =2; 2 ‘ Реализация присваиванием.

5. Тождество. Определяемые сравнения.

И для ссылочных объектов и для значений возникает необходимость проверить не равенство объектов, а равенство, каких-то свойств или группы свойств. Например, цвета, положения или размера объектов (иногда и разных классов). Эта операция называется тождество (знак «~»). Для этой операции необходимо только указать в круглых скобках список свойств, по которому проверяется тождество. Например, с тем же объектом Клиент иногда мы можем определять тождество по имени-фамилии-отчеству. В общем случае два разных объекта могут быть тождественны по росту, зарплате, а в редких случаях и по имени-фамилии-отчеству. Или два объекта мы можем сравнивать по цвету или положению.

Пример 3. Проверка тождества значений типа Time по свойству Hour.
Dim T1, T2: Time
...
If T1~T2 (Hour) Then
Tags:
Hubs:
Total votes 9: ↑3 and ↓6-3
Comments3

Articles