powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Декларативный подход при разработке
25 сообщений из 42, страница 1 из 2
Декларативный подход при разработке
    #38921354
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
 set i = documents.Next("")
 
 while (i '= "") {
    set document = documents.GetAt(i)
 
    w document.toString(),!
 
    set i = documents.Next(i)
 }
  do $$$streams.on(documents).forEach($$$functions.println)Я понимаю, что это всего лишь реализация паттерна Visitor, но по-моему сугубо личному мнению, последний код читается лучше.

В Cache нет достаточно многих вещей, которые привычны разработчику, который привык писать на таких языках как Java / C++.

Можно было бы дополнить стандартные классы, чтобы можно было бы писать более лаконично.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921421
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя уже получилось реализовать данный подход ?
Еcли да, то покажи пример.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921459
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,

Так я и показываю. Вот он. Это реальный код.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921471
Шваров Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoder,
А define макросов где?
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921473
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шваров Евгений,

Я же говорю о концепте. О самой идее. Макросы это детали реализации. Реализация может быть хорошей или плохой.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921487
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#define streams   ##class(MonCache.Utils.Streams)
 
#define functions   ##class(MonCache.Utils.Functions).getInstance()Класс StreamsClassMethod getInstance() As Streams
{
    if ('$data(%StreamsInstance) || '$isobject(%StreamsInstance)) {
        set %StreamsInstance = ..%New()
    }
 
    return %StreamsInstance
}
Класс FunctionsClassMethod getInstance() As Functions
{
    if ('$data(%FunctionsInstance) || '$isobject(%FunctionsInstance)) {
        set %FunctionsInstance = ..%New()
    }
 
    return %FunctionsInstance
}
Класс FunctionClass MonCache.Utils.Function Extends %RegisteredObject [ Abstract ]
{
Method execute(value As MonCache.Types.MonCacheType) [ Abstract ] {}
}Класс PrintlnFunctionClass MonCache.Utils.PrintlnFunction Extends %RegisteredObject
{
Method execute(value As MonCache.Types.MonCacheType)
{
    w value.toString(), !
}
}
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921524
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавить бы еще анонимные функции, и было бы супер
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921593
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoder set i = documents.Next("")
 
 while (i '= "") {
    set document = documents.GetAt(i)
 
    w document.toString(),!
 
    set i = documents.Next(i)
 }
Попробуйте как-то так ( нужно отладить, писал по памяти )  set i = "" for { set doc = docs.GetNext(.i) Q:i=""  //Q:'$IsObject(doc)  
      w doc.toString() //d docs.%UnSwizzleAt(i)
  }
jxcoder ...код читается лучше Но и не забываем про отладку и поддержку "этого" средой разработки

DAiMorДобавить бы еще анонимные функции
Т.е класс-методы безымянного общедоступного класса ;)
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921605
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintТ.е класс-методы безымянного общедоступного класса ;) например возможность в forEach передать блок кода который выполнится для каждого элемента
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38921796
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,
doublefintПопробуйте как-то так ( нужно отладить, писал по памяти )  set i = "" for { set doc = docs.GetNext(.i) Q:i=""  //Q:'$IsObject(doc)  
      w doc.toString() //d docs.%UnSwizzleAt(i)
  }Это всё еще императивно.

поддержку "этого" средой разработки
эм.. Всегда думал, что поддержкой занимаются люди, а не среда разработки. И что это за "этого"?
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922157
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorпередать блок кода который выполнится для каждого элемента
блок кода - метод?

