实验环境及代码规范
实验环境
- Java 17 及以上版本.
- RARS.
- 编译工作台 (可选)
Java 语言标准 
使用 Java 最新的 LTS 版本, 即 Java 17. Java 17 以上以及 Java 17 处于 preview 的特性都不建议使用, 方便统一批改.
鼓励使用 Java 的新特性以及新的标准库 API, 如:
- 模式匹配 instanceof (Java 16)
- 增强的 switch 表达式 (Java 14)
- record 类 (Java 16)
- Stream API 对元素流进行函数式操作 (Java 8)
Java 代码注意事项
Java 是一个很 OOP 的语言, 在使用 Java 完成本实验时请注意之前所学的面向对象的六大原则.
依赖倒转原则(DIP)
依赖倒转原则 (DIP) 是指一种特定的解耦 (传统的依赖关系建立在高层次上, 而具体的策略设置则应用在低层次的模块上) 形式, 使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象.
- 高层次的模块不应该依赖于低层次的模块, 两者都应该依赖于抽象接口.
- 抽象接口不应该依赖于具体实现. 而具体实现则应该依赖于抽象接口.
"面向抽象编程, 面向接口编程"
List<Instruction> porcessInstruction(List<Instruction> originInstructions){
// some code
return res;
}
ArrayList<Instruction> porcessInstruction(ArrayList<Instruction> originInstructions){
// some code
return res;
}
底米特原则
- 每个对象应该对其他对象尽可能最少的知道
- 每个对象应该仅和其朋友通信;不和陌生人通信
- 仅仅和直接朋友通信
将各个模块统一交由顶层模块进行调用. 各个模块通过顶层模块使用约定好的 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 编码大小.