|
Декларативный подход при разработке
|
|||
---|---|---|---|
#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 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
servit, угу, плавали - знаем :( . Или появился аналог i%Property ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2015, 14:34 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintservit, угу, плавали - знаем :( . Или появился аналог i%Property ?Зато в Basic есть with . Можно использовать оба языка одновременно, например, COS там, где недостаточно Basic и наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2015, 14:55 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
servit, А может примеры кода сюда ? Интересные ведь получились вещи. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2015, 19:37 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Шваров Евгений, про "интересные" вещи, как-то напомнило [spoiler] очень похожее обсуждение: ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2015, 10:52 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Шваров Евгенийservit, А может примеры кода сюда ? Интересные ведь получились вещи. Выкладывайте . Я не против. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2015, 17:46 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
jxcoder, декларативно ли? #; использование $$$eachIn(list,..Print) #; или полная запись #; $$$eachIn(list,##class(laconic.foreach).Print) макрос#define eachIn( %coll, %meth ) ##continue s ##Unique(new)="" for { s ##Unique(old) = %coll.Next( ##Unique(old) ) Q:##Unique(old)="" ##continue d %meth( ##Unique(old), %coll.GetAt( ##Unique(old) ) ) ##continue } k ##Unique(old) всё вместеInclude eachIn /// пример использования макроса Class laconic.foreach [ Abstract ] { ClassMethod Example() { #;готовим коллекцию s list = ##class(%ListOfDataTypes).%New() d list.InsertList( $lfs("2,1,4,3,6,5,8,7,9") ) #; использование $$$eachIn(list,..Print) #; или полная запись #; $$$eachIn(list,##class(laconic.foreach).Print) } ClassMethod Print( i, el ) { w !, i, "-> ", el } } ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2015, 02:04 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
За время, проведенное за клавиатурой, пользуясь разными языками программирования, не раз был соблазн перетаскивать конструкции из языка в язык. Есть ли в этом смысл? Интересно, что обсуждаемый язык изначально создавался как лаконичный. И ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2015, 21:35 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
(нечайно отправил часть фразы). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2015, 21:36 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintГораздо сильнее раздражает ##class() - целых девять !!! символов. С вашей точки зрения, будет ли вот такой вариант лучше? Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 12:23 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintdoublefintГораздо сильнее раздражает ##class() - целых девять !!! символов. С вашей точки зрения, будет ли вот такой вариант лучше?Вопрос самому себе? Если Код: vbnet 1.
подсказчик кода предложит список классов как для ##class, то почему бы и нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 13:14 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Я голосую за s st = new User.Test ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 15:42 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
не рубящий в кашеЯ голосую за s st = new User.Testпо моему это уже перебор, если хочется такого, то вперед дорога к своему языку, я даже описывал как его сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 15:59 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
DAiMorне рубящий в кашеЯ голосую за s st = new User.Testпо моему это уже перебор, если хочется такого, то вперед дорога к своему языку, я даже описывал как его сделатьВидел кто-то предлагал язык MSH... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 16:02 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
Шваров ЕвгенийDAiMorпропущено... по моему это уже перебор, если хочется такого, то вперед дорога к своему языку, я даже описывал как его сделать Видел кто-то предлагал язык MSH...это вообще отдельная песня, пока правда дальше разговоров от того человека не было ничего ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 16:12 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 16:42 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
servit, но это же Сaché Basic ... http://geektimes.ru/post/249356/]Самыми отвратительными были признаны Salesforce, Visual Basic , ... Вариант с $(my.class) ISC могла бы реализовать в COS в режиме совместимости со старым кодом, имхо. Появились же $classname, $parameter, $classmethod ... С другой стороны, $zcvt( string,"JSON" ) пришлось ждать столько долгих лет ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 17:45 |
|
Декларативный подход при разработке
|
|||
---|---|---|---|
#18+
doublefintВариант с $(my.class) ISC могла бы ...В WRC написали о своём предложении? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2015, 08:10 |
|
|
start [/forum/topic.php?all=1&fid=39&tid=1556678]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 158ms |
0 / 0 |