|
20.03.2017, 09:25 | #1 |
Участник
|
Как правильно вести разработку в условиях, когда часть кода закрыта от изменения - Sys-слой в аксапте, закрытые codeunit в навике, extensions в MS CRM
в прошлой ветке я не получил ответ на свой вопрос
Как правильно выполнять unit-тестирования методов с параметрами по умолчанию на ваш взгляд? но зато получилось сформулировать коренное отличие продуктов dynamics от традиционных средств разработки: часть кода закрыта от изменения. в аксапте это sys-слой и невозможность изменить сигнатуры методов. сигнатуры можно только расширить параметрами по умолчанию. в навике это закрытые codeunit'ы. для которых конечно была партнерская лицензия за туеву десятков тысяч евро. но и она открывала доступ не ко всем кодеюнитам, насколько я помню. в MS CRM это система extensions. к подобной системе идет и Аксапта, кстати. Поэтому приглашаю в эту ветку специалистов всех dynamics систем. Поделитесь, = какие приемы эффективной разработки вы используете? = Какие плюсы и минусы у закрытого кода в вашей системе? = Что на ваш взгляд должен сделать майкрософт, как поставщик продукта, чтобы разработка была эффективной? Если нужен код для примера, то предлагаю обсуждать на примере метода, который ищет цену/скидку для некоторого товара. Предположим, заказчик просит изменить/расширить поведение этого метода. Как правильно и эффективно вести разработку? = в аксапте этот метод находится в слое sys. его сигнатуру нельзя менять = в навике, насколько я помню, этот метод находится в закрытом codeunit'е = в MS CRM - не знаю. но подозреваю, что расширение доступно только через extension можно взять любой другой метод для примера. Последний раз редактировалось mazzy; 20.03.2017 в 09:32. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
20.03.2017, 12:32 | #2 |
Участник
|
Дык, правильный ответ уже написан в самом вопросе.
Цитата:
Обсуждение "полупиратских методов", насколько я помню, на этом форуме не приветствуется. Другое дело, что иногда действительно ВОТ НУЖНО бывает создать в таблице 17 поле с номером 25 (ну, или удалить поле 24) И хрен какая партнёрская лицензия (даже самая дорогая) даёт это сделать в этой таблице и в этом диапазоне. ЗЫ: Но, вообще, основное в этом вопросе - открыть объект. Т.е. всё же превратить его в текст, изменить, перекомпилировать и закатать обратно. Таких способов есть несколько. Будем обсуждать их здесь, Сергей? |
|
20.03.2017, 12:51 | #3 |
Участник
|
А других способов совсем нет?
Если так, то пока достаточно констатации - только открыть. возможно применив reverse engineering. но по-моему не может быть, чтобы только такой способ. я могу поверить, что так делают в странах бывшего СНГ. но Навик широко распространен и в европе. а там как? |
|
20.03.2017, 16:47 | #4 |
Banned
|
Цитата:
Interceptor pattern - это перехват методов позволяющий полностью их заменить. https://en.wikipedia.org/wiki/Interceptor_pattern http://docs.oracle.com/javaee/6/tutorial/doc/gkedm.html http://stackoverflow.com/questions/1...ors-in-java-ee DI - Dependency injection - это подход позволяющий встраиватьcя. https://en.wikipedia.org/wiki/Dependency_injection https://ru.wikipedia.org/wiki/%D0%92...81%D1%82%D0%B8 P.S. Справедливости ради в том или ином виде это есть в .NET в отдельных технологиях и библиотеках, но я не критикую MS в "отсталости", а говорю о реальной доступности применения как инструмента в конкретных наших по сути фреймворках. Когда инструментарий не соответствует потребностям. Последний раз редактировалось ax_mct; 20.03.2017 в 17:01. |
|
20.03.2017, 17:07 | #5 |
Участник
|
Цитата:
Сообщение от ax_mct
Как минимум реализовать поддержку Interceptor and DI паттернов. Понять что мир программирования уже ушел далеко от классического ООП. И то классическое и святое ООП несовместимо с потребностями возникающими при создании расширений. Даже если приукрасить это прямоугольное OOП с помощью делегатов и подписки на события.
А как это эффективно и правильно сделать в существующем инструментарии? И с существующим унаследованным кодом? |
|
20.03.2017, 18:35 | #6 |
Участник
|
Что приходит на ум:
1. Пользоваться только открытыми интерфейсами, если задание не укладывается в таковые воркэраундить или говорить, то такое невозможно - плюсы - больше вероятность обратной совместимости, минусы - ограниченность 2. Заменять более крупными кусками (Можно посмотреть на SubledgerJournalizerBondExtension - вместо того, чтобы как-то встроится в системную группровку, заменяет ее полностью). Плюсы - больше можно сделать, минусы - дублирование кода, надо протаксивать что-то при фиксах в расширяемом коде. 3. Грязные трюки (например рефлекшн для доступа к приватным методам, Moles) - Плюсы - больше возможностей чем 1. меньше кода чем в 2.. Минусы - сломается при апгрейде. Вообще говоря, вся штука в том, чтобы вендор мог выделить такие интерфейсы которые: 1) Были бы достаточны для расширяющих 2) Сам вендор имел практическую возможность их не ломать. При любом подходе будут расширения которые ломаются - просто разная вероятность. Как в винде - блокнот скорее всего заработает, расширение меню explorer скорее всего тоже, но с меньшей вероятностью, а антивирус скорее всего нет (ну или что-то такое странное). Вопрос в том, чтобы отделить одно от другого. Интересен также подход в опенсурс проектах - большинство софта пишут используя API но если надо чего-то еще, то можно предложить патч (насколько я знаю, даже MS патчил линукс, чтобы поддержать Hyper-V), если патч будет хорошим (по стандартам кодировния, документированным) то есть вероятность что его вольют в версию продукта. Последний раз редактировалось belugin; 20.03.2017 в 19:04. |
|
|
За это сообщение автора поблагодарили: EVGL (5), mazzy (2). |
20.03.2017, 21:21 | #7 |
Administrator
|
Цитата:
оставляем работать стандартный метод (35) и когда уже цифра найдена и готова встать в заказ продажи срабатывает наша метеорологическая скидка и делает из 35-ти 32. т.е. после всего стандарта одной строкой делаем вызов собственной функциональности. пусть даже она повторяет работу стандарта. криво повторяет. с ошибками, потому что сварганена на скорую руку. не оттестирована на пельмешках в зной и семечках при штормовом ветре. о! ну и галочку в настройке "погодная скидка включена" по умолчанию - нет. вот теперь да. как-то так. |
|
21.03.2017, 03:41 | #8 |
NavAx
|
Цитата:
P.S. идея метеорологической скидки/наценки, кстати, довольно интересная.
__________________
Isn't it nice when things just work? |
|
21.03.2017, 09:00 | #9 |
Участник
|
Цитата:
Может быть из-за того, что менее оправданно дорого разрабатывать, если пользователей меньше |
|
21.03.2017, 08:58 | #10 |
Участник
|
Цитата:
|
|
21.03.2017, 09:38 | #11 |
Участник
|
Цитата:
Сообщение от belugin
Судя по вопросу Маззи, его больше интересует вопрос, как протащить туда свои параметры, учитывая что стандартный функционал уже передает примитивы, а не расширяемый объект-критерий.
здесь тема: Как правильно вести разработку в условиях, когда часть кода закрыта от изменения |
|
22.03.2017, 02:55 | #12 |
NavAx
|
Цитата:
Так вот, по правильному, конечно же, стоило бы переписать стандарт так, чтобы не было нужды ковыряться в мешанине. Четкое, хорошо задукоментированное API. И обновления по всему миру должны выходить с оперативностью 1С. Даже в регионах, которые с точки зрения объемов продаж, кажутся маловажными.
__________________
Isn't it nice when things just work? |
|
|
За это сообщение автора поблагодарили: mazzy (2), ax_mct (10). |
22.03.2017, 08:28 | #13 |
Участник
|
Цитата:
мало того, я бы даже сформулировал "вендор должен переписать" ))) я предлагаю сразу пропустить тривиальные шаги и сформулировать тему следующим образом: Как вести разработку с минимальными в долгосрочной перспективе трудозатратами в условиях, есть куча унаследованного кода И часть кода закрыта от изменения, а платформа предоставляет систему событий и подписок? Что должен внести в код вендор? Какие техники и приемы может применять партнер/клиент? ========================= пока прозвучали варианты: = снять ограничения и писать поверх (лицензионным или нелицензионным способом) = врезаться в существующие event'ы. === при этом ожидается что будет дублирование кода === один из крайних вариантов - полное дублирование - врезаться в событие "загрузка системы" и после этого не отдавать управление стандартному приложению ограничения, насколько я понимаю: = в закрытые объекты новые евенты добавить нельзя = подписчик может не иметь доступа к паблишеру события, поэтому часть информации возможно придется передавать через глобальные переменные доводы в пользу закрытого кода (см. жаркие холивары 90х и начала 2000х о закрытых/открытых системах): = обновление на новую версию становится очень легким за счет усложнения первоначальной разработки и кастомизации ========================= еще соображения? какие ближайшие аналоги вы можете привести? другими словами, где можно посмотреть как действуют люди в подобных ситуациях? я абсолютно не верю, что ситуация с dynamics является уникальной и ни на что не похожей. значит, кто-то и как-то уже решал подобные задачи. будем применять тот опыт или не будем - можно решить после того, как посмотрим на аналоги. Последний раз редактировалось mazzy; 22.03.2017 в 08:42. |
|
21.03.2017, 10:41 | #14 |
Moderator
|
В случае с CRM дело обстоит сильно иначе. У нас нет внутреннего языка, или возможности править поведение системы, как таковое. Все что у нас есть, с точки зрения серверной логики - это плагины-обработчики событий системы. Технически, мы можем перехватить попытку чтения цены продукта и заменить выходное значение в своей логике, но на практике так не делается. Системные механизмы используют множество согласованных обработчиков, логика которых не документирована. На практике, если не подходит стандарт - делаешь рядом что-то свое. Победить и изменить - как правило, себе дороже. Но это в общих чертах, конечно. Бывают случаи проще, там можно доработать стандарт, если можно на него опираться, а не менять в корне.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
21.03.2017, 11:08 | #15 |
Участник
|
Цитата:
т.е. поставщик кода должен заранее предусмотреть места для таких обработчиков-событий? и задокументировать их. так? тогда можно жить и вести разработку и в закрытой системе. так? |
|
21.03.2017, 15:48 | #16 |
Moderator
|
По сути да, это эвент ресиверы. Есть воронка обработки события, куда можно встроиться на разных этапах, в том числе и до вызова системной логики. Приблизительно 99% событий доступны для обработки, но мы не можем отключить обработчики от MS. Максимум "исправить" то что они сделали. Так работать можно, модель рабочая. Но, как я говорил, в каких то случаях, проще написать свое
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
21.03.2017, 13:53 | #17 |
Banned
|
Цитата:
Цитата:
Сообщение от Артем Enot Грунин
...
Системные механизмы используют множество согласованных обработчиков, логика которых не документирована. На практике, если не подходит стандарт - делаешь рядом что-то свое. Победить и изменить - как правило, себе дороже. Но это в общих чертах, конечно. Бывают случаи проще, там можно доработать стандарт, если можно на него опираться, а не менять в корне. Вендор не просто меняет способ разработки по техническим причинам в D365FO, он тупо закрывает разработку функциональности вообще со стороны партнеров и клиентов. Всякие точки расширения и события - это пластмассовая косточка с клубничным вкусом. Пососать. Событий и подписок - недостаточно. Нужна возможность замены любых классов и методов целиком. Через конфигурационные файлы. Но это будет тот же overlayering по своей сути. Последний раз редактировалось ax_mct; 21.03.2017 в 13:59. |
|
|
За это сообщение автора поблагодарили: Logger (1), Sancho (2). |
21.03.2017, 14:12 | #18 |
Участник
|
Цитата:
Цитата:
Уточню название темы: Как вести разработку с минимальными в долгосрочной перспективе трудозатратами в условиях, есть куча унаследованного кода И часть кода закрыта от изменения, а платформа предоставляет систему событий и подписок? что должен сделать вендор? что может сделать партнер/заказчик своими силами? Последний раз редактировалось mazzy; 21.03.2017 в 14:17. |
|
|
За это сообщение автора поблагодарили: ax_mct (7). |
21.03.2017, 14:32 | #19 |
Banned
|
Цитата:
Сообщение от mazzy
Как вести разработку с минимальными в долгосрочной перспективе трудозатратами
в условиях, есть куча унаследованного кода И часть кода закрыта от изменения, а платформа предоставляет систему событий и подписок? что должен сделать вендор? что может сделать партнер/заказчик своими силами? https://ievgensaxblog.wordpress.com/...xtension-code/ X++: using System.Reflection; /// <summary> /// Handles events raised by <c>SalesLineTypeEventHandler</c> class. /// </summary> public class SalesLineTypeEventHandler { [PostHandlerFor(classStr(SalesLineType), methodStr(SalesLineType, insert))] public static void SalesLineType_Post_insert(XppPrePostArgs _args) { SalesLineType salesLineType = _args.getThis(); var bindFlags = BindingFlags::Instance | BindingFlags::NonPublic; var field = salesLineType.GetType().GetField("salesLine", bindFlags); SalesLine salesLine = field.GetValue(salesLineType); if (salesLine) { salesLine.MyNewField = 42; salesLine.doUpdate(); } } } |
|
21.03.2017, 14:43 | #20 |
Участник
|
Цитата:
Но рефлексия - это тут же уход в динамическое программирование взамен статической компиляции. Со всеми плюсами и минусами. И соответствующими холиварами на эту тему ))) это тоже неправда ))) но должен он очень мало чего и мало кому. это так. |
|