Код метода 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));
Т.е. в данном случае, это необходимо, если не охота дублировать код. Если же принципиально не использовать передачу функции, как аргумента, то этого можно избежать, конечно. Но за это придется поплотиться дублированием кода.