jxcoderЭто всё еще императивно
Мир несовершенен :(. То ли дело четыре класса для странного сценария использования
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922178
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

Ну а если бы эти классы были бы стандартными, то оставалось бы лишь сделать класс PrintlnFunction. Вообще, указанный мной код выявляет недостатки в Cache. Нет поддержки функций первого порядка.

На любимый вопрос "Зачем?", отвечу, что задачу можно решать разными методами и в зависимости от метода, выбранный способ приносит больше удобств и больше надёжности.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922395
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удобнее - в конечном итоге сводится к меньшим затратам (времени, усилий)
.forEach() - вроде как более удобная (лаконичная) форма итератора, но требует поддержки в языке функций, как объектов первого класса

К вашему примеру примените особенности среды ( объект из коллекции мог и не открыться, управление памятью ), стандартное de facto требование о тестировании ( напишите тест на код безымянной функции, которая объявлена внутри другой ), и сделайте это декларативным. Получится что-то сопоставимое
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922422
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoderНу а если бы эти классы были бы стандартными, то оставалось бы лишь сделать класс PrintlnFunction.Чтобы эти классы стали стандартными, нужно предложить их разработчикам InterSystems через WRC . Но сначала их придётся убедить, как Вы выразились, в большем удобстве и большей надёжности этих самых классов, поэтому хорошенько подготовьтесь.
jxcoderВообще, указанный мной код выявляет недостатки в Cache. Нет поддержки функций первого порядка.В Java/C++ тоже нет глобалов, транзакций, SQL и других плюшек, так привычных разработчикам на COS. Сравнивать ЯП общего назначения с ЯП СУБД - некорректно.
jxcoderзадачу можно решать разными методами и в зависимости от метода, выбранный способ приносит больше удобств и больше надёжности «Что русскому хорошо, то немцу - смерть» .

5493213 - здесь Вы найдёте мнения разных поколений разработчиков как "лучше" обходить дерево, а здесь - Соглашения о стандартах кодирования .
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922611
jxcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) в целях экономии своего времени, я не буду продолжать спорить с уважаемым сообществом. :)

Мир Вам!

Пишите так, как Вам удобно и на тех технологиях, которые Вам нравятся! :)
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38922793
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923487
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoder do $$$streams.on(documents).forEach($$$functions.println)Сама идея такого подхода далеко не нова и активно используется (по крайней мере на моём предыдущем месте работы :))
Пример примитивной реализации метода ForEach: ;=============================================================================
 ; * Примитивная реализация foreach *
 ; Принимает в качестве параметров имя глобала и имя процедуры, 
 ; которая будет выполнена для каждого узла глобала.
 ;=============================================================================
ForEach(Global,Routine)
 New nod
 I $Get(Global)="" Quit
 I $Get(Routine)="" Quit
 Set nod=""
 For  {
   S nod=$O(@Global@(nod))
   Q:nod=""
   Do @Routine
 }
 Quit
 ;=============================================================================Понятно, что вместо глобала, может быть что-то иное. Сам метод может иметь несколько иную реализацию, но сама суть такого подхода от этого не меняется.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923549
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoder,

Для меня остался несколько не понятен "тайный" смыл вот этого:Class MonCache.Utils.Function Extends %RegisteredObject [ Abstract ]Тогда как вот это:Class MonCache.Utils.PrintlnFunction Extends %RegisteredObject
все равно наследуется от %RegisteredObject. Или не в том смысл?
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923580
Шваров Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробное изложение идеи от ТС
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923693
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoderВ Cache нет достаточно многих вещей, которые привычны разработчику, который привык писать на таких языках как Java / C++.
Те "многие вещи" появились в тех языках не от хорошей жизни. Суть их сводится, как правило, к борьбе с ограничениями языков накладываемых из-за типизированности последних. В Mumps (прямым потомком которого есть COS, с его классовой надстройкой) изначально типов нет (точнее есть, но только один - всё есть строка), соответственно тут просто являются не нужными те "многие вещи" которые есть в типизированных языках. Конечно, с классами каше ситуация немного меняется, т.к. искусственно вводятся типы, но все равно не стоит забывать, что изначально всё есть строка. И прежде чем переносить реализацию какого-либо подхода из какого-либо типизированного языка, стоит подумать о целесообразности реализации точно такого же подхода в нетипизированном языке, для чего стоит вспомнить, для решения каких задач и преодоления каких ограничений в том языке, данный подход создавался.
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923733
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jxcoder
Код: javascript
1.
2.
3.
[2, 3, 5, 7, 11, 13, 17].forEach(function(i) {
    console.log(i);
});

