NC二次开发笔记

文章目录

  • 第一章 规范篇
    • 1. 命名规范
  • 第二章 基础篇
    • 1.单据信息

第一章 规范篇

1. 命名规范

  • 类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:(领域模型 的相关命名)DO / BO / DTO / VO 等。
  • 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。
  • 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
  • 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾。
  • 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。 产品模块对外的接口定义放在nc.itf.模块名.xx,
    服务的实现类nc.impl.模块名.xx,后台业务类代码nc.bs.xx,值对象命名:nc.vo.模块名,
    UI层命名:nc.ui.模块名。
  • 杜绝完全不规范的缩写,避免望文不知义。
  • 如果使用到了设计模式,建议在类名中体现出具体模式。
  • 接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁 性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是 与接口方法相关,并且是整个应用的基础常量。接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁 性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是 与接口方法相关,并且是整个应用的基础常量。
  • 对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部 的实现类用 Impl 的后缀与接口区别。
  • 如果是形容能力的接口名称,取对应的形容词做接口名(通常是–able 的形式)。
  • 枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
    ##2. 常量定义
  • 不允许出现任何魔法值(即未经定义的常量)直接出现在代码中。
  • 所有的字符都必须大写。采用有意义的单词组合表达,单词与单词之间以“_”下划线隔开。
  • 命名尽量简短,不要超过16个字符。
  • long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。
  • 不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。如:缓存 相关的常量放在类:CacheConsts 下;系统配置相关的常量放在类:ConfigConsts 下。
  • 常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包 内共享常量、类内共享常量。
    ##3. OOP规范
  • 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。
  • 所有的覆写方法,必须加@Override 注解。加@Override 可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编 译报错。
  • 相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。 说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程) 正例:public User getUsers(String type, Integer… ids)
  • Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 正例: “test”.equals(object)
  • 所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
  • 定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
  • 序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如 果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
  • 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
  • POJO 类必须写 toString 方法。使用 IDE 的中工具:source> generate toString 时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。 说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排 查问题。
  • 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter 方法。
  • 循环体内,字符串的联接方式,使用 StringBuilder 的 append 方法进行扩展。
  • final 可提高程序响应效率,声明成 final 的情况: 1) 不需要重新赋值的变量,包括类属性、局部变量。 2) 对象参数前加 final,表示不允许修改引用的指向。 3) 类方法确定不允许被重写。
    ##4. 集合处理
  • 关于 hashCode 和 equals 的处理,遵循如下规则: 1) 只要重写 equals,就必须重写 hashCode。 2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的 对象必须重写这两个方法。 3) 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。 正例:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象 作为 key 来使用。
  • ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList 。
  • 使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全 一样的数组,大小就是 list.size()。直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它 类型数组将出现 ClassCastException 错误。
  • 使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 UnsupportedOperationException 异常。 asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
  • 不要在 foreach 循环里进行元素的 remove/add 操作。
  • 利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的 contains 方法进行遍历、对比、去重操作。

第二章 基础篇

1.单据信息

  • 设置单据卡片表头区域比例

    ((nc.ui.pub.bill.BillCardLayout)getBillCardPanel().getLayout()).setHeadScale(80);

  • 设置表体页签状态

    显示状态:getBillCardPanel().getBodyPanel("").setVisible(false);
    可用状态:getBillCardPanel().getBillModel(“subbillb”).setEnabled(false);
    当前页签编码:getBillCardPanelWrapper().getBillCardPanel().getCurrentBodyTableCode()

  • 获取单据模板上定义的所有字段

    nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos =
    (nc.vo.pub.bill.BillTempletBodyVO[]) billCardPanel.getTempletData().getChildrenVO();

  • VO的获取

    EventHandler中可以直接调用,可以获取单据对应的缓存数据,getBufferData().getCurrentVO()卡片下为获取当前单据的VO对象,列表下则为获取当前选择行的VO对象。UI类当和EventHandler类在同一个包下时,也可以直接调用该方法。当UI类与EventHandler类不在同一个包下时,可以通过getManageEventHandler()获取EventHandler对象,然后再调用EventHandler的getBufferData()获取缓存数据。

  • 界面取值

    得到单据表体当前被选中的VO:getBillCardPanelWrapper().getSelectedBodyVOs(); //如果没有被选择的行那么返回NULL

  • 从界面上得到VO

    getBillCardPanelWrapper().getBillVOFromUI();//得到界面上全部数据的VO
    getBillListWrapper().getVOFromUI()//被选择行的VO

  • 得到界面变化数据的VO

    (ClientUI)getChangedVOFromUI()或者getBillListWrapper().getChangedVOFromUI()

  • 通过VO的className

    卡片
    getBillCardPanel().getBillData().getBillValueVO(billVOName, headVOName, bodyVOName)
    getBillCardPanel().getBillData().getBillValueChangeVO(billVOName, headVOName, bodyVOName)
    列表
    getBillListPanel().getBillListData().getBillSelectValueVO(billVOName, headVOName, bodyVOName)
    getBillListPanel().getBillListData().getBillSelectValueVOs(billVOName,headVOName, bodyVOName)
    getBillListPanel().getBillListData().getBillValueVO(row, billVOName, headVOName, bodyVOName)

  • 字段设置可编辑:

    getBillCardPanel().getBodyItem(“字段名”).setEdit(true);

  • 隐藏字段

    getBillCardPanel().hideBodyTableCol(“bodyitem”);

  • 代码设置卡片状态下表头和表体某一字段的编辑状态:

    // 表头
    getBillCardPanel().getHeadItem("").setEdit(false);
    // 表体
    getBillCardPanel().getBillModel().setCellEditable(row,“nqichunum”,false);

##3.其他

  • 获取表体选择行

    获取表体的选中行的行号getBillCardPanelWrapper().getBillCardPanel().getBillTable().getSelectedRow();或getBillCardPanelWrapper().getBillCardPanel().getBodyPanel().getTable().getSelectedRow();
    获取编辑行getBillCardPanelWrapper().getBillCardPanel().getBillTable().getEditingRow()
    获取总行数getBillCardPanelWrapper().getBillCardPanel().getBillTable().getRowCount()
    获取列表多条记录的方法
    1.int[] selectRows = ((BillManageUI) getBillUI()).getBillListPanel().getHeadTable().getSelectedRows();
    2.((BillManageUI)getBillUI()).getBillListPanel().getHeadBillModel().getBodySelectedVOs(DemoYsHVO.class.getName());
    其中,方法1只在Ctrl、Shift多选时能取到多条记录的行号。方法2都能取到多选记录的VO。

  • 调用非空验证方法:

    getBillCardPanelWrapper().getBillCardPanel().dataNotNullValidate()

    public void handleAppEvent(CardHeadTailAfterEditEvent e) {
    	// 表头:IBillItem.HEAD 表体:IBillItem.BODY
    	int pos = e.getPos()
    	// 获取触发事件的表头字段
    	String key = e.getKey();
    	// 获取表头关键字对应元素
    	BillItem billItem = e.getBillCardPanel().getHeadTailItem("vdef1");
    	// 设置字段不可编辑
    	billItem.setEdit(false);
    	// 返回单据数据控制
    	e.getBillCardPanel().getBillData();
    }

后续继续补充…

你可能感兴趣的:(NC)