14 设计原则 :DRY !=DIY

128 阅读4分钟

女朋友嫌我写代码烂,被分手,学习设计原则的第三天,既然已经这样了,女朋友没有办法改变,单是代码烂还是自己力所能及的。

1. 什么是DRY?

DRY 原则的核心思想为:不要写重复的代码

  1. 避免复制粘贴: 不同部分的代码中不应该包含相同或相似的逻辑。如果某一逻辑在多个地方都有用到,应该将其提取出来,放在一个地方进行定义。

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);
    }
}
  1. 抽象重复的概念: 如果代码中存在类似的概念或模式,应该将其抽象出来,形成一个通用的表示。这可以通过函数、类、模块等方式来实现。

使用函数抽象:

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);
    }
}

在这个例子中,addsubtract 函数分别抽象了加法和减法的概念,通过函数调用来实现这些操作。

使用类抽象

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 类抽象了数学运算的概念,而具体的操作由子类实现。

  1. 单一权威: 特定的信息或逻辑应该只在系统中的一个地方进行定义,从而确保系统的一致性。

代码复用表示一种行为:我们在开发新功能的时候,尽量复用已经存在的代码。

代码的可复用性表示一段代码可被复用的特性或能力:我们在编写代码的时候,让代码尽量可复用。

DRY原则是一条原则:不要写重复的代码。从定义描述上,它们好像有点类似,但深究起来,三者的区别还是蛮大的。

怎么提高代码复用性?

  1. 使用函数和方法: 将一组相关的操作封装到函数或方法中,以便在整个应用程序中轻松重用。这也有助于提高代码的模块性和可读性。
  2. 使用类和对象: 面向对象编程的一个关键原则是封装。通过将数据和操作封装在类中,可以创建可复用的组件,这些组件可以在整个系统中使用。
  3. 继承和多态: 使用继承和多态来创建通用的基类和接口,以便不同的子类可以重用基类的代码。这提高了代码的可扩展性和灵活性。
  4. 设计模式: 学习和应用常见的设计模式,例如工厂模式、单例模式、观察者模式等。这些设计模式提供了一种通用的解决方案,可以在不同上下文中重用。
  5. 模块化设计: 将系统划分为小的、独立的模块。每个模块都应该执行一个特定的功能,这样它就可以在不同的上下文中重用。
  6. 通用库和框架: 利用现有的通用库和框架,这些库和框架已经经过测试和优化,可以在不同的项目中重复使用。
  7. 参数化: 通过参数化函数和方法,使其更加通用。这样,你可以在不同的情境中传递不同的参数,实现相似但稍有不同的功能。
  8. 抽象和接口: 使用抽象类和接口来定义通用的规范,然后实现这些规范以提供具体的功能。这样,你可以轻松地切换不同的实现。
  9. 文档和注释: 提供清晰和详细的文档以及注释,以便其他开发人员可以理解和正确使用你的代码。
  10. 单一职责原则: 确保每个函数、方法、类或模块都只有一个单一的责任。这有助于代码更容易理解和维护。