Пожалуйста:Вариант №1Class test.CollectionWithForEach Extends %ListOfDataTypes
{

Method %OnNew(inlist) As %Status [ Private, ServerOnly = 1 ]
{
  d ..InsertList(inlist)
  q $$$OK
}

Method ForEach(Function)
{
  s className=$p(Function,":",1)
  s methodName=$p(Function,":",2)
  s key = ""
  f {
    s elem = ..GetNext(.key)
    q:key=""
    d $classmethod(className,methodName,elem)
  }
}

/// Этот метод может находиться где угодно
ClassMethod PrintLn(elem)
{
  w elem,!
}

}Пример вызова и результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
USER>d ##class(test.CollectionWithForEach).%New($lb(2, 3, 5, 7, 11, 13, 17)).ForEach("test.CollectionWithForEach:PrintLn")
2
3
5
7
11
13
17
Вариант №2Class test.CollectionWithForEach Extends %ListOfDataTypes
{

Method %OnNew(inlist) As %Status [ Private, ServerOnly = 1 ]
{
  d ..InsertList(inlist)
  q $$$OK
}

Method ForEach(Args...)
{
  q:+Args=0
  s Function=Args(1)
  s className=$p(Function,":",1)
  s methodName=$p(Function,":",2)
  s key = ""
  f {
    s Args(1) = ..GetNext(.key)
    q:key=""
    d $classmethod(className,methodName,.Args)
  }
}

ClassMethod PrintLn(Args...)
{
  s elem=Args(1,1)
  
  f i=2:1:Args(1)  s params=params_$lb(Args(1,i))
  w "Элемент = ",elem,", Доп-ые параметры = ",$lts(params),!
}

}Пример вызова и результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
USER>d ##class(test.CollectionWithForEach).%New($lb(2, 3, 5, 7, 11, 13, 17)).ForEach("test.CollectionWithForEach:PrintLn",123,"asd")
Элемент = 2, Доп-ые параметры = 123,asd
Элемент = 3, Доп-ые параметры = 123,asd
Элемент = 5, Доп-ые параметры = 123,asd
Элемент = 7, Доп-ые параметры = 123,asd
Элемент = 11, Доп-ые параметры = 123,asd
Элемент = 13, Доп-ые параметры = 123,asd
Элемент = 17, Доп-ые параметры = 123,asd

PS: немного доработав метод ForEach, можно добиться вызова не только метода, но и программы/подпрограммы/...
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38923816
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант №3Class test.CollectionWithForEach Extends %ListOfDataTypes
{

Method %OnNew(inlist) As %Status [ Private, ServerOnly = 1 ]
{
  d ..InsertList(inlist)
  q $$$OK
}

Method ForEach(Body)
{
  s key = ""
  f {
    s el = ..GetNext(.key)
    q:key=""
    x (Body,el)
  }
}

///  d ##class(test.CollectionWithForEach).Test()
ClassMethod Test()
{
  #define cmd ##continue
  "(el){"_ ##continue
  "w ""Элемент="",el,"" "" f i=1:1:el {w ""-""} "_ ##continue
  "w !,""======"",!}"
  
  w ""_$$$cmd,!
  
  d ..%New($lb(2, 3, 5, 7, 11, 13, 17)).ForEach($$$cmd)
  d ..%New($lb(2, 3, 5, 7, 11, 13, 17)).ForEach("(el) w el*el,!")
}

}Пример вызова и результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
USER>d ##class(test.CollectionWithForEach).Test()
(el){w "Элемент=",el," " f i=1:1:el {w "-"} w !,"======",!}
Элемент=2 --
======
Элемент=3 ---
======
Элемент=5 -----
======
Элемент=7 -------
======
Элемент=11 -----------
======
Элемент=13 -------------
======
Элемент=17 -----------------
======
4
9
25
49
121
169
289
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38924855
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гораздо сильнее раздражает ##class() - целых девять !!! символов. Каждый раз! 2015 год! Жизнь-боль ;(
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38924916
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintГораздо сильнее раздражает ##class() - целых девять !!! символов. Каждый раз! 2015 год! Жизнь-боль ;(Используйте Caché Basic .
...
Рейтинг: 0 / 0
Декларативный подход при разработке
    #38925100
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit, угу, плавали - знаем :( . Или появился аналог i%Property ?
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Декларативный подход при разработке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]