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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.11.2020, 17:38   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
SysObsoleteAttribute для методов ядра
Привет всем.
Есть атрибут
[SysObsoleteAttribute("@SYS343216", true)]

Если его поставить у метода methodA, то не будут компилироваться вызывающие его методы. Т.е. запрещается использование methodA.

А возможно как-то проставить этот атрибут для static kernel метода, чтобы запретить его использование программистом?

Best practice проверку написали, но ее могут проигнорировать. Хочется больше жести. Только хардкор.

Последний раз редактировалось Logger; 17.11.2020 в 17:46.
Старый 18.11.2020, 02:56   #2  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Даже интерестно, что за страшный метод
Старый 18.11.2020, 11:28   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от trud Посмотреть сообщение
Даже интерестно, что за страшный метод
Классы коллекций (инициализация, сериализация): List, Set, Map.

Кривой Json на входе валит АОС. Неприятно.

BP проверку написали.
X++:
// pkoz, 21.05.2018
// JEV003427 "Устранение блокировок. Вычистка некорректного кода", PKoz 10.04.2019
// JEV004482 "АХ2012 - Тестирование_Расчеты с клиентами -  Договоры_JEV003679", PKoz 01.03.2020
/*
    This method checks the source text for Mercury rules
*/
protected boolean checkSource_MRC()
{
    xRefTmpReferences thisRefererences;
    DictTable           dictTable;
    boolean ret = true;
    ;

    if (sysBPCheck && sysBPCheck.mustCheckTreeNodeCurLayer_MRC()) // только для кода, написанного на usr слое
    {
        // check if things are used, that mustn't be used directly
        this.initTmpxRefReferences();
        thisRefererences.setTmpData(tmpxRefReferences);

        while select thisRefererences
            where thisRefererences.Kind == xRefKind::ClassStaticMethod
               && thisRefererences.name == staticMethodStr(Global, str2con)
               && thisRefererences.ParentName == classstr(Global)
               && thisRefererences.Reference == XRefReference::Call
        {
            this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                thisRefererences.Line,
                thisRefererences.Column,
                    strfmt("Метод %1%2%3 нужно заменить на Global::%4", // "@SYS55400",
                        thisRefererences.ParentName,
                        (thisRefererences.Kind == xRefKind::ClassInstanceMethod || thisRefererences.Kind == xRefKind::TableInstanceMethod || thisRefererences.Kind == xRefKind::MapInstanceMethod) ? '.' : '::',
                        thisRefererences.Name,
                        staticMethodStr(Global, str2con_ru)
                        ));
        }

        while select thisRefererences
            where thisRefererences.Kind == xRefKind::ClassInstanceMethod
               && thisRefererences.name == MethodStr(DialogBox, new)
               && thisRefererences.ParentName == classstr(DialogBox)
               && thisRefererences.Reference == XRefReference::Call
        {
            if (!strStartsWith(thisRefererences.Path, '\\Classes\\Box\\')) // чтобы не ругалась на сам класс Box
            {
                this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                    thisRefererences.Line,
                    thisRefererences.Column,
                        strfmt("Метод %1%2%3 нужно заменить на вызов соответствующего метода класса %4", // "@SYS55400",
                            thisRefererences.ParentName,
                            (thisRefererences.Kind == xRefKind::ClassInstanceMethod || thisRefererences.Kind == xRefKind::TableInstanceMethod || thisRefererences.Kind == xRefKind::MapInstanceMethod) ? '.' : '::',
                            thisRefererences.Name,
                            ClassStr(Box)
                            ));
            }
        }

        // JEV004482 "АХ2012 - Тестирование_Расчеты с клиентами -  Договоры_JEV003679", PKoz 01.03.2020 -->
        while select thisRefererences
            where thisRefererences.Kind == xRefKind::TableField
               && thisRefererences.name == "RelationType"
               && thisRefererences.Reference == XRefReference::Read
        {
            this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                thisRefererences.Line,
                thisRefererences.Column,
                    strfmt(@"Обращение к полю RelationType нужно заменить на вызов SysDictTable::getConcreteTable(). См. https://dax.axforum.info/forums/showpost.php?p=412653&postcount=11"
                        ));
        }

        while select thisRefererences
            where thisRefererences.Kind == xRefKind::TableField
               && thisRefererences.name == "TableId"
               && thisRefererences.Reference == XRefReference::Read
        {
            if (thisRefererences.ParentName == "Common" ||
                    (thisRefererences.ParentName &&
                     tableName2id(thisRefererences.ParentName)
                    )
               )
            {
                dictTable = new DictTable(tableName2id(thisRefererences.ParentName));
                if (dictTable && dictTable.supportInheritance())
                {
                    this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                        thisRefererences.Line,
                        thisRefererences.Column,
                            strfmt(@"Обращение к полю TableId для таблиц поддерживающих наследование, нужно заменить на вызов SysDictTable::getConcreteTable(). См. https://dax.axforum.info/forums/showpost.php?p=412653&postcount=11"
                                ));
                }
            }
        }
        // JEV004482 "АХ2012 - Тестирование_Расчеты с клиентами -  Договоры_JEV003679", PKoz 01.03.2020 <--

        // JEV005646 "Улучшить стабильность работы тестовой аксапты.", PKoz 16.11.2020 -->
        while select thisRefererences
            where thisRefererences.Kind == xRefKind::ClassStaticMethod
               && thisRefererences.name == staticMethodStr(Map, create)
               && thisRefererences.ParentName == classstr(Map)
               && thisRefererences.Reference == XRefReference::Call
        {
            this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                thisRefererences.Line,
                thisRefererences.Column,
                    strfmt(@"Метод %1%2%3 нужно заменить на Collections_MRC::createMap или Collections_MRC::createMap4Json. См. http://axforum.info/forums/showthread.php?t=27738",
                        thisRefererences.ParentName,
                        (thisRefererences.Kind == xRefKind::ClassInstanceMethod || thisRefererences.Kind == xRefKind::TableInstanceMethod || thisRefererences.Kind == xRefKind::MapInstanceMethod) ? '.' : '::',
                        thisRefererences.Name
                        ));
        }

        while select thisRefererences
            where thisRefererences.Kind == xRefKind::ClassStaticMethod
               && thisRefererences.name == staticMethodStr(List, create)
               && thisRefererences.ParentName == classstr(List)
               && thisRefererences.Reference == XRefReference::Call
        {
            this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                thisRefererences.Line,
                thisRefererences.Column,
                    strfmt(@"Метод %1%2%3 нужно заменить на Collections_MRC::createList или Collections_MRC::createList4Json. См. http://axforum.info/forums/showthread.php?t=27738",
                        thisRefererences.ParentName,
                        (thisRefererences.Kind == xRefKind::ClassInstanceMethod || thisRefererences.Kind == xRefKind::TableInstanceMethod || thisRefererences.Kind == xRefKind::MapInstanceMethod) ? '.' : '::',
                        thisRefererences.Name
                        ));
        }

        while select thisRefererences
            where thisRefererences.Kind == xRefKind::ClassStaticMethod
               && thisRefererences.name == staticMethodStr(Set, create)
               && thisRefererences.ParentName == classstr(Set)
               && thisRefererences.Reference == XRefReference::Call
        {
            this.addSuppressableError(#BPErrorMethodIllegalConstructionUsed,
                thisRefererences.Line,
                thisRefererences.Column,
                    strfmt(@"Метод %1%2%3 нужно заменить на Collections_MRC::createSet. См. http://axforum.info/forums/showthread.php?t=27738",
                        thisRefererences.ParentName,
                        (thisRefererences.Kind == xRefKind::ClassInstanceMethod || thisRefererences.Kind == xRefKind::TableInstanceMethod || thisRefererences.Kind == xRefKind::MapInstanceMethod) ? '.' : '::',
                        thisRefererences.Name
                        ));
        }
        // JEV005646 "Улучшить стабильность работы тестовой аксапты.", PKoz 16.11.2020 <--
    }

    return ret;
}
поставить вызов из
\Classes\SysBPCheckMemberFunction\checkSource
Старый 18.11.2020, 09:37   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
А как людей заставляют вообще компилировать? Если есть ci, то туда, наверное, можно добавить любые проверки. Если нет ci то можно вообще не компилировать или ломать компилируемость существующего кода.
Старый 18.11.2020, 10:55   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
А как людей заставляют вообще компилировать?
Если это не стеб, то как бы, все просто. Нельзя написать опасное выражение если оно не компилируется. Независимо от того как организована разработка.
Старый 18.11.2020, 11:31   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
Если это не стеб, то как бы, все просто. Нельзя написать опасное выражение если оно не компилируется. Независимо от того как организована разработка.
Можно написать. Например, при помощи текстового редактора. Или замерджить при помощи контроля версий. Скомпилировать нельзя.
Теги
sysobsoleteattribute

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Многопоточное вычисление дисплейных методов Ace of Database DAX: Программирование 10 28.02.2017 12:09
Класс как набор статических методов AxFinder DAX: Программирование 3 09.08.2013 09:28
Переопределение стандартных методов у динамически создаваемых контролов - вопрос с предисторией (многабукаф) TasmanianDevil DAX: Программирование 13 02.08.2012 07:39
Win2008 и вызов методов COM-объектов AndyD DAX: Программирование 13 06.02.2012 15:22
Список методов таблицы s_s_a DAX: Программирование 16 28.05.2009 13:28

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:08.