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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.01.2008, 11:06   #1  
lemchey_white is offline
lemchey_white
Участник
Axapta Retail User
 
22 / 13 (1) ++
Регистрация: 08.08.2007
Передача функции в качестве параметра
Всем доброго времени суток, подскажите пожалуйста возможна ли передача функции в другую функцию в качестве параметра?
Старый 18.01.2008, 11:22   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
А.... еще один поклонник фунционального программирования?
А что есть в Аксапте функция?
В метод класса можно передать объект, а в самом методе вызвать его метод (то бишь функцию), если я вас правильно понял.
Старый 18.01.2008, 11:35   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Можно передать объект и название функции строкой. Вызвать метод через DictClass.
Старый 18.01.2008, 11:42   #4  
lemchey_white is offline
lemchey_white
Участник
Axapta Retail User
 
22 / 13 (1) ++
Регистрация: 08.08.2007
Да, спасибо именно так и сделал
Старый 18.01.2008, 13:48   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от lemchey_white Посмотреть сообщение
Всем доброго времени суток, подскажите пожалуйста возможна ли передача функции в другую функцию в качестве параметра?
Цитата:
Сообщение от Андре Посмотреть сообщение
А.... еще один поклонник фунционального программирования?
точно-точно.

Аксапта - объектно-ориентированная система.
в ООП не передают функции.
в ООП создают семейство классов, в наследниках указывают функции
и передают объект нужного типа.

кроме всего прочего, за счет этого осуществляется дополнительный контроль типов.

поэтому напишите обертку над вашими функциями.
пример - класс SysFileDeployment и его наследники, которые переопределяют функцию filename
__________________
полезное на axForum, github, vk, coub.
Старый 18.01.2008, 13:49   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от EVGL Посмотреть сообщение
Можно передать объект и название функции строкой. Вызвать метод через DictClass.
а вот это хакерство, чреватое runTime ошибками.
сделать так конечно можно. но я бы расстрелял исполнителя, который выбрал бы на моем проекте такую реализацию в Аксапте.
__________________
полезное на axForum, github, vk, coub.
Старый 18.01.2008, 20:18   #7  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Маззи, у нас сделана доработка в документообороте, что можно использовать и Дисплей-методы
Если подан параметр правильно, то никаких проблем - methodStr и тому подобные
Старый 18.01.2008, 20:25   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Delfins Посмотреть сообщение
Если подан параметр правильно, то никаких проблем - methodStr и тому подобные
А если неправильно, то runTime error Я об этом и говорю.

как скажете.
__________________
полезное на axForum, github, vk, coub.
Старый 18.01.2008, 20:26   #9  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от Delfins Посмотреть сообщение
Маззи, у нас сделана доработка в документообороте, что можно использовать и Дисплей-методы
О! Не только у Вас.
Старый 18.01.2008, 22:23   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Расскажите подробнее, что за доработка, и какую цель преследует, будьте так любезны.

Последний раз редактировалось kashperuk; 18.01.2008 в 22:24. Причина: описался :)
Старый 19.01.2008, 01:12   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
>>>в ООП не передают функции.

Самый что ни на есть объектно ориентированный смолток, например, вообще не содержит управляющих конструкций. Вместо них есть методы, которым передают блоки
The Smalltalk Language

X++:
"Prints the integers between 1 and 10, and a string stating whether each is even or odd"
1 to: 10 do: [:n |
	n even ifTrue: [
		Transcript show: n; show: ' is even'; cr]
	ifFalse: [
		Transcript show: n; show: ' is odd'; cr]
]
Здесь:
1 to: 10 do: <блок>
to:do: - это сообщение которое посылается объекту "число единица" с параметрами 10 и блоком (по сути дела анонимной функцией)

В обзщем в чистых объектноориентированнх языках все есть объект и даже функции это объекты, которые могут передаваться в качестве параметров, храниться в коллекциях и прочее.

Но в целом, я согласен с Маззи, что в X++ это выглядит настолько криво, что надо сильно взвещивать количество геморроя, использовать всяческие intristic functions типа methodStr или покрывать использоваение тестами.

Еще стоит напомнить, что есть такая вещь как интерфейсы, а рантайм при вызове методов типы классов не проверяет, а просто иет методы по имени.

То есть интерфейсы можно использовать для декларации вызова функционала, при этом не обязательно декларировать то, что класс имплементит этот функционал (им это даже может быть не класс, а недокласс, например, форма).

