10.06.2015, 11:14 | #1 |
Участник
|
Поррассуждаем? Как лучше работать с парой связанных значений в классах? (например, nullable)
Сразу скажу, я уже реализовал "как проще".
Но хотелось бы поррасуждать - вдруг есть какое-то более изящное решение? И давайте для определенности будем говорить о: 1. ax2009 и ax2012. 2. о какой-нибудь обработке runBaseBatch - чтобы и у пользователя спрашивать, и между клиентом-сервером значение передавать, и сериализация была, и нужно было бы хранить в базе Итак, задача: при определенном условии, у пользователя надо спросить значение чего-то. все значения имеют смысл. Но если условие не выполняется, то значений нет. Примеры:
другими словами, в алгоритмах используется пара значений - tuple(есть ли значение, значение) Задача сводится к "работа с nullable значениями" с точки зрения программирования, очень похоже на работу с классом. X++: myClass = new MyClass(); if(myClass) { myValue = myClass.parmMyValue(); // делаем что-то со значением } else { // класс не создался, нет значений } =================================== Какие манипуляции хотелось бы делать с подобными значениями в Аксапте:
================================== Какие варианты реализации есть, на мой взгляд:
может что добавите пока буду создавать следующее сообщение с плюсами и минусами вариантов реализации. заранее спасибо за конструктивное обсуждение. Последний раз редактировалось mazzy; 10.06.2015 в 11:17. |
|
10.06.2015, 11:33 | #2 |
Участник
|
итак, плюсы/минусы реализаций:
1. выделить одно из значений как null. например, использовать не перечисление NoYes, а перечисление из 3х значений - NoYesNull 1.1. плюсы: 1.1.1. очень компактно и просто, 1.1.2. легко сериализируется, 1.1.3. легко встраивается в pack/unpack 1.1.4. полный контроль типов со стороны IDE 1.2. минусы: 1.2.1. не всегда это можно сделать. см. пример с хранением контрольной суммы. 1.2.2. нужны функции-преобразователи, чтобы преобразовать к интерфейсному типу. для данного примера: чтобы спросить у пользователя привычную галочку, нужен преобразователь NoYesNull <-> NoYes. Причем Null значение преобрауется в control.enabled(false). или в control.visible(false) 1.2.3. обработка Null-значения будет раскидана по всему коду 2. объявлять/хранить как два независимые поля (две независимые переменные) 2.1.плюсы: 2.1.2. легко сериализируется, 2.1.3. легко встраивается в pack/unpack 2.1.4. полный контроль типов со стороны IDE 2.2.минусы: 2.2.1. громоздко - передавать эту пару в методы - забибикаешься. 3. объявлять как контейнер 3.1. плюсы: 3.1.1. очень компактно и просто, 3.1.2. легко сериализируется, 3.1.3. легко встраивается в pack/unpack 3.2. минусы: 3.2.1. никакого контроля типов. 3.2.2. все ошибки в runtime 3. создать класс (что-то вроде tuple) 3.1. плюсы 3.1.1. контроль типов 3.1.2. нормально сериализуется - см. AIF-примитивы 3.1.3. удобно отлаживать - достаточно переопределить метод toString 3.2. минусы 3.2.1. ни фига не компактно и не просто - очень громоздко 3.2.2. поседеешь пока встроишь в pack/unpck 3.2.3. очень неудобно отображать эти классы в поля формы или диалога 4. временная таблица? 4.1. плюсы 4.1.1. контроль типов 4.1.2. нормально сериализуется 4.1.3. легко работать с набором значений (не одна запись, а несколько во временной таблице) 4.2. минусы 4.2.1. неудобно отлаживать 4.2.2. неудобно передавать значения 4.2.3. неудобно создавать подобные пары - слишком много телодвижений надо сделать 3.2.3. очень неудобно отображать эти классы в поля формы или диалога буду рад вашим замечаниями и дополнениям. |
|
10.06.2015, 11:50 | #3 |
Участник
|
Цитата:
1. выделить одно из значений как null. например, использовать не перечисление NoYes, а перечисление из 3х значений - NoYesNull
Цитата:
3.2.3. очень неудобно отображать эти классы в поля формы или диалога
Последний раз редактировалось skuull; 10.06.2015 в 12:29. |
|
10.06.2015, 12:41 | #4 |
Участник
|
Да... это частный случай
я как раз не хотел бы сводить к этому частному случаю. а хотел бы порассуждать в целом. да, костыли лепить придется. но соображения такие: = отображение - это семейство методов/классов. = поэтому удобнее отображать там, где пара связанных объектов передается как она сущность. = но при этом способ должен быть таким, чтобы не насиловать среду разработки. например, объект класса - в текущей версии удобно передавать как параметр в методы, но неудобно встраивать в pack/unpack. |
|
10.06.2015, 15:11 | #5 |
Участник
|
Я бы выбрал гибрид способа 2 и... 3, который создание класса (нумерация немного того). В базе храним парой разных полей (альтернатив здесь вообще говоря особо и нет). В всех остальных местах - классом. В RunBase и прочих подобных сценариях можно использовать как класс, так и пару переменных. Там с отдельным классом неудобство только одно - распаковку приходится делать через промежуточную переменную - контейнер. И кстати, вот неявно цепляется и "контейнерный" способ. При передаче можно задействовать и его, как только понадобится что-то более серьезное - проверка, сериализация и т.п. - быстренько его Tuple::create(packedTuple) и работаем с удобным классом.
В общем, если сложить плюсы и сократить минусы - то минусов как бы и не остается. |
|
10.06.2015, 15:49 | #6 |
Участник
|
Цитата:
Сообщение от mazzy
Примеры:
Цитата:
Цитата:
Сообщение от mazzy
другими словами, в алгоритмах используется пара значений - tuple(есть ли значение, значение). Какие манипуляции хотелось бы делать с подобными значениями в Аксапте:
Цитата:
Цитата:
Цитата:
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
10.06.2015, 19:31 | #7 |
Участник
|
Хм.. Вроде как и есть что сказать по теме, но, вроде бы и так уже все сказано. Только систематизировано несколько по другому, из-за чего и "едет крыша". Как мне кажется, критически важным является ответ на первую "хотелку".
Цитата:
Дальнейшая реализация будет существенным образом зависеть от выбранного способа хранения значения NULL в базе данных. Ну, с первыми 3 вариантами дальнейшая работа понятна. Обычный набор переменных. Некоторые сложности может доставить перекодировка из maxdate() в пустое значение для отображения, но не думаю, что эта такая уж большая проблема. Проблемным является последний вариант, когда дополнительный признак является служебным полем, недоступным для прямого просмотра/изменения пользователем. Вот здесь на первое место выступает вторая ключевая "хотелка" Каким образом будет построен интерфейс с пользователем, чтобы пользователь мог понять, где значение будет интерпретировано как null, а где - как указанное значение? Пусть даже пользователь и "не трогал" этого значения. Или "потрогал", но вернул назад Вообще-то, мне приходит в голову только один вариант на подобный случай. Это когда речь идет о полях, которые пользователь изменить не может. Максимум посмотреть. Та же контрольная сумма. Но это значит, что речь идет о неких расчетных значениях, которые, очевидно, зависят от других реквизитов. Так может, можно эти самые "другие реквизиты" и использовать как признак значения NULL? Если же рассматривать вопрос БЕЗ учета этих двух основных "хотелок", например, как передача неких параметров при расчетах, то можно рассмотреть еще парочку вариантов.
X++: COMVariant comVariant; ; comVariant = new ComVariant(COMVariantInOut::In_out, ComVariantType::VT_BOOL); info(comVariant.toString()); info(strFmt('%1',comVariant.variantType())); comVariant.variantType(ComVariantType::VT_NULL); info(comVariant.toString()); info(strFmt('%1',comVariant.variantType()));
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
11.06.2015, 09:06 | #8 |
Участник
|
в общем, одно из значений трактовать как null...
Цитата:
но может быть сформулировать по-другому хотелки/требования? я бы с удовольствием послушал. Цитата:
в общем, временная таблица? надо подумать. надо попробовать. я этот вариант всегда рассматривал как чисто теоретический. |
|
11.06.2015, 09:16 | #9 |
Участник
|
угу. а еще есть? а можно всех посмотреть?
Цитата:
Для примера возьмем MS SQL и Аксапту 2012, которые умеют отображать null значение, полученное из базы. там в поле отображается специальное значение null, а поле становится недоступным для редактирования. В аксапте 2012 со специальным значением напряжно. Но, думаю, что надо делать поле недоступным для пользователя. Но, опять же, хотелось бы выслушать варианты. Цитата:
Сообщение от Владимир Максимов
Вообще-то, мне приходит в голову только один вариант на подобный случай. Это когда речь идет о полях, которые пользователь изменить не может. Максимум посмотреть. Та же контрольная сумма. Но это значит, что речь идет о неких расчетных значениях, которые, очевидно, зависят от других реквизитов. Так может, можно эти самые "другие реквизиты" и использовать как признак значения NULL?
"если для данного клиента включен контроль кредитного лимита, то спросить и хранить этот кредитный лимит" Цитата:
чтобы срабатывал prmIsDefault в вызывающем классе параметр не должен быть указан. если же у нас есть каскад методов с параметрами по-умолчанию, то параметр отсутствует только в самом внешнем. остальные передают тот параметр, который получили. и в каскаде prmIsDefaul сработает только один раз в каскаде. Цитата:
И как он передается между клиентом и сервером? |
|
11.06.2015, 12:06 | #10 |
Участник
|
Варианты хранения доп.признака в базе данных? Так вроде все перечислил. Ну, если не считать собственно поддержку NULL для поля. Или интересует вариант технической реализации? Так это у кого на что фантазии хватит. Например, для хранения признака создавать не по отдельному полю для каждого поля с возможным NULL, а одно общее поле, где хранить битовую маску...
Ну, и уже упоминались варианты, когда значение, эквивалентное NULL не надо прятать, а наоборот, выставить как одно из возможных значений. Например, заменить CheckBox на ComboBox с 3 вариантами выбора (All / Yes / No). Для текста (кода справочника) создать специальный элемент справочника с пустым кодом. Цитата:
Цитата:
В данном примере, где будет хранится сумма кредитного лимита? Ну, предположительно, либо в таблице клиента, либо в таблице договоров. В обоих случаях признак контроля кредитного лимита должен быть в той же таблице. Цитата:
------------------ Если просто "перечислять варианты", то вот еще парочка идей
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
Теги |
null, nullable, tuple, как правильно |
|
|