Enumeration В Lotusscript

  • Автор темы Автор темы Darkhan
  • Дата начала Дата начала
Скорее всего я чего не понимаю...

Смысл Enumeration в возможности передачи различного количества значений, например в одном случае передам 3 значения, в другом 33. Реализацию этого не увидел.

Если говорить о классах вообще, то:
Объект, содержащий в себе 3 объекта... - к чему эта статика? Разве что решение какой-то специфической задачи. Лучше уж список, содержащий разные объекты поведения.
safetyType, который просто умирает зайдя в конструктор EnumerationObject...
По моему, всё это скучно. Гораздо интереснее реализация фабрики объектов с помощью Execute и глобального списка; пример в OpenNTF.OpenDOM v2.0.
 
Я так понял,
Смысл Enumeration в возможности передачи различного количества значений, например в одном случае передам 3 значения, в другом 33
и
Объект, содержащий в себе 3 объекта... - к чему эта статика?
взаимосвязано? Так, нас никто не ограничивает.
Объекты разного поведения можно понасоздавать, унаследовавшись от EnumerationObject
safetyType, который просто умирает зайдя в конструктор EnumerationObject...
так ведь он "бездушный" псевдообъект - гарант неозможности создания инстансов объектов вне библиотеки
Гораздо интереснее реализация фабрики объектов с помощью Execute и глобального списка; пример в OpenNTF.OpenDOM v2.0.
это меня тоже интригует)))
 

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Иллюстрация (т.к. используется Variant) на примере списка</div></div><div class="sp-body"><div class="sp-content">
Код:
Public Class EnumerationList
Private lst List As Variant

Public Function add(tag As String, value As Variant) As EnumerationList
If IsObject(value) Then
Set lst(tag) = value
Else
lst(tag) = value
End If
Set add = Me
End Function
End Class

Public Function enumList() As EnumerationList
Set enumList = New EnumerationList()
End Function
Использование.

Пример 1:
Код:
Dim e As New EnumerationList()
Call e.add("aaa", 111).add("bbb", 222)
Пример 2:
Код:
Dim e As EnumerationList
'...
Set e = enumList().add("aaa", 111).add("bbb", 222).add("ccc", 333)
То же самое можно сделать и для массива.
 
VladSh, при всем уважении, в чем отличие данной интерпретации Enumeration от обычного List?
Не увидел следующих моментов:
-
Перечисляемый тип (сокращённо перечисле́ние, англ. enumeration, enumerated type) — в программировании тип данных, чьё множество значений представляет собой ограниченный список идентификаторов.
- считывание существующих(инициализированных) списков идентификаторов
 
Darkhan

Из статьи:
<!--shcode--><pre><code class='pas'>type Cardsuit = (clubs, diamonds, hearts, spades);[/CODE]
Из моего примера использования:
Код:
Set e = enumList().add("aaa", 111).add("bbb", 222).add("ccc", 333)
Если не брать во внимание ограничения языка, то задача реализована.

Ограниченность списка идентификаторов определяется программистом, в 1-м случае количеством значений, разделённых запятой, во 2-м - количеством add. Кстати add здесь даёт большую гибкость - можно добавлять данные в различных циклах, т.е. в одних случаях зависеть от граничного количества элементов, т.е. добавлять чётко определённое (For), в других - нет, т.е. определять логикой (Do).

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

Возникает вопрос об полной ограниченности, т.е. чтобы после инициализации объекта значениями невозможно было в него что-нибудь добавить, но, по моему, это какое-то странноватое требование. Как раз полезнее иметь динамику. Хотя может в каких-то случаях это и требуется (мне до сих пор не потребовалось :)).
Добавлено: и это решается - добавлением ещё одного класса, который не будет иметь методов add, и в который будет передаваться объект EnumerationList на этапе создания (New) либо в отдельный метод инициализации. Но опять же, смысла в этом не вижу.
 
VladSh, главным требованием для данного решения являлось выполнение следующей задачи (имхо, эталонная миссия enumeration ):
Фактически требовалось передавать в функцию значение из фиксированного набора( enumeration ). Городить case и проверять входной параметр внутри функции - не выход, т.к. компилятор все равно позволяет ошибиться в клиентском коде.
При помощи данной техники мы можем объявить нужное количество экземпляров класса и пользоваться ими как элементами перечисления: INVOICE_STATUS_BLOCKED , INVOICE_STATUS_APPROVED и т.д.( будучи уверенным, что вызвать функцию с неверным параметром клиенту не удастся )
 
и смысл прятать глобальный sFruit становится сомнительным
если уж используется ф-цию - глобальная переменная не нужна (Static вполне подходит)
Только сейчас понял, что имеется ввиду, подправил
Lazy initialization решил оставить
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!