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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.06.2017, 15:26   #1  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Что эти аттрибуты, что идея с anytype - это чужеродные отягощающие систему элементы без какой-либо практической пользы.
Атрибуты решают вполне конкретную задачу - добавление нового класса в иерархию без изменения родительского класса, что особенно актульно в 7ке, т.к. не надо оверлеить.
Паттерны из GoF и подобная литература решает конкретную задачу в программировании и очень жалко что по историческим причинам в АХ попадают люди предпочитающие методы по 2000 строк потому что "все в 1 месте, так удобней" и отрицающие все что "не как в 4ке". Выглядит как-то так
За это сообщение автора поблагодарили: ena_ax (-1).
Старый 12.06.2017, 17:16   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от skuull Посмотреть сообщение
Атрибуты решают вполне конкретную задачу - добавление нового класса в иерархию без изменения родительского класса, что особенно актульно в 7ке, т.к. не надо оверлеить.
Паттерны из GoF и подобная литература решает конкретную задачу в программировании и очень жалко что по историческим причинам в АХ попадают люди предпочитающие методы по 2000 строк потому что "все в 1 месте, так удобней" и отрицающие все что "не как в 4ке". Выглядит как-то так
Мама там на картинке - права. На велосипеде с каменными колесами далеко не уедешь.

Эти аттрибуты даже не паттерн - это костыль. Причем кривой. Да, решает задачу.
Искусственной проблемы.

Есть фундаментальные правила конкретной системы основанные на изменении слоев.
Best Practices for Static Construct Methods
https://msdn.microsoft.com/en-gb/library/aa637432.aspx

Даже если отставить в сторону вопрос идиотизма блокирования и принять extension model как данность то не такие костыли нужны системе, а многое другое, в частности переопределение и замена статических методов включая ::construct.

Да, получатся те же слои только сбоку, что конечно же противоречит новой религии доступа к телу. Но детей делать не трогая - средневековье. Да, красивые балахоны с дырочками - это конечно решает задачу. Религиозную.
Старый 12.06.2017, 18:50   #3  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Мама там на картинке - права. На велосипеде с каменными колесами далеко не уедешь.

Эти аттрибуты даже не паттерн - это костыль. Причем кривой. Да, решает задачу.
Искусственной проблемы.
Есть какие-то "общепринятые" вещи в программировании, про Барбару Стрейзанд Лисков тут уже вспоминали, есть еще Принцип открытости/закрытости. Тоже наверно искусственный принцип. Некоторые даже скажут, что знание этих принципов категорически мешает на внедрениях, ведь удорожает поддержку кода и его усложняет.

Последний раз редактировалось skuull; 12.06.2017 в 19:03.
Старый 12.06.2017, 20:40   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от skuull Посмотреть сообщение
Есть какие-то "общепринятые" вещи в программировании, про Барбару Стрейзанд Лисков тут уже вспоминали, есть еще Принцип открытости/закрытости. Тоже наверно искусственный принцип. Некоторые даже скажут, что знание этих принципов категорически мешает на внедрениях, ведь удорожает поддержку кода и его усложняет.
Нет "общепринятых" вещей в программировании. Есть те которые приняты в конкретном фрэйморке, продукте, платформе. То есть уместны.

Я до сих пор помню глаза напарника индуса когда завернул Java в X++. И помню свои крепкие матюги на "общепринятые" вещи от блистательного программиста C#.

Да, "общепринятые" вещи в программировании - абсолютно не нужны так как это удорожает поддержку кода и его усложняет.
Любое уровня ERP должно быть максимум консерватизма и максимум последовательности своим основам. Никаких "общепринятых" вещей.

Применительно к Аксапте, запрету overlayering и костылям в виде этих аттрибутов - если это следование "общепринятым" вещам в программировании то кто-то проклял всех программистов, а программистов AX в особенности.

Я вижу Extension model для AX как просто запрет на программирование. Если же это таки альтернатива то она существенно дороже и намного опаснее чем overlayering.
Создание наследников через атрибуты чтобы следовать Extension model - это способ лечения зуба когда рот зашит.

