Показать сообщение отдельно
Старый 19.01.2008, 15:27   #15  
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));
Т.е. в данном случае, это необходимо, если не охота дублировать код. Если же принципиально не использовать передачу функции, как аргумента, то этого можно избежать, конечно. Но за это придется поплотиться дублированием кода.