То есть реально рантайм поддерживает "утиную типизацию" хотя на уровне проверки при компиляции и IDE поддерживается манифестная статическая типизация.

Этим можно пользоваться и пользуются.
Старый 19.01.2008, 10:55   #12  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от belugin Посмотреть сообщение
Но в целом, я согласен с Маззи, что в X++ это выглядит настолько криво, что надо сильно взвещивать количество геморроя, использовать всяческие intristic functions типа methodStr или покрывать использоваение тестами.
Думаю, что для бизнесс логики, действительно будет выглядеть немного не в тему, т.к. теряется читаемость и наглядность кода. Но для всяких "платформенных" доработок, как в данном случае, вполне сгодиться (в принципе там другого выхода и нет). Лишь бы использовать с умом.

Кстати, проверка в runtime, на наличие у класса функции с определенным именем есть (также как и для таблицы и, по-моему для формы), так что при граммотном написании кода, никаких проблемм не вижу.

Последний раз редактировалось petr; 19.01.2008 в 14:46. Причина: Ошибки
Старый 19.01.2008, 12:33   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от petr Посмотреть сообщение
"платформенных" доработак, как в данном случае, вполне сгодиться (в принципе там другого выхода и нет).
Расскажи, пожалуйста, почему нет другого выхода?
Старый 19.01.2008, 15:27   #14  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Код метода RunBase::getDescription
X++:
/*MAN
Returns a helptext of the class with the specified classId.
*/
client server static HelpTxt getHelpText(classId _classNum)
{
    ExecutePermission casPerm = new ExecutePermission();
    SysDictClass    classObj;
    str             staticName = identifierstr(helpText); // ***

    if (! _classNum)
        return '';

    classObj = new SysDictClass(_classNum);
    if (classObj.hasStaticMethod(staticName))
    {
        casPerm.assert();

        //BP Deviation Documented
        return classObj.callStatic(staticName);
    }
    else
        return '';
}
Код метода RunBase::getHelpText
X++:
/*MAN
Returns a helptext of the class with the specified classId.
*/
client server static HelpTxt getHelpText(classId _classNum)
{
    ExecutePermission casPerm = new ExecutePermission();
    SysDictClass    classObj;
    str             staticName = identifierstr(helpText); // ***

    if (! _classNum)
        return '';

    classObj = new SysDictClass(_classNum);
    if (classObj.hasStaticMethod(staticName))
    {
        casPerm.assert();

        //BP Deviation Documented
        return classObj.callStatic(staticName);
    }
    else
        return '';
}
Весь код в классах повторяется, только строчки выделенные тремя звездочками. Почему бы из не передавать в класс как аргумент?

А если таких методов будет сотня. Копировать все код сотню раз? Не лучше ли написать одну функцию наподобие такой:
X++:
client server static AnyType getProperty(classId _classNum, SysMethodName _methodName)
{
    ExecutePermission casPerm = new ExecutePermission();
    SysDictClass    classObj;

    if (! _classNum)
        return '';

    classObj = new SysDictClass(_classNum);
    if (classObj.hasStaticMethod(_methodName))
    {
        casPerm.assert();

        //BP Deviation Documented
        return classObj.callStatic(_methodName);
    }
    else
        return '';
}
И вызывать ее из кода:
X++:
RunBase::getProperty(classidget(this), identifierstr(helpText));
Т.е. в данном случае, это необходимо, если не охота дублировать код. Если же принципиально не использовать передачу функции, как аргумента, то этого можно избежать, конечно. Но за это придется поплотиться дублированием кода.
Старый 19.01.2008, 17:40   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
в принципе это не очень хорошо - такой вызов статических методов. Например, эти самые дескрипшены не наследуются. Здесь вполне можно было сделать без статика.
X++:
ClassDescription description()
{
}
Кстати, из за статичности метода main, его приходится дублировать во всех потомках....
Старый 19.01.2008, 18:52   #16  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Ну, я может не самый удачный пример привел. Просто хотел показать, что конструкция:
X++:
    classObj = new SysDictClass(_classNum);

    if (classObj &&
        classObj.hasStaticMethod(staticName))
    {
        casPerm.assert();

        //BP Deviation Documented
        return classObj.callStatic(staticName);
    }
или
X++:
    classObj = new SysDictClass(_classNum);
    object   = classObj.makeObject();

    if (classObj &&
        classObj.hasObjectMethod(objectName))
    {
        casPerm.assert();

        //BP Deviation Documented
        return classObj.callObject(objectName, object);
    }
