|
|
|
|
#1 |
|
Участник
|
Как мне кажется, вопрос о способе записи статических данных "вообще" в отрыве от способа использования этих самых статических данных - не имеет смысла.
Ну, например, разработчики Axapta может и хотели бы хранить данные о номерных сериях в виде контейнеров, но ведь использоваться-то они будут как записи таблицы. Так зачем же вводить промежуточные структуры, если в конце концов все-равно придется создавать записи? Ну, так сразу и создаем. Т.е. способ дальнейшего использования этих самых статических данных собственно и определяет способ их задания. Все остальные соображения тут же отходят на второй план. Кроме того, меня несколько удивляет акцентирование внимание на контроле типов данных. Это ты сам себе не доверяешь? Ну, в худшем случае, получишь ты ошибку не на этапе компиляции, а на этапе исполнения. Или написанный код предварительно не тестируется? А почему, собственно, надо контролировать только тип и не надо контролировать значение? Ведь тоже возможна ошибка! Т.е. контроль типов не то чтобы лишнее требование, но, скорее, из разряда приятных, но не обязательных бонусов. Есть - хорошо, нет - не очень-то и нужно... |
|
|
|
|
#2 |
|
Участник
|
Цитата:
![]() я говорил о наборе пар <таблица, поле> для редактирования query. я предполагал что-то сугубо внутренне-программистское. такое что не дается пользователю. и сам себе не доверяю - особенно если буду добавлять/изменять что-нибудь через несколько месяцев. и не доверяю другим программистам - которые будут добавлять/изменять что-нибудь после меня через некоторое время. а главное - хочу иметь штатный механизм с контролем, который использовали бы другие, а я при добавлении/изменении не запорол бы их работу. Цитата:
Цитата:
Конечно же надо контролировать значение - "скажи как". И мне нравится этот переход на личности: "раз у тебя код не тестируется, поэтому зачем тебе контроль начальных данных?" ============== В контейнерах нет контроля ни типа, ни значения. Я спрашивал - есть ли механизм который контролирует хотя бы тип? Мне ответили - только создавать свои классы (но достаточно трудоемко) Мало того, контейнер уж очень неповоротливая структура (хоть и легкая в использовании) Но в стандартном коде повсеместно используются контейнеры. А какого-то промежуточного/смешанного способа нет - либо контейнеры, либо классы Цитата:
|
|
|
|
|
#3 |
|
Участник
|
Не смертельная. Учитывая удобство, можно и потерпеть. Особенно если не смешивать record'ы и int'ы в одном контейнере.
по теме: зависит от. контейнеры, Код: container fields;;
fields = [[#CustAccount, custTable.custAccount],
[#CustId, custTable.accountNum],
etc];
for(i=1;i<=conlen(fields);++i){
[bookmark, value]=conpeek(fields,i);
excelDocument.insert(bookmark, value, #worksheet);Код: void initQuery(){;
query = new Query(querystr(aotquery));
postInitQuery(); //наследники могут делать грязную работу здесь, не перекрывая initQuery()Код: void initQueries(){;
for(i=1;i<N;++i)
query = new Query(querystr(aotquery));
this.postInitQuery(query);
this.addQuery(query);//здесь хук для инициализации легче сделать чем super() в DerivedClass.initQueries()Код: myClass = myClass::construct(/**/); myClass.parmQuery().dataSourceTable(xx).range(...); Последний раз редактировалось mayk; 12.04.2011 в 13:22. |
|
|
|
| За это сообщение автора поблагодарили: mazzy (2). | |
|
|
#4 |
|
Участник
|
Цитата:
Это очень показательный пример того, что без знания цели, выбор "идеального" средства - бессмысленное занятие Цитата:
Цитата:
Ведь насколько я понимаю, Вы не ставите задачу проверки значения не потому, что это невозможно "в принципе". Как раз-таки очень даже возможно. Просто Вы понимаете полную бессмысленность этой задачи. Однако контроль типов Вам не кажется бессмысленным. Почему, собственно? Только потому, что это относительно просто? |
|
|
|
|
#5 |
|
Участник
|
Цитата:
проекты могут быть импортированы в среду, где таких таблиц нет. другой вариант: дев и продакт системы. в дев таблицы и поля есть, а в продакт еще не перенесли. или вот так: Несколько AOS: синхронность изменения объектов ![]() Цитата:
![]() Цитата:
Сообщение от Владимир Максимов
Ведь насколько я понимаю, Вы не ставите задачу проверки значения не потому, что это невозможно "в принципе". Как раз-таки очень даже возможно. Просто Вы понимаете полную бессмысленность этой задачи. Однако контроль типов Вам не кажется бессмысленным. Почему, собственно? Только потому, что это относительно просто?
Последний раз редактировалось mazzy; 12.04.2011 в 18:16. Причина: добавил ссылку на соседнюю ветку. |
|
|
|
|
#6 |
|
Участник
|
Я бы может генерил бы на основе таблиц и полей, или классов (метаданных)
XML формы для ввода, что то вроде ASP.net или веб сервис, и не программист мог бы вводить данные с привязкой к метаданным (не по id а возможно символьно) а потом умный парсер, преобразовывал бы стрктуру XML и заполнял бы те данные для которых есть таблицы поля классы, или настроил бы генерить ошибку если не вся структура подгружена, или же частично загружать не выкидывая ошибок. можно было бы сделать веб сервис поставщик данных, на основе того что вводят не программисты. в веб поля которые генерятся на основе дев метаданных. Последний раз редактировалось Evgeniy2020; 12.04.2011 в 18:25. |
|
|
|
|
#7 |
|
Участник
|
Цитата:
Сообщение от mazzy
легко. здесь выкладывают проекты.
проекты могут быть импортированы в среду, где таких таблиц нет. другой вариант: дев и продакт системы. в дев таблицы и поля есть, а в продакт еще не перенесли. или вот так: Несколько AOS: синхронность изменения объектов ![]() Можно привести еще варианты, когда при вводе констант (статических данных) действительно необходим дополнительный контроль типов этих самых констант? |
|
|
|
|
#8 |
|
Участник
|
Цитата:
Цитата:
код цвета, тег html, шрифт, размеры шрифта, GUID, MAC-адрес, ip-адрес, адрес сайта в интернете, параметры границы, размеры окон по умолчанию, avi-файл отображения в progressBar, фигуры для тетриса, список начальных вопросов-ответов для Элизы, а также любые другие константы, например из аксаптовских макросов. тысячи их. Цитата:
|
|
|
|
|
#9 |
|
Участник
|
Да не в функции я уперся, а в то, что требование контроля самим же программистом введенных констант - бессмысленно.
Либо константы не являются константами в прямом смысле этого слова (tablenum() - это НЕ константа), либо никто и никогда не контролирует тип этих констант. В смысле, не пишет функционала по этому контролю Т.е. тот факт, что тот или иной способ инициализации статических данных контролирует еще и тип этих самых данных - никак не может служить критерием оценки при выборе способа. Ни основным, ни дополнительным критерием. Это вообще ни на что не влияет. Ни с какой стороны Цитата:
Сообщение от mazzy
код цвета, тег html, шрифт, размеры шрифта, GUID, MAC-адрес, ip-адрес, адрес сайта в интернете, параметры границы, размеры окон по умолчанию, avi-файл отображения в progressBar, фигуры для тетриса, список начальных вопросов-ответов для Элизы, а также любые другие константы, например из аксаптовских макросов.
тысячи их. Насколько я в курсе, никто и никогда не контролирует тип значения, записанного в макросе (константе). Их просто используют, предполагая, что макрос и так имеет нужный тип. PS: Ну, считайте, я "прицепился" к фразе Цитата:
Сообщение от mazzy
минусы:
= никакой встроенной проверки типов. нужно писать самому = никакой встроенной проверки количества данных. нужно писать самому |
|
|
|
|
#10 |
|
Участник
|
Цитата:
![]() Для начала, небольшое отступление. Когда я начал программировать в среде X++ я считал "не правильным" создавать временные таблицы в AOT. Логика здесь была такая: данные временные, значит, и все объекты, которые их используют должны быть временными. В том смысле, что они должны быть удалены по окончании работы кода. А объект AOT остается! Т.е. "временный объект" оказывается "постоянным". В настоящее время, я рассматриваю временные таблицы, как программный код написанный визуальными средствами. Это позволяет избавится от психологического "затыка". Так вот, возвращаясь к задаче. Если сама задача заключается в создании/изменении query, то, почему-то вариант создания этого самого query напрямую в AOT не рассматривается в принципе. "По определению". Почему собственно? Думаю, по двум причинам: 1. Тот психологический "затык", который я описал чуть выше 2. В отличие от временной таблицы query можно создать программно Итого, предлагаю вариант прямого создания Query в AOT. Со всеми предопределенными Range. ============================================= Ну, хорошо, предположим, "ломка" настолько сильная и не преодолимая, что заставить себя создать объект в AOT - невозможно . Ладно. Тогда переходим к "программистским" трюкамКак правило, для построения query создается отдельный метод класса вроде BuildQuery. И вот тут еще один интересный вопрос. А зачем вообще надо предварительно "запихивать" поля в какое-то промежуточное хранилище, если можно прямо так и писать код создания с явным указанием имен полей? Ну, там queryBuildDataSource.addRange(fieldnum(...)) Зачем здесь "лишние" посредники? Хотите модифицировать query в классах-наследниках? Да пожалуйста! Есть куча методов для этого - clearRange(), findRange() и т.п. ============================== Ну, предположим, у нас стоит задача иметь возможность делать query с разными таблицами-источниками. Т.е. одного метода создания - недостаточно. Ну, так создайте несколько методов! Не в одном классе, разумеется, а иерархия классов-наследников, каждый из которых будет работать со своими данными Это как-раз стандартный подход в Axapta. =============================== Другими словами, все предложенные решения сводятся к тому, что просто не создается временное хранилище для статических данных. Статические данные сразу используются. Без промежуточных хранилищ Вот именно про это я и говорил, что бессмысленно рассматривать подобную задачу "вообще". Нужна конкретная постановка задачи в смысле конечной цели использования статического набора. |
|
|
|
|
#11 |
|
Участник
|
Цитата:
Тема называется: Как правильно хранить статичный набор начальных данных в классах? |
|
|
|
| За это сообщение автора поблагодарили: S.Kuskov (-1). | |
|
|
#12 |
|
Участник
|
Цитата:
Сообщение от Владимир Максимов
А зачем вообще надо предварительно "запихивать" поля в какое-то промежуточное хранилище, если можно прямо так и писать код создания с явным указанием имен полей? Ну, там
queryBuildDataSource.addRange(fieldnum(...)) Зачем здесь "лишние" посредники? Хотите модифицировать query в классах-наследниках? Да пожалуйста! Есть куча методов для этого - clearRange(), findRange() и т.п. |
|
|
|
| За это сообщение автора поблагодарили: mazzy (2). | |
|
|
#13 |
|
Участник
|
Цитата:
Исходная постановка задачи после всех уточнений, замечаний, разных "но" и "если" выглядит довольно странно. Примерно так: Необходимо обеспечить запись некой "матрицы" (таблицы) значений с возможностью их последующей модификации. При этом предполагается, что возможно абсолютно произвольное изменение любой характеристики этой матрицы. Может измениться количество строк, количество столбцов, типы и расположение отдельных элементов и т.д. и т.п. И что здесь можно ответить? Да любой объект, который может хранить списки подходит для этого! Хоть обычные массивы. Другой вопрос, а подходит ли выбранное решение для конкретной ситуации? Другими словми, в исходной постановке задача решения не имеет, поскольку сводится к перечню всех возможных инструментов Axapta. Нужно четко обозначить границы задачи. Для каких целей будет использован статический набор? |
|
|
|
|
#14 |
|
Участник
|
Цитата:
На ваш взгляд: 1. В Аксапте нет универсального способа хранения статических данных 2. для Query лучше хранить сам query в AOT. Владимир Максимов, я отключюсь в этой ветке от общения с вами. Извините. Другие мнения/дополнения будут? |
|
|
|
| За это сообщение автора поблагодарили: Владимир Максимов (0). | |
| Теги |
| как правильно |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Загрузка начальных данных | 1 | |||
| Набор данных на лету | 15 | |||
| Прогноз роста базы данных и выбор топологии системы, Как правильно расчитать возможный рост | 0 | |||
| Введение в Аксапту | 0 | |||
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|