|
![]() |
#1 |
Участник
|
Цитата:
2. Query плохо читаемо: для того, чтобы узнать, какие есть условия на поля надо активно возить мышкой и нажимать на плюсики. Даже для того, что убедится, что оно не отсортировано. Т.е. визуализация Query содержит много лишних деталей, но при жтом нужные детали запрятаны глубоко. Сорри, при наведении на датасурс часть структуры показывается... Последний раз редактировалось belugin; 13.12.2007 в 15:46. |
|
![]() |
#2 |
Участник
|
Не совсем. Уровней вложености много.
Цитата:
Сообщение от belugin
![]() 2. Query плохо читаемо: для того, чтобы узнать, какие есть условия на поля надо активно возить мышкой и нажимать на плюсики. Даже для того, что убедится, что оно не отсортировано. Т.е. визуализация Query содержит много лишних деталей, но при жтом нужные детали запрятаны глубоко.
В АОТ структура запроса отделена от кода. Следовательно: 1. заниматься оптимизацией и улучшизмами можно отдельно от кода (может отдельный человек) 2. апгрейд сильно упрощается, поскольку самым трудоемким является апгрейд кода. А количество кода при использовании Query из АОТ сильно уменьшается. Но что-то я ушел от темы. В общем, я согласен, что паттерн ExpressionBuilder позволяет сделать интересный код. Но у него все ж таки есть недостатки, связанные с глубиной. 1. как я уже говорил могут поехать перекрестные ссылки 2. по-моему, нельзя будет поставить точку останова на конкретный метод (дебаггер остановится на первом вызове, а затем в дебаггере нужно будет заходить в каждый парм-метод) 3. возникают очень тонкие и неявные побочные явления, связанные с порядком вызова методов и их аргументов 4. не дай бог какому-нибудь из методов вернуть значение Null. 5. непонятно как возвращать параметры В общем, все равно весь код в подобном стиле написать не получится. Значит будет дикая смесь нотаций: традиционной и через-точку. В общем, как руководитель проекта я не стал бы запрещать подобную запись, но и рекомендовать к использованию тоже бы не стал. |
|
![]() |
#3 |
Участник
|
Надо проверить....
Цитата:
1. заниматься оптимизацией и улучшизмами можно отдельно от кода (может отдельный человек)
Цитата:
2. апгрейд сильно упрощается, поскольку самым трудоемким является апгрейд кода. А количество кода при использовании Query из АОТ сильно уменьшается.
Я за то, чтобы не использовать Builder в модицикациях кода подверженного апгрейдам (имеется ввиду сторонний код). Цитата:
2. по-моему, нельзя будет поставить точку останова на конкретный метод (дебаггер остановится на первом вызове, а затем в дебаггере нужно будет заходить в каждый парм-метод)
Цитата:
3. возникают очень тонкие и неявные побочные явления, связанные с порядком вызова методов и их аргументов
Цитата:
4. не дай бог какому-нибудь из методов вернуть значение Null.
Цитата:
5. непонятно как возвращать параметры
Цитата:
В общем, все равно весь код в подобном стиле написать не получится.
Значит будет дикая смесь нотаций: традиционной и через-точку. |
|
![]() |
#4 |
Участник
|
Цитата:
Цитата:
Цитата:
X++: parm1(someComplexType _var) { // модифицируется и проверяется _var return this; } parm2(someComplexType _var) { // модифицируется и проверяется _var return this; } classvar.parm1(func1(var1)).parm2(func2(var1)); Если вдобавок внутри происходит модификация переменных, то... Не помню у кого, но видел в подписи выражение типа (i=1;i+=(i++)+(i++);cout<<i); запись через точку порождает примерно такие же головоломки ![]() Во всей Аксапте принято возвращать null или пустую запись, если что-то не получилось. ![]() Например, методу передали неправильное значение и он хочет сообщить вызывающему об ошибке. В нормальных языках он должен возбудить исключение с определенным типом. А здесь непонятно что. ![]() А... дык, это только для создания query... |
|
![]() |
#5 |
Участник
|
отвечю чуть ниже X++: parm1, parm2, func1, func2? func1, parm1, func2, parm2. Цитата:
Если вдобавок внутри происходит модификация переменных, то...
Не помню у кого, но видел в подписи выражение типа (i=1;i+=(i++)+(i++);cout<<i); запись через точку порождает примерно такие же головоломки ![]() Разве есть разница между X++: query.proc1(func1(x)); query.proc2(func2(x)); X++: query.proc1(func1(x)) .proc2(func2(x)); Цитата:
Например, методу передали неправильное значение и он хочет сообщить вызывающему об ошибке. В нормальных языках он должен возбудить исключение с определенным типом. А здесь непонятно что.
![]() Цитата:
А... дык, это только для создания query...
|
|
![]() |
#6 |
Участник
|
Цитата:
![]() порядок скорее зависит от конкретной реализации интерпретатора/компилятора. Это значит, что для 2.5, 3.0, 4.0, 5.0, а может быть и для каждого сервис-пака, надо проверять отдельно |
|
![]() |
#7 |
Участник
|
Цитата:
=> порядок вызова такой func1 (parm1 | func2) parm2 то есть единственная неопределенность - что раньше вызовется parm1 или func2. Если func2 не будет иметь побочных эффектов то смысл кода не изменится. |
|
Теги |
ax3.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|