имеет право на существование, и без нее не реализовать некоторые вещи проблематично (я ухожу от кванвора всеобщности), а уж как она получит название метода (либо из константы, либо как параметр функции) - это не так уж и важно.

И во втором случае, как раз и получается передача функции (в нашем случае ее имени) как параметр.

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

Цитата:
Сообщение от belugin Посмотреть сообщение
Кстати, из за статичности метода main, его приходится дублировать во всех потомках....
Мне вот только немного непонятно про дублирование метода main.

Если наследник по сути делает тоже самое, что и родитель (только немного иначе), у него метод main я и не перекрываю, просто в construct родителя инициализирую класс наследника.

Если же наследник делает что-то другое, то и menuitem другая, и в наследнике свой main и я не считаю, что в данном случае это будет дублированием.
За это сообщение автора поблагодарили: alex55 (1).
Старый 19.01.2008, 21:09   #17  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
И еще насчет description

То, что этот метод статический, удобно использовать при проверке входных условий при вызове класса в main. Если какое-либо условие не выполняется, то можно вывести сообщение об ошибке без инициализации класса (которая невозможна при неправильных входных данных), т.е. не надо копировать метку из description в сообщение об ошибке, а просто написать что-то подобное:

X++:
public static void main(Args args)
{
    MyClass     myClass1;
    ;
    
    if (! args.record())
        throw error(Error::missingRecord(MyClass::description()));
        
    // etc...
}
Хотя в стандарте туда часто передают funcname(), но мне кажется, что MyClass::description() в данном случае информативнее. А создавать для этого исключения специально отдельную метку лениво.
Старый 21.01.2008, 07:50   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от lemchey_white Посмотреть сообщение
Всем доброго времени суток, подскажите пожалуйста возможна ли передача функции в другую функцию в качестве параметра?
Цитата:
Сообщение от petr Посмотреть сообщение
Просто хотел показать, что конструкция
имеет право на существование, и без нее не реализовать некоторые вещи проблематично (я ухожу от кванвора всеобщности), а уж как она получит название метода (либо из константы, либо как параметр функции) - это не так уж и важно.
Вам не кажется, что в ходе обсуждения произошла подмена вопроса?

Во-первых, это пример не передачи "функции", а вызова совершенно конретной для разных классов.

Во-вторых, продолжаю настаивать, что вместо "передачи функции" более правильным способом является создание семейства классов, в каждом из наследников которого имеется своя реализация "функции", а затем передавать объект и вызывать эту реализацию.

В-третьих, готов согласиться, что в некоторых случаях создание и поддержка подобного семейства является более трудоемким нежели грамотные проверки до вызова. Но число таких случаев сильно ограничено. И каждый случай должен быть хорошо обоснован программистом.

В большинстве случаев не надо передавать методы.
В большинстве случаев надо создавать семейства классов (пример SysFileDeployer, axdBase, ImageListAppl, LedgerBalance и т.п.)

В стандартной ax4.0 sp2 имеется всего 128 случаев работы с методами напрямую.
многие из этих случаев являются антипаттернами (показывают как НЕ надо делать)

Код:
Class SysDictClass.hasObjectMethod
\Data Dictionary\Tables\AifPipelineComponent\Methods\description
\Classes\SysDictClass\hasObjectMethod
\Classes\AxInternalBase\setParmMethodAsNotMandatory
\Classes\AxdBase\setParmMethodAsMandatory
\Classes\BatchJournalRun\canClassGoBatchJournal
\Classes\SysBPCheckMemberFunction\checkUseOfCASProtectedAPIs
\Classes\SysLabelFind\controlName2Id
\Classes\SysTest\hasMethod
\Forms\AifPipelineComponent\Data Sources\AifPipelineComponent\Methods\active
\Forms\AifPipelineComponent\Methods\generateComponentLookupTable
\Forms\SysRecordTemplateTable\Methods\disableIfButton
\Forms\SysRecordTemplateTable\Methods\disableIfHasDataMethod

Class SysDictClass.hasStaticMethod
\Classes\RunBase\getDescription
\Classes\SysDictClass\hasStaticMethod
\Classes\RunBase\getHelpText
\Classes\SysBPCheckClassNode\checkConstructors
\Forms\SysClassWizard\Methods\frameworkSetDescription

