女朋友嫌我写代码烂,被分手,学习设计原则的第三天,既然已经这样了,女朋友没有办法改变,单是代码烂还是自己力所能及的。
1. 什么是DRY?
DRY 原则的核心思想为:不要写重复的代码。
-
避免复制粘贴: 不同部分的代码中不应该包含
相同或相似的逻辑。如果某一逻辑在多个地方都有用到,应该将其提取出来,放在一个地方进行定义。
public class Adder {
public static int addNumbersV1(int a, int b) {
int result = a + b;
System.out.println("The sum is: " + result);
return result;
}
public static int addNumbersV2(int x, int y) {
int total = x + y;
System.out.println("The total is: " + total);
return total;
}
public static void main(String[] args) {
int result1 = addNumbersV1(3, 5);
int result2 = addNumbersV2(7, 8);
}
}
//**遵循DRY原则的示例:**
public class Adder {
public static int addNumbers(int a, int b) {
int result = a + b;
System.out.println("The sum is: " + result);
return result;
}
public static void main(String[] args) {
int result1 = addNumbers(3, 5);
int result2 = addNumbers(7, 8);
}
}
- 抽象重复的概念: 如果代码中存在类似的概念或模式,应该将其抽象出来,形成一个通用的表示。这可以通过函数、类、模块等方式来实现。
使用函数抽象:
public class Calculator {
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
public static void main(String[] args) {
int result1 = add(5, 3);
int result2 = subtract(8, 2);
}
}
在这个例子中,add 和 subtract 函数分别抽象了加法和减法的概念,通过函数调用来实现这些操作。
使用类抽象:
public class MathOperation {
public int operate(int a, int b) {
// 具体的操作由子类实现
return 0;
}
public static void main(String[] args) {
MathOperation addition = new Addition();
int result1 = addition.operate(5, 3);
MathOperation subtraction = new Subtraction();
int result2 = subtraction.operate(8, 2);
}
}
class Addition extends MathOperation {
@Override
public int operate(int a, int b) {
return a + b;
}
}
class Subtraction extends MathOperation {
@Override
public int operate(int a, int b) {
return a - b;
}
}
在这个例子中,MathOperation 类抽象了数学运算的概念,而具体的操作由子类实现。
- 单一权威: 特定的信息或逻辑应该只在系统中的一个地方进行定义,从而确保系统的一致性。
代码复用表示一种行为:我们在开发新功能的时候,尽量复用已经存在的代码。
代码的可复用性表示一段代码可被复用的特性或能力:我们在编写代码的时候,让代码尽量可复用。
DRY原则是一条原则:不要写重复的代码。从定义描述上,它们好像有点类似,但深究起来,三者的区别还是蛮大的。
怎么提高代码复用性?
- 使用函数和方法: 将一组相关的操作封装到函数或方法中,以便在整个应用程序中轻松重用。这也有助于提高代码的模块性和可读性。
- 使用类和对象: 面向对象编程的一个关键原则是封装。通过将数据和操作封装在类中,可以创建可复用的组件,这些组件可以在整个系统中使用。
- 继承和多态: 使用继承和多态来创建通用的基类和接口,以便不同的子类可以重用基类的代码。这提高了代码的可扩展性和灵活性。
- 设计模式: 学习和应用常见的设计模式,例如工厂模式、单例模式、观察者模式等。这些设计模式提供了一种通用的解决方案,可以在不同上下文中重用。
- 模块化设计: 将系统划分为小的、独立的模块。每个模块都应该执行一个特定的功能,这样它就可以在不同的上下文中重用。
- 通用库和框架: 利用现有的通用库和框架,这些库和框架已经经过测试和优化,可以在不同的项目中重复使用。
- 参数化: 通过参数化函数和方法,使其更加通用。这样,你可以在不同的情境中传递不同的参数,实现相似但稍有不同的功能。
- 抽象和接口: 使用抽象类和接口来定义通用的规范,然后实现这些规范以提供具体的功能。这样,你可以轻松地切换不同的实现。
- 文档和注释: 提供清晰和详细的文档以及注释,以便其他开发人员可以理解和正确使用你的代码。
- 单一职责原则: 确保每个函数、方法、类或模块都只有一个单一的责任。这有助于代码更容易理解和维护。