Цитата:
При́нцип откры́тости/закры́тости (англ. The Open Closed Principle, OCP) — принцип ООП, устанавливающий следующее положение: «программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения»
Принципов так много что лучше использовать только один - здравый смысл.
За это сообщение автора поблагодарили: dech (3), kvan (3), axotnik88 (1).
Старый 13.07.2017, 22:13   #5  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от skuull Посмотреть сообщение
Атрибуты решают вполне конкретную задачу - добавление нового класса в иерархию без изменения родительского класса, что особенно актульно в 7ке, т.к. не надо оверлеить.
Паттерны из GoF и подобная литература решает конкретную задачу в программировании и очень жалко что по историческим причинам в АХ попадают люди предпочитающие методы по 2000 строк потому что "все в 1 месте, так удобней" и отрицающие все что "не как в 4ке". Выглядит как-то так
А кто сказал, что в 4-ке нельзя сделать иерархию без изменения родительского класса?
Создаём базовый класс:
X++:
public class PPO_Base
{
}

protected void new()
{
}

public str getType()
{
    return "Base";
}

public static PPO_Base construct(IdentifierName _className = classstr(PPO_Base))
{
    DictClass       dictClass   = new DictClass(classname2id(_className));
    ;

    if (!dictClass)
        throw error(strfmt("Unable to instantiate \"%1\" class", _className));

    return dictClass.makeObject();
}

public static void main(Args _args)
{
    IdentifierName  className   = _args ? _args.parm() : classstr(PPO_Base);
    PPO_Base        instance    = PPO_Base::construct(className);
    ;

    info(strfmt("Class type: %1", instance.getType()));
}
А потом делаем сколько угодно наследников:
X++:
public class PPO_Derived extends PPO_Base
{
}

public str getType()
{
    return "Derived";
}
Создаем менюайтемы для каждого класса. В строковом параметре пишем имя класса. (Для базового класса параметр может быть пустым). Если сильно надо, можно создать енум для иерархии, но необходимости нет, имхо.
Как использовать в коде:
X++:
PPO_Base    base    = PPO_Base::construct();
PPO_Base    derived = PPO_Base::construct(classstr(PPO_Derived));
;

info(strfmt("Base class type: %1", base.getType()));
info(strfmt("Derived class type: %1", derived.getType()));
__________________
// no comments
За это сообщение автора поблагодарили: macklakov (1), skuull (2), ax_mct (3), ta_and (4), Logger (1).
Старый 14.07.2017, 04:10   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от dech Посмотреть сообщение
А кто сказал, что в 4-ке нельзя сделать иерархию без изменения родительского класса?
А кто сказал что нельзя? Я сказал что не принято. Оно ж примерно на атрибутах так и работает, просто ненадо свой конструктор каждый раз писать.
А в этой реализации было бы неплохо проверить, что _className являеться наследником базовго класса и getType() у вас вышел какой-то бесполезный, только инфо показывать
Старый 14.07.2017, 10:09   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от skuull Посмотреть сообщение
А кто сказал что нельзя? Я сказал что не принято. Оно ж примерно на атрибутах так и работает, просто ненадо свой конструктор каждый раз писать.
А в этой реализации было бы неплохо проверить, что _className являеться наследником базовго класса и getType() у вас вышел какой-то бесполезный, только инфо показывать
  1. Вместо Construct() можно запилить всего одну глобальную функцию
  2. Это учебный пример, лишнего не писал для ясности
  3. Любой каприз за ваши деньги
__________________
// no comments
Старый 15.07.2017, 12:00   #8  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Сообщение от dech Посмотреть сообщение
  1. Вместо Construct() можно запилить всего одну глобальную функцию
Да да! и на вход Аргс! )))
За это сообщение автора поблагодарили: ax_mct (3).
Старый 16.07.2017, 13:27   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от ta_and Посмотреть сообщение
Да да! и на вход Аргс! )))
А зачем вам Args, если требуется только создать нужный инстанс?
__________________
// no comments
Старый 16.07.2017, 16:59   #10  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Сообщение от dech Посмотреть сообщение
А зачем вам Args..?
Каждому инстансу - по параметру! )
Мы же не рассматриваем сферического коня в вакууме, которому совсем параметры не нужны?..
Теги
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, время: 03:27.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.