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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2021, 14:43   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Поскольку вопрос чисто предпочтений, то я (лично для себя) выработал следующие правила (при условии, что нет правил, установленных используемыми фреймворками):
Методы check* отвечают за одну проверку.
Методы validate* отвечают за комплекс проверок (т.е. грубо говоря состоят из вызовов методов check*).
При этом комплексов может быть много и они могут состоять из разного набора проверок (аналог привилегий и Duty в 2012).
Я люблю делать проверочные методы методами объекта (а не статическими), чтобы иметь возможность обращаться к глобальным переменных классам или внутренним private-методам
Сообщения, исключения, диалоговые окна - это все регулируется параметрами методов в зависимости от потребности (например, иногда вместо инфолога надо писать в таблицу текст ошибки).

Ну и собственно все.
Пример (абстрактный).
Хочу написать алгоритм разноски для своей условной заявки на покупку. Разноска генерит проводку в ГК и приходную проводку в InventTrans.
У меня будет:
1) проверка на открытость периода в ГК
2) проверка на открытость периода по складу (ValueOpen = Да)
3) проверка на наличие товара по необходимым аналитикам
4) проверка на наличие бюджета
... какие-то другие проверки.

По бизнесу (к примеру) сначала выполняется проверка на наличие товара. Если он есть, то закупка не выполняется.
Если товара нет, то выполняется проверка на наличие бюджета. После успешной проверки бюджета - выполняется разноска по складу и ГК.

Я хочу сделать (условно) 4 метода check*, которые в свою очередь будут вызываться в разное время, причем они также могут быть вызваны пользователем по кнопке "Проверить" или "Предварительный просмотр проводок".
При этом у меня будут методы validate*, которые будут вызывать эти методы check*:
1) validate на этапе проверки наличия товара
2) validate на этапе проверки бюджета
3) validate на этапе разноски

Соответственно - наполнение этих validate-методов может быть разным, при этом, к примеру, проверку на открытость периода я могу вызывать в каждом validate-методе, но сама логика проверки у меня будет в едином методе check
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 08.08.2021 в 14:46.
За это сообщение автора поблагодарили: mazzy (5), NetBus (3), dech (5).
Старый 08.08.2021, 15:15   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
О, интересный подход.

А у тебя check-методы могут вызываться не из validate?
И что насчет инфолога? ты допускаешь, что все они могут что-то выводить в инфолог?

и что насчет диалога с пользователем? Ну, этот пресловутый Book_RU.validateDelete?
__________________
полезное на axForum, github, vk, coub.
Старый 08.08.2021, 19:50   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
А у тебя check-методы могут вызываться не из validate?
Конечно. Я же привел пример наличия кнопки "Проверка". validate - это некое событие в алгоритме, по результатам которого отрабатывает основной код (например, разноска).

Цитата:
Сообщение от mazzy Посмотреть сообщение
И что насчет инфолога? ты допускаешь, что все они могут что-то выводить в инфолог?
Я бы даже настаивал, чтобы любая проверка выводила какое-то осмысленное сообщение куда-нибудь (инфолог или какая-то таблица для пакетных заданий). Иначе пользователю совершенно неясно, из-за какой конкретно проверки не выполнилась какая-то операция.

Цитата:
Сообщение от mazzy Посмотреть сообщение
и что насчет диалога с пользователем? Ну, этот пресловутый Book_RU.validateDelete?
Здесь у меня однозначный подход - все проверки должны выполняться до начала транзакции и все диалоги с пользователем должны быть выполнены с помощью стандартных форм системы, после чего в алгоритм должен быть передан ответ пользователя (в виде отдельного параметра). Опять-таки, оговорюсь, что все это не касается уже существующего фреймворка, т.е. даже если я не согласен с построением кода в Book_RU.validateDelete я не кидаюсь его переписывать, а пытаюсь построить код "в стиле", который был заложен его разработчиками. Но как только я ухожу от уже существующего кода - то я уже могу освободиться от этих "кандалов" в виде ранее написанного кода (и это необязательно касается стандартного кода - это касается любого кода, с которым мне приходится знакомиться).

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

Пример 1. Разноска товарного расхода. Проверка необходимого в наличии количества выполняется до резервирования, но если резервирование уже прошло, то нет смысла проверять необходимое количество в наличии - оно гарантированно будет - в этом смысл резервирования.

Пример 2 (AX2012). Проверка достаточности бюджетных средств. Если не используется функционал резервирования бюджета (который привязывает резерв к документу) и разносимый документ не указан в настройках контроля бюджета, то по сути бюджет может "пропасть" в любой момент, а значит его есть смысл регулярно проверять.

Пример 3. Аналог примера 2, только речь идет про проверку на закрытость периода. Конечно период могут закрыть в любой момент, но все же нет смысла проверять закрытость периода условно при любом изменении нашей "заявки на покупку", потому что это для пользователя не столь важно, как, к примеру, неожиданная "потеря" бюджета.

Я намеренно остаюсь в приведенных ранее мною примерах проверок, чтобы не распыляться.

В общем - общая идея такова, что в некотором алгоритме всегда есть проверки, которые можно выполнять на любом этапе алгоритма, а есть проверки, которые есть смысл выполнять только на определенных этапах. Но в любом случае - мне нравится идея выделять всевозможные проверки в методы с префиксом check*, а уже вызывать из методов validate* только те проверки, которые необходимо выполнить именно в данном validate*. Я также понимаю, что одна и та же проверка может быть вызвана как программно несколько раз (из нескольких validate*), так и условно вручную по нажатию специальной кнопки.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 08.08.2021 в 19:59.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
[CodeStyle] методы *noThrow vs *OrThrow vs optional parameter? mazzy DAX: Программирование 27 03.08.2021 00:30
emeadaxsupport: Dynamics AX 2012 Prerequisite Check Utility and SQL Server cluster Blog bot DAX Blogs 0 20.03.2012 19:11
axaptapedia: Validate field values on form Blog bot DAX Blogs 0 17.12.2008 12:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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