跳转至

实验环境及代码规范

实验环境

  1. Java 17 及以上版本.
  2. RARS.
  3. 编译工作台 (可选)

Java 语言标准

使用 Java 最新的 LTS 版本, 即 Java 17. Java 17 以上以及 Java 17 处于 preview 的特性都不建议使用, 方便统一批改.

鼓励使用 Java 的新特性以及新的标准库 API, 如:

Java 代码注意事项

Java 是一个很 OOP 的语言, 在使用 Java 完成本实验时请注意之前所学的面向对象的六大原则.

依赖倒转原则(DIP)

依赖倒转原则 (DIP) 是指一种特定的解耦 (传统的依赖关系建立在高层次上, 而具体的策略设置则应用在低层次的模块上) 形式, 使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象.

  1. 高层次的模块不应该依赖于低层次的模块, 两者都应该依赖于抽象接口.
  2. 抽象接口不应该依赖于具体实现. 而具体实现则应该依赖于抽象接口.

"面向抽象编程, 面向接口编程"

List<Instruction> porcessInstruction(List<Instruction> originInstructions){
    // some code
    return res;
}
ArrayList<Instruction> porcessInstruction(ArrayList<Instruction> originInstructions){
    // some code
    return res;
}

底米特原则

  1. 每个对象应该对其他对象尽可能最少的知道
  2. 每个对象应该仅和其朋友通信;不和陌生人通信
  3. 仅仅和直接朋友通信

将各个模块统一交由顶层模块进行调用. 各个模块通过顶层模块使用约定好的 api 接口进行传参.

各个模块相互调用, 如链式调用: 当 A, B, C 为同一层级的模块时, Main call A, A call B, B call C ...

Java 程序设计风格

Java 是 Java. 换句话讲, Java 不是 C:

  • 没必要什么数据结构都用数组 (整数索引的表) 来实现, 特别是当这个 "表" 实际上具有更深层的结构的时候.
  • 更深入地, 没必要什么东西都用一个整数来代表. 如果一个对象具有任何与整数不同的性质, 那它就不是整数. 尽量使用对象的引用来引用对象, 而不是拿着一个 int 再去什么地方查询.
  • 字符串是方便使用且默认不可变的, 使用字符串跟使用任何类型相同地方便, 字符串不再是危险且需要托管的.
  • 字符 (Character) 跟字节 (Byte) 是不同的, 前者是任何在特定编码下代表某种自然语言中的最小单元的数据, 后者是一个没有附加结构的 8bit 数据. 不要假设所有字符都是 ASCII 编码下的合法字符.
  • 通用数据结构 (容器/集合类) 是方便且随时可用的, 应该尽可能根据职责拆分需要通用数据结构维护的数据, 而不是集中写一个数据结构来维护所有信息.
  • 对外隐藏是方便且必要的, 每个标识符的访问范围都应该尽可能地小
  • 特殊值是危险的, 在任何需要暴露到包外的接口中, 请使用 Optional 代替返回 null/-1. 或者, 使用异常代替错误值.

对于本实验:

  • 性能大部分时候是无关紧要的, 请尽可能优雅地实现
  • 具体到本实验而言, 输入保证所有字符都是合法的 ASCII 编码. 虽然但是, 你亦应尽可能使用 Character 中的方法, 而非直接判断 ASCII 编码大小.