AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.06.2017, 10:04   #1  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Я бы переформулировал проблему, затронутую ax_mct следующим образом: Мы занимаемся автоматизацией бизнес процессов. Заметная часть участников этих самых бизнес процессов - люди весьма среднего образования и интеллекта. Поэтому все слишком сложно спроектированные бизнес-процессы, с течением времени либо упрощаются либо умирают.
Поэтому для меня использование в X++ коде слишком большого числа паттернов говорит о том что бизнес-проблема изначально неправильно сформулирована. Если бизнес-процесс описан правильно, то и код не будет выглядеть как набор примеров из Gang Of Four. Классический пример - это архитектура Source Document/Distribution/Subledger. Изначально безумный набор бизнес-требований привел к еще более безумной архитектуре. Вероятно с точки зрения разработчиков, которые этот код писали - никакого overengineering не было. Это еще просто чудо что тот код, который эту фигню реализует, все еще можно понять и как-то описать. Но вот с точки зрения соответствия этого модуля прикладной реальности на внедрениях - имеется overengineering и еще и какой.
Мы ведь в конце концов не биржевой скальпер пишем, не программу игры в Го и не предсказатель погоды. Если у вас разработка без десятка паттернов не получается, попробуйте с постановщиком поговорить.Скорее всего, он просто какой-то бред в спецификации написал, или вы просто половины требований не поняли...

Последний раз редактировалось fed; 12.06.2017 в 11:01.
За это сообщение автора поблагодарили: ax_mct (5), sukhanchik (5), Logger (3), kvan (3).
Старый 12.06.2017, 11:35   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от fed Посмотреть сообщение
Классический пример - это архитектура Source Document/Distribution/Subledger. Изначально безумный набор бизнес-требований привел к еще более безумной архитектуре. Вероятно с точки зрения разработчиков, которые этот код писали - никакого overengineering не было. Это еще просто чудо что тот код, который эту фигню реализует, все еще можно понять и как-то описать. Но вот с точки зрения соответствия этого модуля прикладной реальности на внедрениях - имеется overengineering и еще и какой.
Отнюдь. Ничего безумного в требованиях нет. Предварительный просмотр проводок с журналов ГК был сделан по-простому Ушаковым еще 15 лет назад. Прикладной реальности реализация соответствует идеально, жаль лишь что эта реализация покрывает лишь где-то 30% мест, где есть документы и проводки.
Старый 12.06.2017, 11:53   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от EVGL Посмотреть сообщение
Отнюдь. Ничего безумного в требованиях нет. Предварительный просмотр проводок с журналов ГК был сделан по-простому Ушаковым еще 15 лет назад. Прикладной реальности реализация соответствует идеально, жаль лишь что эта реализация покрывает лишь где-то 30% мест, где есть документы и проводки.
Гм. Про предварительный просмотр я помню конечно. Проблема в том, что вместо предварительного просмотра сделали монстра, который позволяет отвязать проводки от экономического смысла операции. Кроме того - они там почему-то решили оторвать разноску в ГК от разноски по модулю, ввести понятие исходного документа (который вообще-то не само экономическое событие, а просто некий полуслучайный носитель информации об экономическом событии) и тд и тп.
Собственно из за бредовости привязки экономического события к документу и случилось что "только 30% мест" были покрыты.
Кроме того - возможность посмотреть планируемые проводки до разноски - это такая удобная фича. Она полезна конечно, но вряд ли настолько полезна чтобы сломать механизм разноски и отвязать разноску в ГК от разноски по модулю...
В итоге - я бы сказал что 85% багов в финансовом модуле DAX2012 случались как раз из за того что этот монстр как-то не очень хорошо интегрировался с остальными местами системы...
Старый 13.06.2017, 05:18   #4  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от fed Посмотреть сообщение
. Если бизнес-процесс описан правильно, то и код не будет выглядеть как набор примеров из Gang Of Four. Классический пример - это архитектура Source Document/Distribution/Subledger. Скорее всего, он просто какой-то бред в спецификации написал, или вы просто половины требований не поняли...
Ну кстати есть более простой пример. метод systemDateGet() объявили устаревшим, а вместо него сейчас везде используют конструкцию DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());.
т.е. чтобы получить текущую дату(можно сказать простейшая базовая задача) нужно по сути создать класс, передав туда другой класс
т.е. казалось бы - создай одну функцию - текущая дата пользователя, помести туда эту конструкцию из 2 классов и пусть все юзают ее(в одно слово), но видно это какая-то нерешаемая в архитектурном плане задача
Старый 13.06.2017, 07:51   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от trud Посмотреть сообщение
Ну кстати есть более простой пример. метод systemDateGet() объявили устаревшим, а вместо него сейчас везде используют конструкцию DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());.
т.е. чтобы получить текущую дату(можно сказать простейшая базовая задача) нужно по сути создать класс, передав туда другой класс
Где там "создать класс"? Тут два вызова, возращающих примитивы был один.

