03.06.2008, 13:22 | #1 |
Постигающий
|
Значение display метода по его названию
Доброго времени суток.
Стоит задача: из списка дисплейметодов определенной таблицы(список уже реализован) необходимо выбрать интересующий метод (хранится лишь его название) и выводить значение этого дисплейметода у текущего курсора. может кто-тоо сталкивался с подобным и подскажет, как, зная имя метода, достать его значение ? заранее благодарен Последний раз редактировалось Андрей К.; 03.06.2008 в 13:26. |
|
03.06.2008, 13:39 | #2 |
Участник
|
Может имеет смысл подобное реализовывать настройками?
Если стоит Галка1, показывать дисплей1 Если стоит Галка2, показывать дисплей2.....
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
03.06.2008, 13:50 | #3 |
Постигающий
|
настройками не получится...предполагается выбор любой из таблиц и соответственно любого из ее дисплейметодов
|
|
03.06.2008, 13:56 | #4 |
Участник
|
Цитата:
Оффтопик про "программисткий подход", извините. Динамические чекбоксы в неизвестном количестве Про программистский подход, программистское мышление и стереотипы |
|
|
За это сообщение автора поблагодарили: Андрей К. (1). |
03.06.2008, 14:00 | #5 |
Участник
|
Цитата:
Сообщение от Андрей К.
Доброго времени суток.
Стоит задача: из списка дисплейметодов определенной таблицы(список уже реализован) необходимо выбрать интересующий метод (хранится лишь его название) и выводить значение этого дисплейметода у текущего курсора. может кто-тоо сталкивался с подобным и подскажет, как, зная имя метода, достать его значение ? заранее благодарен вот реализация правда для отчетов X++: void addString(ReportControl _reportControl, ReportSection _reportSection, common _cursor, SysDictClass _classObj) { ReportStringControl reportControl = _reportControl; str s; ; txt += this.font(reportControl.fontSize(), reportControl.bold(), reportControl.italic(), reportControl.font()); if (reportControl.dataField()) { s = _cursor.(reportControl.dataField()); } if (reportControl.dataMethod()) { s = _classObj.callObject(reportControl.dataMethod(), _reportSection); } ................... }
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
|
За это сообщение автора поблагодарили: Андрей К. (1). |
03.06.2008, 14:01 | #6 |
Участник
|
X++: static void Job8(Args _args) { LedgerTable lt; DictTable dt; ; select firstonly lt; dt = new DictTable(tablenum(LedgerTable)); info(dt.callObject("taxCode", lt)); } |
|
|
За это сообщение автора поблагодарили: Андрей К. (1). |
03.06.2008, 14:04 | #7 |
Мрачный тип
|
Дисплей-метод может возвращать в принципе любой тип примитивный - как там с контролами будет ? Как себя поведет система при попытке контрола преобразовать полученное не родное значение к его родному примитивному типу ?
А вообще - вот : X++: display AnyType anyMethod() { DictTable tbl = new DictTable(this.tableId); ; < >; return tbl.callObject(< >, this); }
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
За это сообщение автора поблагодарили: Андрей К. (1). |
03.06.2008, 14:09 | #8 |
Постигающий
|
Спасибо за помощь!
|
|
03.06.2008, 14:45 | #9 |
Участник
|
Цитата:
Интересно кто эти дисплей методы будет выбирать..пользователи?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
03.06.2008, 15:42 | #10 |
NavAx
|
Цитата:
Сообщение от Андрей К.
Доброго времени суток.
Стоит задача: из списка дисплейметодов определенной таблицы(список уже реализован) необходимо выбрать интересующий метод (хранится лишь его название) и выводить значение этого дисплейметода у текущего курсора. может кто-тоо сталкивался с подобным и подскажет, как, зная имя метода, достать его значение ? заранее благодарен Я бы реализовал это так: Отмапить таблицы и реализовать на мапе n методов, которые делегируют поведение соответствующим методам таблиц. На форме показывать мап. На форме же реализовать дисплей, который выберет один из n методов мапы и делегирует ему свое поведение. В чем приемущество: легко дебажить и код читаемый т.к. нет метапрограммирования. Подозреваю, что и работать будет быстрее P.S. А еще лучше вывести все n методов в грид и просто управлять видимостью
__________________
Isn't it nice when things just work? |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
03.06.2008, 15:55 | #11 |
Участник
|
Цитата:
Написано "который веберет" Кто выберет? Пользователь? Как он выберет? По названию метода? А пользователю что-нибудь говорит название метода? Т.е. на самом деле варианта два: 1. машиноориентированный: Заставлять пользователя выбирать из названий методов. Никаких хелпов, подсказок, описаний. Если пользователю что-то непонятно, то он должен лезть в код. Т.е. этот подход рассчитан на программиста, а не на пользователя. 2. человекоориентированный: сделать обертку над методами, чтобы дать описания, инструкции, хелпы, подсказки и прочую мутотень. Скорее всего, описания должны быть не на программистком матерном, а на пользовательском языке - языке предметной области. Если все равно делается обертка, то поставленная в исходном сообщении задача НЕ ИМЕЕТ практического смысла. В обертке все равно будет switch/case по заранее предусмотренным пунктам. Да, конечно, если программист захочет добавить функционал, то в первом случае он должен добавить всего лишь один метод, а во втором - расширить обертку. Но это только кажется. Поскольку в первом случае "настраивать" систему сможет только програмист. Поэтому в первом случае программист делает никому не нужную работу - вместо того, чтобы просто запрограммировать выбор в коде, он делает никому не нужный интерфейс, которым сможет воспользоваться только он сам (и то только в первое время - потом забудет как это работает и все равно полезет в код по новой). |
|
03.06.2008, 16:07 | #12 |
Участник
|
Если на проекте сознательно выбирается машиноориентированный программистский подход, то я бы предпочел такое решение, нежели динамическое программирование (DictTable-CallObject) без проверок и с постоянной угрозой runtime-ошибок.
|
|
03.06.2008, 19:12 | #13 |
Участник
|
Цитата:
На самом деле, вариант один: программистский! Поскольку все-равно, рано или поздно, но программисту придется лезть в код, чтобы понять, "как оно тикает". Всякие там "человекоориентированные" настройки - это кажущаяся автоматизация. Количество разных птичек и галочек в Axapte просто безумное. Ни один человек не в состоянии их всех упомнить. Вот и получается такое "гуано". Птичек уж больно много . А если еще вспомнить про текучку кадров, изменение ТЗ в процессе разработки, постянные авралы и т.д. и т.п., то ... Нет, лучше не вспоминать Собственно, написание "человекоориентированного" интерфейса задача сопоставимая с написанием подробной справки по данному функционалу. Сопоставимая по результату. Хотя "настоящие программисты", конечно, не пишут не то, что справку, а даже комментарии в коде Я бы рассмотрел задачу написание ОДНОГО метода, но который возвращает разные значения в зависимости от переданных параметров. Ну, или метод-диспетчер (класс-диспетчер), который вызывает соответствующие методы через switch/case. А в качестве параметра использовать BaseEnum, который "человеческим" языком объясняет какой метод надо вызывать. Чем проще функционал, тем тебе же потом будет легче. Кто же еще снова полезет ковырятся в этом коде |
|
03.06.2008, 20:20 | #14 |
NavAx
|
Цитата:
Сергей как раз говорит, что лучше захардкодить все реально существующие варианты, чем ваять очередное "универсальное решение" на все случаи жизни. Мне недавно пришлось столкнуться с настройкой, в которой нужно выбрать класс, который будет производить рассчет. Ни консультанту ни программисту от таких решений не легче. Консультант все равно до конца не понимает, чем один класс от другого отличается. А разработчику совсем беда, дебажить рассчет, который эти классы использует, практически не реально. И даже писатель стоящих скилзов не получил. Писать такие модификации не сложно, гордиться здесь нечем
__________________
Isn't it nice when things just work? |
|
03.06.2008, 21:00 | #15 |
Участник
|
Так я с этим и не спорю. Я "прицепился" к делению интерфейса на "машино-" и "человеко-" ориентированный в том понимании, как это описал Сергей. Как мне кажется, разница между ними в такой постановке весьма условная.
|
|
03.06.2008, 23:48 | #16 |
Участник
|
Я и не говорил, что стандартная Аксапта - идеал человекоориентированного подхода. И российская, и международная.
Цитата:
Но они так по-дурацки расставлены Цитата:
Написание человекоориентированного интерфейса - самая простая задача, если понять что же человек на самом деле хочет. Просто решайте ЕГО проблемы, а не свои собственные. Может быть, не спорю. |
|
03.06.2008, 23:50 | #17 |
Участник
|
Цитата:
Уровень желчи от этого резко поднимается... |
|
04.06.2008, 07:25 | #18 |
Мрачный тип
|
Цитата:
А потом при появлении нового варианта перетачивать на (N+1)-угольное, то бишь допрограммируя ? Цитата:
Цитата:
Дебажить беда ? Дебажится аки "отче наш", единственная проблема навскидку видится в невозможности увидеть внутреннюю структуру объекта нашего класса, создаваемого через абстрактный объект, в области его жизни, однако при вызове любых методов оного - все как на ладони внутри этих методов. Ежели есть еще какие подводные камни - поведайте, буду весьма благодарен, особенно если на проекте в аттачменте приведете примеры таких проблем. Цитата:
Спорить можно долго, но давайте озадачимся вопросом - зачем они вообще были сделаны в системе, эти возможность и доступность вызова метода класса по имени для разработчика ? Атавизм это или возможность расширения ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 04.06.2008 в 07:33. Причина: XPO-шку забыл вклеить |
|
04.06.2008, 09:09 | #19 |
Участник
|
|
|
04.06.2008, 09:28 | #20 |
Administrator
|
Немного ОФФ:
Приятели, занимающиеся 1С (естественно не на внешнем проекте ), рассказывали, как они сделали красную кнопку "Сделать ВСЕ", которая при нажатии чего-то делала (сообщения выдавала), после чего выводилось сообщение - "Все сделано. Повторить?" Естественно - все было муляжом - однако какая была реакция пользователей! Всем очень понравилось - у некоторых даже вопросов не возникло... Вот только руководство озадачилось - а что же кнопка делает? Ну конечно - до скандала доводить не стали - все убрали. Но зато все прониклись, как поучительным примером.
__________________
Возможно сделать все. Вопрос времени |
|