新手编写的Java OOP 3D几何求积代码是否合格?如何优化更简洁?
代码质量评价与优化建议
作为新手写的代码已经合格了,核心功能可正常运行,也用到了OOP的封装、继承基础概念,逻辑拆分没有全部堆在main方法里,符合入门级OOP演示的基础要求。但仍有不少优化空间,结合你要演示OOP概念的需求,调整后代码会更简洁、更符合OOP设计规范。
现存问题与优化方案
1. OOP设计缺陷:未利用多态,重复代码多
- 问题:所有形状类没有统一的抽象父类/接口,main方法的switch分支里存在大量重复的打印逻辑,新增形状需要修改switch代码,不符合OOP的开闭原则。
- 优化:定义公共的
Shape接口/抽象类,声明getCurvedSurfaceArea()、getTotalSurfaceArea()、getVolume()三个公共方法,所有形状类实现该接口,main方法中实例化对应形状后可以统一调用方法打印结果,不需要每个分支写重复逻辑。
2. 逻辑耦合严重,职责划分不清
- 问题:
- 形状类既负责计算面积体积,又负责和用户交互输入参数,不符合单一职责原则
- Cube类的
side属性在CSA()方法中才赋值,没有在构造方法初始化,如果调用顺序是先调用TSA/Volume,会得到错误的0值,逻辑有严重隐患 - 半球直接复用Sphere类的方法计算后除以2的逻辑非常奇怪,既不符合"半球是独立形状"的认知,也容易出现逻辑错误
- 优化:
- 把参数输入逻辑从形状类中完全抽离,形状类的构造方法直接接收参数值,只负责计算逻辑
- 单独实现
Hemisphere类实现Shape接口,不要复用Sphere的逻辑硬算
3. 代码规范&细节问题
- 类名
singleInputShapes不符合Java大驼峰命名规范,且滥用继承:该类只是提供公共输入方法,和Cube、Sphere不是"is-a"的关系,不应该用继承 - 每次调用输入方法都新建
Scanner实例,资源浪费,全局复用一个Scanner实例即可 - 方法返回值类型不统一:Sphere的CSA返回double,其他形状返回float,容易出现精度问题
- 存在明显bug:case4打印体积时文案写错成了"Volume of Cylinder",应该是Cone
java.lang是Java默认导入的包,不需要显式写import语句CSA、TSA这类缩写建议加注释说明,或者直接写全称为getCurvedSurfaceArea()提升可读性
优化后核心代码示例
// 统一形状接口 interface Shape { double getCurvedSurfaceArea(); double getTotalSurfaceArea(); double getVolume(); } // Cube实现示例 class Cube implements Shape { private final double side; // 构造方法直接接收参数,不处理输入 public Cube(double side) { this.side = side; } @Override public double getCurvedSurfaceArea() { return 4 * side * side; } @Override public double getTotalSurfaceArea() { return 6 * side * side; } @Override public double getVolume() { return side * side * side; } } // 其他形状类同理实现Shape接口即可
优化后main方法的switch分支只需要处理参数输入、实例化对应形状,后续打印逻辑可以完全复用:
// 全局复用一个Scanner Scanner scanner = new Scanner(System.in); int shapeNumber = Mensuration.selectShape(scanner); Shape shape = null; String shapeName = ""; switch (shapeNumber) { case 1 -> { shapeName = "Cube"; System.out.print("Enter Side: "); shape = new Cube(scanner.nextDouble()); } // 其他形状的参数输入、实例化逻辑同理 } // 统一打印结果 System.out.printf("- - - - - %s - - - - -\n", shapeName); System.out.println("Curved Surface Area: " + shape.getCurvedSurfaceArea()); System.out.println("Total Surface Area: " + shape.getTotalSurfaceArea()); System.out.println("Volume: " + shape.getVolume()); // 特殊形状比如圆锥额外打印斜高即可
内容的提问来源于stack exchange,提问作者saman
相关产品推荐
相关产品推荐