Цитата:
т.е. казалось бы - создай одну функцию - текущая дата пользователя, помести туда эту конструкцию из 2 классов и пусть все юзают ее(в одно слово), но видно это какая-то нерешаемая в архитектурном плане задача
Идея была в том, чтобы заставить разработчиков подумать, в какой временной зоне у них дата (что с учетом работы в облаке, например, или другой временной зоны получателя этой информации может быть нетривиально).
Старый 13.06.2017, 09:52   #6  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от belugin Посмотреть сообщение
Идея была в том, чтобы заставить разработчиков подумать, в какой временной зоне у них дата (что с учетом работы в облаке, например, или другой временной зоны получателя этой информации может быть нетривиально).
Так вот об этом то и речь. т.е. зачем нагружать разработчика бесполезными размышлениями о технических вещах. в пользовательской спецификации на разработку всегда будет одно понятие дата. она может быть на стороне сервера(это systemDateGet() и на стороне клиента today()). Зачем разработчику часовые пояса и их инициализация?
т.е. новую функцию создать то не проблема, но хотелось бы чтобы все шло из коробки(уже созданное, продуманное что когда и как использовать - т.е. собственно было четкое бест-практис правило - поскольку все разноски идут systemDateGet() то надо всегда использовать ее), а не заниматься созданием базовых библиотек

Последний раз редактировалось trud; 13.06.2017 в 10:05.
Старый 13.06.2017, 12:58   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от trud Посмотреть сообщение
бесполезными размышлениями о технических вещах. в пользовательской спецификации на разработку всегда будет одно понятие дата.
Это не техническая а логическая вешь. Предположим, что вы из Москвы пишете от руки платежное поручение банку в Нью Йорке - какая там должна быть дата платежа.
Старый 13.06.2017, 07:54   #8  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от trud Посмотреть сообщение
Ну кстати есть более простой пример. метод systemDateGet() объявили устаревшим, а вместо него сейчас везде используют конструкцию DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());.
т.е. чтобы получить текущую дату(можно сказать простейшая базовая задача) нужно по сути создать класс, передав туда другой класс
т.е. казалось бы - создай одну функцию - текущая дата пользователя, помести туда эту конструкцию из 2 классов и пусть все юзают ее(в одно слово), но видно это какая-то нерешаемая в архитектурном плане задача
В AX 2.5 не было понятия таймзоны. Все работали по времени AOS'а. Напомню, что по этой причине не рекомендовалось использовать функцию today(). Вам никто не мешает создать кастомную функцию Global::xx_today(), которая будет понятна, прозрачна, корректна и безошибочна. хх - префикс вашей компании-разработчика.
__________________
// no comments
За это сообщение автора поблагодарили: belugin (2).
Старый 13.06.2017, 09:14   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от fed Посмотреть сообщение
Поэтому для меня использование в X++ коде слишком большого числа паттернов говорит о том что бизнес-проблема изначально неправильно сформулирована. Если бизнес-процесс описан правильно, то и код не будет выглядеть как набор примеров из Gang Of Four.
Хотелось бы обоснование того, что паттерны это сложно. По моему опыту есть более и менее простые. И некоторые паттерны (типа "фасад") наоборот делают код проще. И еще, если их не знать они все равно будут, просто вразнобой и под несогласованными названиями.

