zoukankan      html  css  js  c++  java
  • 宏的使用

    宏带给人的印象坏的远多于好的,即使没有写过程序的人也知道宏病毒,每次打开带有宏的Excel的时候都要提醒你是否要打开,打开可能会染毒的警告.
    从程序实现的角度讲,Axapta中的宏跟Excel中的宏没什么区别,都是一段可执行代码,或者一个变量的定义,当然打开Axapta的时候不会因为有宏的存在就提醒你要不要打开Axapta,呵呵.
    另外对于X++的程序员来说,宏带来的也是负面多余正面,因为宏不能精确定义出错的行,写起代码来确实很不方便.
    但是一个事物存在总有它的道理,所谓存在即合理.
    宏有什么好处那?我的理解是宏提供了一个集中管理代码的方式,这不正是所谓的OO要达到的封装变化的目的吗?不能用类和方法代替吗?大多数情况下是可以的,但是也有例外.
    我接触最多的关于宏的使用是pack,unPack这两个方法的使用,还有就是库存模块中的几个宏.
    随便打开一个继承自Runbase的类,都会在classdeclaration发现如下宏的定义:
        #define.CurrentVersion(1)
        
    #define.version1(1)
        #localmacro.CurrentList
             localVar1,
             localVar2
        #endmacro
    其中localvar1,localVar2等是类中的变量,CurrentVersion代表存放在数据库中的变量的版本.
    在pack和unpack中使用的情况如下(以pack为例)
    public container pack()
    {
        
    return [#CurrentVersion,#CurrentList];
    }
    当然这个可以用get方法或者直接把变量放到[]里来实现,但我这里用宏更简单,至少可以在类定义的地方修改,不是吗?
    如果说上述需求还可以变通实现的话,库存模块中的几个宏,我还真想不出变通的方法.以#InventDimJoin为例,该宏的定义如下:
    /* %1 InventDimId           */
    /* %2 InventDim             */
    /* %3 InventDimCriteria     */
    /* %4 InventDimParm         */
    /* %5 Index hint            */

    join tableId from 
    %2
        #ifnot.empty(
    %5)
            index hint 
    %5
        
    #endif
        where (
    %2.InventDimId       == %1&&
              (
    %2.ConfigId          == %3.ConfigId              || ! %4.ConfigIdFlag)           &&
              (
    %2.InventSizeId      == %3.InventSizeId          || ! %4.InventSizeIdFlag)       &&
              (
    %2.InventColorId     == %3.InventColorId         || ! %4.InventColorIdFlag)      &&
              (
    %2.InventLocationId  == %3.InventLocationId      || ! %4.InventLocationIdFlag)   &&
              (
    %2.InventBatchId     == %3.InventBatchId         || ! %4.InventBatchIdFlag)      &&
              (
    %2.WMSLocationId     == %3.WMSLocationId         || ! %4.WMSLocationIdFlag)      &&
              (
    %2.WMSPalletId       == %3.WMSPalletId           || ! %4.WMSPalletIdFlag)        &&
              (
    %2.InventSerialId    == %3.InventSerialId        || ! %4.InventSerialIdFlag)

    #InventDimDevelop
    调用代码,以InventSumPhysical类中的setValueQty为例:
    select sum(physicalValue),sum(received),sum(deducted),sum(registered),sum(picked) from inventSum
                where inventSum.itemId      
    == itemId       &&
                      inventSum.closed      
    == NoYes::No
            #inventDimJoin(inventSum.InventDimId,inventDim,inventDimCriteria,inventDimParm);
    类方法中的代码跟宏#inventDimJoin拼凑成了一段代码,还真想不出除了宏还有什么其他办法可以这样玩,当然可以把这些宏直接硬编码到各个类方法中,但是这样的结果是灾难性的,正是这里采用了宏,才使得增加物料维组有了可能,要不然每增加一个物料维组,修改这些代码就要累死人.
  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/539256.html
Copyright © 2011-2022 走看看