共计 7992 个字符,预计需要花费 20 分钟才能阅读完成。
在技术行业工作了几年,主要是开发软件,我已经习惯了这样的现实:我的大部分时间都花在与不同的团队合作并审查其他软件开发人员编写的代码上。多年来,我在处理不同开发人员编写的代码方面拥有丰富的经验。这些经历从根本上增强了我对干净代码的欣赏。
“事实上,阅读与写作所花费的时间之比远远超过 10 比 1。我们不断地阅读旧代码,作为编写新代码的努力的一部分。……[因此,] 使其易于阅读,从而更容易编写。”
无论您已经成为软件开发人员一段时间还是刚刚起步,我相信您都能体会到继承新代码库时所需的经验和努力。继承代码库通常需要熟悉代码、其结构、功能、编程语言、库、框架以及所使用的任何其他技术。
浏览不熟悉的代码或您不久前编写的代码可能会令人畏惧。无论您是要修复错误、增强功能、提高性能还是加入正在进行的项目,所需的时间和精力都取决于代码的状态。
使用干净的 Java 代码原则编写的代码可以为您节省无数的时间和挫折。另一方面,在处理混乱的代码时,您可能会花费大部分时间来破译混乱的逻辑、未注释的代码和命名不当的变量。
什么是干净的 Java 代码及其好处
干净的代码是编写简单、可读、可测试且易于理解的代码的做法。干净代码的其他特征包括遵守良好的约定和最佳实践,以促进表达性、简洁性、组织性和可维护性。干净的代码还应该没有错误、不合理的复杂性、代码异味和冗余代码。
罗伯特·C·马丁(Robert C. Martin),俗称鲍勃叔叔,撰写了大量关于干净代码主题的文章。想要编写干净代码的各种经验水平的程序员都可以从他关于干净代码的书、文章和一系列演讲中受益。在他的书《清洁代码:敏捷软件工艺手册》中,他说:
“即使是糟糕的代码也能运行。但如果代码不干净,就会让开发组织陷入困境。每年,都会因为代码编写不当而浪费无数的时间和大量资源。但事情不一定非得如此。”
编写干净的 Java 代码的重要性怎么强调都不为过。干净的代码可以立即实现的一些好处包括:
-
可维护性——干净的代码易于修改和更新。
-
调试——干净的代码不太容易出错。隔离和修复代码中的问题也更容易。
-
可扩展性——干净的代码是模块化的、可重用的,并且能够适应未来的变化。
-
协作——清晰的代码使团队成员能够理解彼此的代码。
-
文档– 部落代码是不言自明的,减少了过多注释的需要。
-
效率——干净的代码消除了代码重复和不必要的复杂性,从而提高了性能。
-
可读性——简洁的代码易于阅读、减少混乱并提高可维护性。
如何编写干净的 Java 代码
Java 仍然是一种流行的编程语言。由于它是一种成熟的语言,遗留 Java 代码库对于运行十多年前开发的重要业务软件和基础设施仍然至关重要,并且仍在被成千上万的用户使用。
由于 Java 代码库的寿命很长,因此编写干净的 Java 代码非常重要,以便后续的开发人员可以轻松维护。以下是帮助您编写干净的 Java 代码的最佳实践。
1. 使用标准项目结构
项目结构概述了如何安排项目中的各个组件,例如 Java 源文件、测试文件、文档文件、构建文件和配置文件。清晰的项目结构使理解、导航和修改项目代码库变得容易。另一方面,糟糕的项目结构可能会导致混乱,尤其是在处理具有许多文件的项目时。
尽管 Java 不强制执行特定的项目结构,但 Maven 等构建工具会建议您可以遵循的项目结构。
src
├── main
│ ├── java 应用程序 / 库来源
│ ├── resources 应用程序 / 库资源
│ ├── filters 资源过滤文件
│ └── webapp 网络应用程序源
│
└── test
├── java 测试源
├── resources 测试资源
└── filters 测试资源过滤文件
2. 遵守 Java 命名约定
Java 命名约定是一组规则,规定 Java 开发人员应如何命名标识符。Java 规范文档包括变量、包、类和方法的命名规则。这些命名约定允许开发人员在编写代码时保持秩序。良好的命名可以提高代码的可读性、一致性和可维护性。
一些 Java 命名约定包括:
-
类和接口名称应该是名词,并且首字母大写。
-
方法名称应该是动词。
-
变量名应该简短且有意义。
-
包名称应该小写。
-
常量名称应大写。
package com.example.project;
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFullName() {return firstName + " " + lastName;}
public static final int MAX_AGE = 100;
public boolean hasValidName() {return firstName != null && lastName != null;}
}
您可以在此处找到有关 Java 命名约定的更多信息。(https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html)
3. 可读性优于可重用性
可重用性是软件开发中最受推崇的概念之一。当开发人员非常了解可重用组件时,它可以减少开发时间并减少维护软件所需的工作量。
虽然可重用性的概念听起来很棒并且有很多好处,但它也有许多潜在的陷阱,特别是在处理不熟悉的代码库时。在使用大型应用程序时,如果没有适当的设计,代码的可重用性可能会降低可读性、可用性和可维护性。当代码的可重用性使得在不跟踪执行的情况下难以理解代码的逻辑流程时,会影响代码的可读性。
代码可读性差使得调试变得困难,并增加了维护代码库所需的工作量。这可能具有挑战性,尤其是在尝试让新开发人员加入您的项目时。因此,在开发软件时,请确保不要将可重用性置于可读性之上。
4. 使用静态和动态分析工具检查代码
静态和动态代码分析工具相辅相成。动态和静态分析工具都可以帮助编写干净的 Java 代码。静态分析工具允许您检查应用程序源代码并确保遵守编码标准、发现漏洞并检测开发过程中的错误。
另一方面,动态分析允许您在运行时测试应用程序。它允许您测量应用程序的性能、行为和功能,并识别运行时错误、内存泄漏和资源消耗,从而减少在生产中遇到问题的机会。
5. 使用有意义的注释和文档
痴迷的评论是我一直困扰的事情,尤其是在我的软件开发职业生涯的早期。这是大多数开发人员都在努力解决的问题。注释使用不当表明您的代码是糟糕编程的症状。
正确使用注释和文档对于编写干净的 Java 代码可以发挥重要作用。虽然代码应该可读且不言自明,但有时无法避免复杂的逻辑。但是,通过在代码中使用策略性注释,您可以解释代码中某些并不简单的部分背后的逻辑。
在 Java 中,开发人员可以利用两种类型的注释:文档注释和实现注释。文档注释针对的是代码库用户,而实现注释则针对的是在代码库上工作的开发人员。
/**
* 此类代表用于管理用户资源的 RESTful 控制器。* 它提供用于创建、检索、更新和删除用户的端点。*/
@RestController
@RequestMapping("/api/users")
public class UserController {
/**
* 通过 ID 检索用户。*
* @param id 要检索的用户的 ID。* @return 具有指定 ID 的用户。*/
@GetMapping("/{id}")
public ResponseEntity getUserById(@PathVariable("id") Long id) {// 为简洁起见省略了实现}
/**
* 创建一个新用户。*
* @param user 要创建的用户对象。* @return 创建的用户。*/
@PostMapping
public ResponseEntity createUser(@RequestBody User user) {// 实施在这里}
// 其余代码
6. 使用一致且正确的代码格式:空格和缩进
当您处理个人项目时,代码格式可能看起来不是一个大问题,而该项目的代码可能永远不会由其他开发人员维护。然而,与其他开发人员团队合作时,一致的代码格式和风格至关重要。
如果您希望作为一个团队编写干净的 Java 代码,那么在您的团队和代码库中保持一致的格式和编码风格非常重要。空格和缩进对于保持一致的编码风格至关重要。
良好地使用运算符、逗号和流语句之间的空格可以增强代码的可读性。例如,您可以使用空格将代码组织成逻辑组,从而增强可读性和视觉清晰度。
缩进是指在循环、方法和控制结构中使用制表符或空格。尽管 Java 中没有强制执行代码缩进约定,但您可以选择采用流行的对流并一致地使用它。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);
}
// 其余代码放在这里
// ...
}
7. 限制方法参数的数量
使用方法时,参数是必需的。但是,应注意避免在一种方法中使用太多参数。太多参数可能表明您的方法正在解决多个问题,并且违反了单一职责原则。
太多的方法参数会降低代码的可读性,因为跟踪它们的类型和含义很困难。要编写干净的 Java 代码,您应该限制方法参数的数量并使用对象或数据结构,而不是将单个参数或与组相关的参数放入对象中。
下面是一个具有太多方法参数的 Java 方法的示例。
public void processOrder(String customerName, String shippingAddress, String billingAddress,
String productName, int quantity, double price, boolean isExpressShipping) {// 方法实现}
下面是我们如何通过将相关参数分组到一个对象中来重构上面的代码以提高可读性。
public class Order {
private String customerName;
private String shippingAddress;
private String billingAddress;
private String productName;
private int quantity;
private double price;
private boolean isExpressShipping;
// 构造函数、getter 和 setter
// 与订单相关的其他方法
}
public void processOrder(Order order) {// 方法实现}
8. 利用单元测试和测试驱动开发(TDD)
单元测试和 TDD 是软件开发中非常常见的做法。单元测试涉及为各个函数、方法和类编写测试,以确保它们独立工作。TDD 也是一种流行的开发实践,涉及在代码之前编写测试。
单元测试和 TDD 方法都可以推动您编写干净的 Java 代码。单元测试允许您验证正确性、及早发现错误并编写更多模块化代码。TDD 提供即时反馈并增强您编写可靠且可维护的代码的信心。
9. 坚实的原则
-
Robert C. Martin(鲍勃叔叔)的 SOLID 原则非常受欢迎;每个开发人员都应该了解它们。这些原则还可以帮助您编写干净、可维护且可扩展的代码。
-
让我们讨论一下 SOLID 缩写中的每项原则如何帮助您编写干净的 Java 代码。
-
单一责任原则(SRS):单一责任原则规定一个类应该只承担一个责任。遵循 SRS 原则保证我们编写出简洁、可读、可维护的代码。
-
开闭原则(OCP):OCP 规定类应该对扩展开放,但对修改关闭,除非修复错误。这一原则允许您添加新功能,而不会引入错误或破坏现有功能。在 Java 中,您可以使用接口或抽象类来扩展现有类的功能。
-
里氏替换原则(LSP):LSP 原则指出我们应该能够互换地使用超类及其各自的子类,而不会破坏程序的功能。使用这一原则可以让您正确使用继承并编写解耦的干净的 Java 代码。
-
接口隔离原则:该原则指出我们应该选择较小的集中接口而不是大型整体接口。利用这一原则,我们可以编写模块化且干净的 Java 代码,其中实现类仅关注与它们相关的方法。
-
依赖倒置原则(DIP):该原则强调松散耦合,保证类等组件仅依赖于抽象而不依赖于其具体实现。DIP 帮助我们使用控制反转 (IoC) 和依赖注入来强制执行干净的 Java 代码。
10. KISS 和 DRY 原则
KISS 和 DRY 是软件开发中非常基本的概念,可以帮助您编写干净的 Java 代码。DRY 原则指出,作为开发人员,您应该确保您的代码不会在系统中多次重复。消除代码重复可以提高代码的可维护性,并使查找和修复错误变得更加容易。
KISS 原则强调我们应该努力保持我们构建的软件的设计和开发简单明了。通过遵循这一原则,您可以避免代码中不必要的复杂性,而选择编写简单且易于理解的代码。
KISS 原则提高了代码的可维护性并使其更具可读性。可维护和可读的代码可以改善协作并简化开发人员进入项目的过程。
11. 源文件结构
Java 中的典型源文件包含对运行任何 Java 程序至关重要的不同元素。为了保持代码的可读性,您应该强制执行一致的源文件结构。尽管没有一种通用的方法来构建源文件,但您可以遵循一些流行的样式指南。
通常,Java 中源文件结构的典型顺序是从包语句开始,然后是静态和非静态导入语句,最后是一个主要的顶级类。
// 类变量
private static int count;
private String name;
// 实例变量
private int age;
private List hobbies;
// 构造函数
public MyClass() {// 构造函数实现}
public MyClass(String name, int age) {// 构造函数实现}
// Methods
public void setName(String name) {// 方法实现}
public String getName() {// 方法实现}
public void addHobby(String hobby) {// 方法实现}
// Other methods
}
// 额外类(如果有)class MyStaticClass {// 类实现}
12. 避免硬编码值
硬编码是指将值直接嵌入到程序的源代码中,而不是使用变量。更改程序的源代码是更改硬编码到程序中的值的唯一方法。硬编码值限制了可重用性和可测试性,并且还可能导致程序出现重复和不良行为。
为了提高代码的可重用性、可测试性和可维护性(这些是干净 Java 代码的关键特性),避免在程序源代码中硬编码值非常重要。相反,用常量变量或枚举等抽象替换硬编码值。
下面是一个带有硬编码值的 Java 程序示例。
@RestController
public class HelloWorldController {@GetMapping("/hello")
public String sayHello() {return "Hello, World!";}
@GetMapping("/user")
public String getUser() {
// 硬编码值
String username = "John";
int age = 30;
return "Username:" + username + ", Age:" + age;
}
// 其他控制器方法
}
结论
编写干净的 Java 代码是开发高质量软件的关键。
在本文中,我们分享了一些可以帮助您编写干净的 Java 代码的最佳和最常见的实践。然而,值得注意的是,这并不是编写干净的 Java 代码所需的明确列表。有助于编写干净 Java 代码的其他关键因素包括文化、可用工具以及与您合作的团队的目标。通过遵循这些原则,您可以编写可读、可测试、可扩展和模块化的代码。
FAQ
什么是干净代码?
干净的代码是指基于最佳实践和约定编写的可读且可维护的代码。它是原作者和其他开发人员都易于理解、修改和扩展的代码。谁继承了代码。
为什么编写干净的 Java 代码很重要?
干净的代码可以提高可读性,增强协作,减少引入错误的机会,并使可维护性更容易。
是否有工具可以帮助编写干净的 Java 代码?
有许多工具可以帮助编写干净的 Java 代码。其中一些包括静态代码分析工具,例如 SonarQube、FindBugs 和 Digma。IntelliJ 和 Eclipse 等 IDE 也很有帮助。
我可以使用哪些资源来了解有关编写干净 Java 代码的更多信息?
有大量博客和在线教程,例如 Baeldung。
我还会推荐 Robert C. Martin 的《Clean Code: A Handbook of Agile Software Craftsmanship》和 Joshua Bloch 的《Effective Java》等书籍。 文章来源:https://www.toymoban.com/diary/java/341.html
文章来源地址 https://www.toymoban.com/diary/java/341.html
到此这篇关于如何编写干净, 高效, 规范, 维护性高的 Java 代码的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!