class SysMethodInfo
\Classes\SysDictClass\hasObjectMethod
\Classes\Global\tableHasInstanceMethod
\Classes\Global\tableHasStaticMethod
\Classes\SysDictClass\hasStaticMethod
\Classes\RunBaseReport\initReportRun
\Classes\SysMethodInfo\path
\Classes\AxdBaseCreate\insertInPropertyInfoMap
\Classes\AxdBaseGenerateXSD\addClassProperties
\Classes\AxdBaseGenerateXSD\addDocumentProperties
\Classes\AxdBaseRead\buildMethodInfoMap
\Classes\WebLet\getDescription
\Classes\WebLet\getHelpText
\Classes\WebLet\inContext
\Classes\WebLet\isEnabled
\Classes\ProjListProjTransLayout\setNoOfDecimals
\Classes\SysApplicationObjectPathInfo\methodInfo
\Classes\xUtilElements\runMode
\Classes\SysBPCheckClassNode\checkAbstract
\Classes\SysBPCheckClassNode\checkConstructors
\Classes\SysBPCheckClassNode\verifyConstructMethod
\Classes\SysMethodInfo\getSource
\Classes\SysBPCheckFormEditControl\checkLabelUse
\Classes\SysBPCheckMemberFunction\check
\Classes\SysBPCheckMemberFunction\checkSource
\Classes\SysBPCheckMemberFunction\checkAccessSpecifier
\Classes\SysBPCheckMemberFunction\checkVariables
\Classes\SysMethodInfo\superMethodInfo
\Classes\SysMethodInfo\subMethodInfoList
\Classes\SysBPCheckMemberFunction\checkAOS
\Classes\SysMethodInfo\runMode
\Classes\SysBPCheckMemberFunction\initTmpxRefReferences
\Classes\SysBPCheckMemberFunction\classDeclaration
\Classes\SysBPCheckMemberFunction\checkHelpUse
\Classes\SysBPCheckMemberFunction\checkLabelUse
\Classes\SysBPCheckMemberFunction\checkUsed
\Classes\SysBPCheckMemberFunction\checkUsedMemberFunction
\Classes\SysBPCheckMemberFunction\checkUsedMemberFunctionServer
\Classes\SysBPCheckMemberFunction\pseuduUtilElements
\Classes\SysBPCheckMemberFunction\checkVariablesUse
\Classes\SysBPCheckMemberFunction\dispose
\Classes\SysBPCheckMemberFunction\init
\Classes\SysBPCheckReportControl\checkGeneral
\Classes\SysBPCheckReportControl\checkLabelUse
\Classes\SysFormBuildDataSource\getMethodInfo
\Classes\SysLabelFind\doFormEditControl
\Classes\SysMethodInfo\superMethodNode
\Classes\SysMethodInfo\toString
\Classes\SysSecurity\getFormDisplayMethods
\Classes\SysTreenodeWashClassNode\checkConstructors
\Classes\xUtilIdElements\runMode