Цитата:
Классический пример - это архитектура Source Document/Distribution/Subledger. Изначально безумный набор бизнес-требований привел к еще более безумной архитектуре.
Тут наверное интересно было бы открыть свою тему про сабледжеры (можно сделать рефакторинг ExtractTopic и перенести сообщения fed ). Я вижу своей программисткой кочки там скорее попытку обобщить логику финансовой разноски. Дополнительных требований там не так много.
Старый 13.06.2017, 09:28   #10  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от belugin Посмотреть сообщение
Хотелось бы обоснование того, что паттерны это сложно. По моему опыту есть более и менее простые. И некоторые паттерны (типа "фасад") наоборот делают код проще. И еще, если их не знать они все равно будут, просто вразнобой и под несогласованными названиями.
Речь строго говоря не о паттернах, а о том что в бизнес-автоматизации вообще не так уж много сложных алгоритмов. И если тебе не удается алгоритм, грубо говоря, в рамках C++ 1.0 относительно наглядно выразить, скорее речь идет о ситуации неправильно сформулированной спецификации. Просто паттерны в большинстве случаев просто позволяют несколько повысить уровень абстракции и за счет этого более наглядно и обозримо сформулировать сложные алгоритмы, которые на уровне C++ 1.0 наглядно не формируются. Но - как я уже сказал - в бизнес-автоматизации сложных алгоритмов не бывает, в противном случае - они бы не смогли бы быть реализованы как бизнес-процессы.

Пожалуй единственное место в Аксапте, которое, на мой взгляд, просится на переписывание на интерфейсы, фабрики, и тд и тп - это сводное планирование. Там как раз достаточно простой и наглядный общий алгоритм теряется за сотнями специальных случаев. Если бы его создатели смогли его как-то растащить на множество более простых сущностей, алгоритм был бы более читаем и расширяем.

P.S. Да - можно дискуссию про subledger вытащить куда-нить еще...
P.P.S. Еще раз сформулирую - паттерны это не хорошо и не плохо. Паттерны позволяют скрыть сложности реализации и позволяют более наглядно формулировать сложные алгоритмы. Но в большей части бизнес-автоматизации сложных алгоритмов просто не бывает. Поэтому необходимость слишком частого использования паттернов сигнализирует о неправильно постановке задачи. В общем - паттерны - это не болезнь, а симптом...

Последний раз редактировалось fed; 13.06.2017 в 09:55.
Старый 13.06.2017, 12:46   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от fed Посмотреть сообщение
Просто паттерны в большинстве случаев просто позволяют несколько повысить уровень абстракции и за счет этого более наглядно и обозримо сформулировать сложные алгоритмы, которые на уровне C++ 1.0 наглядно не формируются. Но - как я уже сказал - в бизнес-автоматизации сложных алгоритмов не бывает, в противном случае - они бы не смогли бы быть реализованы как бизнес-процессы.
Я бы сказал, что в аксапте есть грандиозная структурная сложность за счет отсутсивя модульности - понять что за код и на что он влияет довольно трудно. Пости все есть интерфейс, нигде не гарантируется что в коде одного модуля не может быть вставки из другого модуля.

Разбираться с прикладным кодом достаточно сложно.

Во-вторых, на пользовательском уровне такая фабрика проще чем кейз, потому, что она сводит все более простому варианту - "созание по ключу". В case можно напихать в каждый выбор любой логики, соответственно, если знать про то, что должна сделать фабрика, то проще понять, что делает кусок кода.

К тому же такая фабрика помогает достичь модульности.

К сожалению, тут есть часть недостатков:
- нет визуализации соотвествия ключ-класс
- нет контроля целостности во время компиляции (case в Ax7 проверяется на недублирование ключей в дизайн тайме, правда в Ax6 этого не было, как и рантайма тоже - моя попытка сделать статический анализ выгребла ~30 всяких ошибок, часть из которых были свитчи )
- она медленнее

С кодом не использующим патернов может быть сложее разбираться - при работе с прикладным кодом аксапты часто хочется тул, который сравнивает два выделенных куска, чтобы понять, в чем тут разница.
Теги
sysextension framework, sysoperation framework, как правильно, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
dynamicsax-fico: Invoice search AX2012 vs. AX7 (Part 2) Blog bot DAX Blogs 0 01.04.2016 10:11
DAX2009 аналог friend классов. Как сделать? Raven Melancholic DAX: Программирование 9 07.11.2015 23:50
emeadaxsupport: Inventory closing differences between AX4.0 and AX2012 using weighted average costing method Blog bot DAX Blogs 0 27.12.2012 19:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.