|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Добрый день! 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++. Можно было бы дополнить стандартные классы, чтобы можно было бы писать более лаконично. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 15:50 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
У тебя уже получилось реализовать данный подход ? Еcли да, то покажи пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 16:43 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
DAiMor, Так я и показываю. Вот он. Это реальный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 17:10 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoder, А define макросов где? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 17:24 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Шваров Евгений, Я же говорю о концепте. О самой идее. Макросы это детали реализации. Реализация может быть хорошей или плохой. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 17:26 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
#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(), ! } } ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 17:35 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Добавить бы еще анонимные функции, и было бы супер ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 18:05 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
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Добавить бы еще анонимные функции Т.е класс-методы безымянного общедоступного класса ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 19:47 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintТ.е класс-методы безымянного общедоступного класса ;) например возможность в forEach передать блок кода который выполнится для каждого элемента ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 20:00 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefint, doublefintПопробуйте как-то так ( нужно отладить, писал по памяти ) set i = "" for { set doc = docs.GetNext(.i) Q:i="" //Q:'$IsObject(doc) w doc.toString() //d docs.%UnSwizzleAt(i) }Это всё еще императивно. поддержку "этого" средой разработки эм.. Всегда думал, что поддержкой занимаются люди, а не среда разработки. И что это за "этого"? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 03:53 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
DAiMorпередать блок кода который выполнится для каждого элемента блок кода - метод? jxcoderЭто всё еще императивно Мир несовершенен :(. То ли дело четыре класса для странного сценария использования ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 11:51 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefint, Ну а если бы эти классы были бы стандартными, то оставалось бы лишь сделать класс PrintlnFunction. Вообще, указанный мной код выявляет недостатки в Cache. Нет поддержки функций первого порядка. На любимый вопрос "Зачем?", отвечу, что задачу можно решать разными методами и в зависимости от метода, выбранный способ приносит больше удобств и больше надёжности. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 12:00 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
удобнее - в конечном итоге сводится к меньшим затратам (времени, усилий) .forEach() - вроде как более удобная (лаконичная) форма итератора, но требует поддержки в языке функций, как объектов первого класса К вашему примеру примените особенности среды ( объект из коллекции мог и не открыться, управление памятью ), стандартное de facto требование о тестировании ( напишите тест на код безымянной функции, которая объявлена внутри другой ), и сделайте это декларативным. Получится что-то сопоставимое ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 13:42 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoderНу а если бы эти классы были бы стандартными, то оставалось бы лишь сделать класс PrintlnFunction.Чтобы эти классы стали стандартными, нужно предложить их разработчикам InterSystems через WRC . Но сначала их придётся убедить, как Вы выразились, в большем удобстве и большей надёжности этих самых классов, поэтому хорошенько подготовьтесь. jxcoderВообще, указанный мной код выявляет недостатки в Cache. Нет поддержки функций первого порядка.В Java/C++ тоже нет глобалов, транзакций, SQL и других плюшек, так привычных разработчикам на COS. Сравнивать ЯП общего назначения с ЯП СУБД - некорректно. jxcoderзадачу можно решать разными методами и в зависимости от метода, выбранный способ приносит больше удобств и больше надёжности «Что русскому хорошо, то немцу - смерть» . 5493213 - здесь Вы найдёте мнения разных поколений разработчиков как "лучше" обходить дерево, а здесь - Соглашения о стандартах кодирования . ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 13:49 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
:) в целях экономии своего времени, я не буду продолжать спорить с уважаемым сообществом. :) Мир Вам! Пишите так, как Вам удобно и на тех технологиях, которые Вам нравятся! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 15:08 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2015, 16:11 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
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 ;=============================================================================Понятно, что вместо глобала, может быть что-то иное. Сам метод может иметь несколько иную реализацию, но сама суть такого подхода от этого не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 10:41 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoder, Для меня остался несколько не понятен "тайный" смыл вот этого:Class MonCache.Utils.Function Extends %RegisteredObject [ Abstract ]Тогда как вот это:Class MonCache.Utils.PrintlnFunction Extends %RegisteredObject все равно наследуется от %RegisteredObject. Или не в том смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 11:16 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Подробное изложение идеи от ТС ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 11:31 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoderВ Cache нет достаточно многих вещей, которые привычны разработчику, который привык писать на таких языках как Java / C++. Те "многие вещи" появились в тех языках не от хорошей жизни. Суть их сводится, как правило, к борьбе с ограничениями языков накладываемых из-за типизированности последних. В Mumps (прямым потомком которого есть COS, с его классовой надстройкой) изначально типов нет (точнее есть, но только один - всё есть строка), соответственно тут просто являются не нужными те "многие вещи" которые есть в типизированных языках. Конечно, с классами каше ситуация немного меняется, т.к. искусственно вводятся типы, но все равно не стоит забывать, что изначально всё есть строка. И прежде чем переносить реализацию какого-либо подхода из какого-либо типизированного языка, стоит подумать о целесообразности реализации точно такого же подхода в нетипизированном языке, для чего стоит вспомнить, для решения каких задач и преодоления каких ограничений в том языке, данный подход создавался. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 12:26 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoder Код: javascript 1. 2. 3.
Пожалуйста:Вариант №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.
{ 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.
PS: немного доработав метод ForEach, можно добиться вызова не только метода, но и программы/подпрограммы/... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 12:56 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Вариант №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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2015, 14:09 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Гораздо сильнее раздражает ##class() - целых девять !!! символов. Каждый раз! 2015 год! Жизнь-боль ;( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2015, 12:33 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintГораздо сильнее раздражает ##class() - целых девять !!! символов. Каждый раз! 2015 год! Жизнь-боль ;(Используйте Caché Basic . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2015, 13:07 |
|
|
start [/forum/topic.php?fid=39&fpage=15&tid=1556678]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 164ms |
0 / 0 |