Class DictMethod
\Classes\smmSalesManagementQueries\allowedMethods
\Classes\RunBase\checkCloseDialog
\Classes\AifServiceableMethodValidator\validateMethodSignature
\Classes\AifServiceableMethodValidator\hasMethod
\Classes\AifServiceableMethodValidator\hasPublicAccess
\Classes\AifServiceableMethodValidator\hasValidParameters
\Classes\AifServiceableMethodValidator\hasValidReturnType
\Classes\AifServiceableMethodValidator\validateReceiveDocument
\Classes\AifServiceableMethodValidator\validateReceiveDocumentList
\Classes\AifServiceableMethodValidator\validateSendDocument
\Classes\AifServiceableMethodValidator\validateSendDocumentList
\Classes\AifServiceableMethodValidator\validateQueryDocuments
\Classes\AifServiceableMethodValidator\validateQueryEntityKeys
\Classes\AifServiceableMethodValidator\validateProcessEntity
\Classes\AifServiceableMethodValidator\validateProcessEntityList
\Classes\AifWebMethodGenerator\getWebMethodParameterTypes
\Classes\EditorScripts\getApplicableScripts
\Classes\EditorScripts\showScripts
\Classes\LedgerGDPdUDataExport\findSMethodBaseType
\Classes\LedgerGDPdUDataExport\findSNumOfDecimals
\Classes\LedgerGDPdUDataExport\findMethodBaseType
\Classes\LedgerGDPdUDataExport\findNumOfDecimals
\Classes\LedgerGDPdUFieldWizard\fillMethodNameList
\Classes\SysDictClass\invokeObjectMethod
\Classes\SysApplCheck\checkTableFieldPnameMustBeUnique
\Classes\SysApplCheck\checkTreeNodeNameConflicts
\Classes\SysApplCheck\showTableMethodsRunOn
\Classes\SysAutoRun\execRun
\Classes\SysBPCheckClassNode\checkRunBaseImplementation
\Classes\SysBPCheckFormEditControl\checkReference
\Classes\SysBPCheckMemberFunction\checkDiscontinuation
\Classes\SysBPCheckTable\checkFieldPnameUniqueness
\Classes\SysClassWizard\createAbstractMethods
\Classes\SysCodeCoverage\postUpdate
\Classes\SysDictClass\isInheritedVariable
\Classes\SysExcelTemplateField\type
\Classes\SysExcelTemplateField\extendedTypeId
\Classes\SysExcelTemplateField\help
\Classes\SysExcelTemplateField\label
\Classes\SysHelpBookDocumentationDeveloper\genApplClassMethodHelp
\Classes\SysHelpBookDocumentationDeveloper\genApplTableMethodHelp
\Classes\SysHelpBookDocumentationSystem\methodSyntax
\Classes\SysHelpBookDocumentationDeveloper\genParmMethodHelp
\Classes\SysHelpBookDocumentationDeveloper\genConstructMethodHelp
\Classes\SysHelpBookDocumentationDeveloper\processLabels
\Classes\SysHelpBookDocumentationSystem\actualDictMethod
\Classes\SysHelpBookDocumentationSystem\genClassMethodHelp
\Classes\SysHelpBookDocumentationSystem\processLabels
\Classes\SysHelpClassMethodWebLet\designView
\Classes\SysMethodInfo\classDeclaration
\Classes\SysTestCase\testMethods
\Classes\SysUmlObjectModel\reverseEngineerClassProperties
\Classes\SysUmlObjectModel\reverseEngineerMethod
\Classes\SysUmlObjectModel\reverseEngineerParameters
\Classes\SysUmlObjectModel\reverseEngineerTableProperties
\Classes\WebReportGraph\makeTitle
__________________
полезное на axForum, github, vk, coub.
Старый 21.01.2008, 11:27   #19  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Расскажите подробнее, что за доработка, и какую цель преследует, будьте так любезны.
В документах, генерируемых документооборотом Аксапта по шаблонам Excel или Word, хочется выводить не только поля, но и display-методы, программируемые под конкретную ситуацию.

Действительно, модель данных DAX достаточно денормализованная, и связи порой не только 1:1, чтобы обойтись простыми джойнами справа. Иногда нужна еще и логика посложнее, чем "выводить всегда то, что есть в поле".

Если хотите, приведу код. Особым секретом он не является, более того, мне такое даже и не хочется держать в вертикальном решении. При этом ошибок времени исполнения (см. mazzy) в таком случае возникать не может, поскольку сигнатура у всех display-методов одинаковая, и проверить наличие метода тоже труда не составляет.
Старый 21.01.2008, 22:24   #20  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от petr Посмотреть сообщение
То, что этот метод статический, удобно использовать при проверке входных условий при вызове класса в main. Если какое-либо условие не выполняется, то можно вывести сообщение об ошибке без инициализации класса (которая невозможна при неправильных входных данных), т.е. не надо копировать метку из description в сообщение об ошибке
Хотя в стандарте туда часто передают funcname(), но мне кажется, что MyClass::description() в данном случае информативнее. А создавать для этого исключения специально отдельную метку лениво.
Проверка входных условий в main() редко может проходить неуспешно в ходе штатного вызова этого метода класса. А потому информация об ошибке должна быть рассчитана не столько на пользователя, сколько на разработчика, которому classstr(MyClass) скажет гораздо больше, чем какая-то там метка, возвращаемая из description(). Так что использование в стандарте той же funcname() несет больше информации для тех, кому она необходима, - для разработчиков и специалистов службы поддержки. А пользователям обычно без разницы, не передан в метод активный буфер, не то там значение enum'а или еще что; главное - что оно не работает, и сам пользователь с этим мало что может сделать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передача в Веб-форму объекта в качестве параметра IvanS DAX: Программирование 4 17.04.2008 15:07
Передача параметра laxer DAX: Программирование 2 19.01.2006 09:08
Передача массива как параметра DreamCreator DAX: Программирование 1 26.01.2005 16:58
Передача параметра из формы в отчет liza DAX: Программирование 1 29.09.2003 14:04
Передача параметра в репорт 2 Андре DAX: Программирование 1 29.08.2002 14:09
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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