14.12.2016, 23:17 | #21 |
Участник
|
Смысл в формальном выполнении правил выбранного фреймворка. Коли уж наследуется от ранбейза, а он поддерживает этот самый интерфейс сериализации. Другой вопрос, а зачем вам тогда в принципе ранбейз если вы не используете ни возможности пакетной обработки ни клиент-серверное взаимодействие. Работайте напрямую с классом диалога.
|
|
18.12.2016, 15:13 | #22 |
Administrator
|
Я в таких случаях пытаюсь найти похожий пример на слое SYS. В крайнем случае - на SYP. И желательно из одного из базовых модулей.
Нашёл что-то похожее в классе InventDimRenameItemDimension. Класс тоже создаётся на сервере. В диалоге тоже надо указать текстовые параметры (правда, не один, а несколько), которые не нужно сохранять в SysLastValue. Там проблема решена следующим образом:
То есть, в стандартном приложении используется вариант под номером 1. P.S.: Спасибо за вопрос
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: dn (1), Владимир Максимов (2), S.Kuskov (2). |
18.12.2016, 16:42 | #23 |
Участник
|
Вариант 1 - это тоже "формальное выполнение правил выбранного фреймворка". Буквально. Ведь используются стандартные параметры стандартных методов этого фреймворка. Никакой "отсебятины" и "левых" методов или переменных
Цитата:
У класса RunBase очень много самых разных функций. Но ведь Вы никогда не используете их все. А только те, которые нужны в Вашей конкретной задаче Т.е. Вы предлагаете мне написать свой собственный RunBase вместо перекрытия пары методов стандартного? Не слишком накладное (во всех смыслах) решение?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.12.2016, 16:55 | #24 |
Участник
|
Интересно... Похоже те, кто за заполнение pack/unpack не задавал себе вопроса "а почему, собственно?".
Почему, собственно я обязан поддерживать возможность сериализации, если она в данном конкретном случае мне не нужна? Понятно, что ответ на этот вопрос лежит в области поддержки функционала. Т.е. если в будущем возникнет необходимость расширения и модификации данного функционала, то предполагается (!), что если класс поддерживает сериализацию, то и модифицировать его будет проще. Т.е. предполагается, что в будущем в данном функционале могут появится таки переменные, которые надо будет сохранять/восстанавливать в кеше Ок. Предположим, действительно такая необходимость возникла. И? Неужели функционал с затиранием всего кеша будет проще модифицировать, чем функционал без поддержки сериализации? Как мне представляется, трудозатраты будут примерно одинаковые. Или я не прав в своих рассуждениях? В чем ошибаюсь?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 18.12.2016 в 17:03. |
|
18.12.2016, 19:05 | #25 |
Участник
|
Я думаю ,что тут дело в том, что есть некие патерны, которых следует придерживаться.
Один из них, это разделение интерфейса и реализации. RunBase и наследники должны реализовывать интерфейс SysSaveable. Раз используете классы, которые должны реализовать этот интерфейс, то будьте добры это сделать. Иначе нужен какой-то другой базовый класс. |
|
19.12.2016, 09:04 | #26 |
Участник
|
Ну во-первых, RunBase много чего дает. Тот же диалог, прогресс-бар или запуск заданий.
Во-вторых, паттерн может быть уже реализован (см. RunBaseReport). В-третьих, если нельзя сделать всем понятную заглушку, а нужно "четко следовать" стандартам, то здесь попахивает занудством и бессмыслицей. Цитата:
__________________
// no comments |
|
19.12.2016, 10:33 | #27 |
Боец
|
Цитата:
Сообщение от dech
Ну во-первых, RunBase много чего дает. Тот же диалог, прогресс-бар или запуск заданий.
Во-вторых, паттерн может быть уже реализован (см. RunBaseReport). В-третьих, если нельзя сделать всем понятную заглушку, а нужно "четко следовать" стандартам, то здесь попахивает занудством и бессмыслицей. Полностью поддерживаю Владимира и задаю вопрос, зачем делать то, что абсолютно не нужно. Потому что так надо? Или потому что другие не поймут? Опять же повторюсь: Ответ: Как нужно - не делайте, делайте как вам нравится. Кому будет нужно - разберется и поправит. Не заморачивайтесь. |
|
|
За это сообщение автора поблагодарили: dn (2). |
19.12.2016, 11:24 | #28 |
Участник
|
Отличный совет. Как человек прокопавший не один десяток тыщ строк Х++ рекомендую - делайте так! И я без работы не останусь
__________________
любитель портвейна и снов с прокисшей капустой в усах |
|
|
За это сообщение автора поблагодарили: Sada (1). |
19.12.2016, 11:53 | #29 |
Участник
|
Цитата:
Цитата:
А КАК нужно-то? Точнее, не столько даже "как", сколько "почему именно ТАК"?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
19.12.2016, 12:22 | #30 |
Боец
|
Цитата:
Сообщение от Владимир Максимов
Возможно, я что-то пропустил. Дайте, пожалуйста, ссылку на обоснование. Т.е. где указаны причины по которым надо делать так, а не иначе. Ну, или просто процитируйте.
По факту, я и пытаюсь получить обоснованный и аргументированный ответ на правильно понятый Вами вопрос. А КАК нужно-то? Точнее, не столько даже "как", сколько "почему именно ТАК"? - паковать перменные в pack\unpack, использовать их в диалоге - написать конструктор, с getLast() и перетереть сохраненные значение переменных, если предыдущее значение какой-то переменной Обоснование - поддержав сериализацию, вы не нарушаете правил RunBase Framework и следуете BestPractice - класс сможет выполняться на сервере, в Batch даже если вам этого пока не нужно (может другим понадобится) - вы полностью сохраняете универсальность класса, задавая нужное вам поведение отдельным конструктором. Обоснуйте, почему вы "не хотите" сделать так? |
|
19.12.2016, 12:57 | #31 |
Участник
|
Цитата:
- В Best Practices я не встречал упоминания об обязательности перекрытия pack/unpack. Ну, кроме обязательности перекрытия абстрактных методов из-за чего и возникает необходимость в заглушке. Но к Best Practices это не относится Цитата:
- Batch не нужен и не понадобиться. Это также было в постановке задачи Если Batch все-таки понадобиться, то объем модификаций при использовании заглушек и при затирании кеша будет сопоставим. Надо будет организовать "вырезание" из кеша тех переменных, которые не надо сохранять от тех, которые понадобятся для работы Batch. Там придется добавлять ряд переменных именно для Batch - Не понял этого тезиса. О чем идет речь?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 19.12.2016 в 13:07. |
|
19.12.2016, 13:06 | #32 |
Боец
|
|
|
19.12.2016, 13:52 | #33 |
Участник
|
По той причине, что я вынужден буду делать лишнюю и бессмысленную работу.
- Писать "лишний" код pack/unpack - Инициализировать переменные, которые сразу после инициализации необходимо затирать (очищать) (getLast()) Т.е. делать "мусорную" работу. С этим можно смирится, если бы в этом был какой-то практический смысл. Но вот этого самого смысла я и не вижу
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
19.12.2016, 14:17 | #34 |
Участник
|
Я делаю так:
1. Если переменные сохранять не нужно (в теме это называется "кэш"? getLast/saveLast в общем), диалог swap-ить не нужно, batch не предусматривается - заглушки на pack/unpack. 2. Если переменные сохранять не нужно, но диалог на клиенте - реализуются полноценные pack/unpack и пустые getLast/saveLast. 3. Если переменные сохранять нужно и они совпадают с данными в диалоге - ну тут понятно. 4. Если переменные сохранять нужно, но не все, а также при swap диалога на клиента зачастую данных в нем нужно больше, чем сохранять, то в pack смотрим признак inGetSaveLast, в зависимости от него возвращаем разные версии/наборы данных. Соответственно, в unpack - обрабатываем. Реализовывать сохранение всех данных из диалога в БД, а потом затирать, не используя, только потому, что кажется, что фреймворк такой, имхо, абсурд. В надежде, что когда-то кто-то что-то поменяет? А если нет? А сейчас все нужно реализовать, да протестировать. ЗЫ. Ax3 |
|
|
За это сообщение автора поблагодарили: Владимир Максимов (2), dech (1). |
19.12.2016, 14:24 | #35 |
Участник
|
Проще говоря, у нас 2 лагеря. :-)
Один лагерь состоит из приверженцев соблюдения всех правил, другой - из тех, кто не любит делать лишнюю работу. Плюсы в сторону первого лагеря: да, действительно, следующим программистам придется меньше материться, т.к. pack/unpack уже написаны. Остается добавить +1 в #CurrentVersion и новые поля в #CurrentList. Все полностью соответствует BP и корректно работает. Минус в том, что заглушка в виде лишней переменной все-таки будет в макросе #CurrentList, допустим называться она будет dummy. В пользу второго лагеря скажу, что все плюсы, которые видит первый лагерь нивелируются тем, что на клиенте тупо реализуется один класс, который может прожить лет 5 в неизменном состоянии, а потом устареет и не будет использоваться. Если ты работаешь в Microsoft, то для тебя важно, чтобы все красиво вписывалось в инфраструктуру. Но если ты пашешь на клиенте, ты в принципе можешь прикинуть, стоит ли заморачиваться и делать лишнюю работу, пусть даже в 20 строк.
__________________
// no comments |
|
19.12.2016, 14:26 | #36 |
Боец
|
Цитата:
Сообщение от Владимир Максимов
По той причине, что я вынужден буду делать лишнюю и бессмысленную работу.
- Писать "лишний" код pack/unpack - Инициализировать переменные, которые сразу после инициализации необходимо затирать (очищать) (getLast()) Т.е. делать "мусорную" работу. С этим можно смирится, если бы в этом был какой-то практический смысл. Но вот этого самого смысла я и не вижу Вам приходилось сдавать майкрософту ISV решения? Там куда больше спорных моментов из ряда "кому это нужно", правки занимали недели. Так принято, работа не бессмысленная и не мусорная - вам за неё платят, как минимум. Есть стандарт, принято ему следовать и не плодить антипатиерны. Еще раз - сделать можно так как вам хочется, кому нужно будет - переделает, тоже за деньги |
|
19.12.2016, 14:29 | #37 |
Участник
|
Цитата:
__________________
// no comments |
|
19.12.2016, 14:49 | #38 |
Боец
|
Цитата:
|
|
19.12.2016, 14:56 | #39 |
Участник
|
Вот с этого места поподробнее. О каком стандарте идет речь? Я же неоднократно указывал, что то, что я делал по Варианту 1 - это тоже стандарт. Стандарт, предусмотренный самим FrameWork. Просто этот подход используется нечасто из-за его не типичности (нестандартности самого подхода, а не реализации)
Ради интереса, сделайте поиск по перекрытым методам pack/unpack. Заглушки в этих методах встречаются довольно часто в разных стандартных классах. Но! Все они имеют RunOn = calledFrom, при этом неявно предполагая, что речь будет всегда идти о запуске на стороне клиента. Т.е. нет проблемы сериализации. Просто в данном конкретном случае "камнем преткновения" является RunOn = Server. Это как раз и есть то самое "бессмысленное и беспощадное" требование клиента, которое я вынужден сделать. Клиента не интересует надо/не надо. У него есть свой "стандарт" Вариант 1, описанный мной - это следование требованию клиента об установке RunOn = Server, но при этом выполняется отказ от сериализации. Еще раз подчеркиваю, отказ происходит стандартными способами, предусмотренными самим FrameWork ------------- Ответ на какой вопрос я хотел услышать, но так и не услышал Чем грозит отказ от сериализации при настройке RunOn = Server? Т.е. класс запускается на сервере, а форма диалога на клиенте без создания дубликатов. Происходит прямое "общение" формы на клиенте и обслуживающего его класса на сервере.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 19.12.2016 в 15:02. |
|
22.12.2016, 10:23 | #40 |
Administrator
|
Ещё вот такой аргумент пришёл в голову: меньше всего ошибок в коде, который не надо писать. Ну или другими словами, чем меньше вы кода напишете, тем меньше вероятность того, что в нём будет ошибка. Применительно к данному случаю: в пустых pack() и unpack() меньше шансов поймать ошибку, чем если их полностью реализовывать. Я думаю, многие здесь сталкивались с ошибкой, когда типы данных в контейнере в SysLastValue не соответствовали тому, что ожидал получить unpack() (да, я знаю про CurrentVersion). Зачем лишний раз подставляться, если это не нужно для решения задачи?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: ax_mct (5). |
Теги |
как правильно |
|
|