如何避免写重复代码?两种常见的方法:抽象和组合

简介: 如何避免写重复代码?两种常见的方法:抽象和组合

在软件开发过程中,我们常常需要解决重复性的问题。对于一些常见的功能或业务逻辑,我们不希望每次都从头开始编写代码。那么,如何避免写重复代码呢?本文将介绍两种常见的方法:抽象和组合。

抽象

抽象是一种将相似之处提取出来的技术。在软件设计中,我们可以通过抽象来消除重复代码,并提高代码的可复用性、可维护性和可扩展性。以下是几种常见的抽象方法:

1. 类和接口

类和接口是面向对象程序设计的基础,它们是抽象的概念,可以用来表示真实世界中的实体或概念。在软件开发中,我们可以使用类和接口来封装通用的业务逻辑或功能,以便在其他地方重复使用。

例如,我们可以定义一个IO操作的接口,包括读、写、关闭等方法:

public interface IOOperation {
   
    void read();
    void write();
    void close();
}

然后,我们可以在不同的场景下实现该接口,例如文件读写、网络传输等:

public class FileStream implements IOOperation {
   
    @Override
    public void read() {
   
        // 文件读操作
    }

    @Override
    public void write() {
   
        // 文件写操作
    }

    @Override
    public void close() {
   
        // 文件关闭操作
    }
}

public class NetworkStream implements IOOperation {
   
    @Override
    public void read() {
   
        // 网络读操作
    }

    @Override
    public void write() {
   
        // 网络写操作
    }

    @Override
    public void close() {
   
        // 网络关闭操作
    }
}

通过这种方式,我们可以将通用的IO操作抽象为接口,并在不同场景下实现该接口,避免了重复的代码。

2. 泛型

泛型是一种可重用性高、类型安全的编程机制。它可以将数据类型参数化,使得程序更具灵活性和扩展性。

例如,我们可以定义一个通用的排序函数,使用泛型来支持多种数据类型:

public class SortUtil {
   
    public static <T extends Comparable<? super T>> void sort(T[] arr) {
   
        // 排序算法实现
    }
}

然后,我们就可以通过调用该方法来对不同类型的数组进行排序:

Integer[] intArr = {
   3, 1, 4, 1, 5, 9};
SortUtil.sort(intArr);

String[] strArr = {
   "hello", "world", "java"};
SortUtil.sort(strArr);

通过这种方式,我们可以将通用的排序算法抽象为具有泛型参数的静态方法,避免了重复的代码。

组合

组合是一种将多个部分组合起来形成整体的技术。在软件设计中,我们可以使用组合来搭建更为复杂和灵活的系统结构,从而避免了重复的代码。

以下是几种常见的组合方法:

1. 继承

继承是一种将某些属性和行为从一个类传递给另一个类的机制。在软件开发中,我们可以使用继承来重用现有类的代码,并在此基础上进行扩展和修改。

例如,我们可以定义一个Animal类,包括通用的属性和方法:

public abstract class Animal {
   
    protected String name;
    public abstract void eat();
    public abstract void sleep();
}

然后,我们可以定义具体的动物类型,如Cat、Dog等,通过继承Animal类来共享其属性和方法:

public class Cat extends Animal {
   
    @Override
    public void eat() {
   
        // 猫吃东西
    }

    @Override
    public void sleep() {
   
        // 猫睡觉
    }
}

public class Dog extends Animal {
   
    @Override
    public void eat() {
   
        // 狗吃东西
    }

    @Override
    public void sleep() {
   
        // 狗睡觉
    }
}

通过这种方式,我们可以避免在每个具体动物类中重复定义通用的属性和方法。

2. 组合

组合是一种将多个对象组合成一个更大的对象的技术。在软件开发中,我们可以使用组合来创建复杂的对象结构,并在其中共享代码和功能。

例如,我们可以定义一个Car类,包括引擎、轮胎等子部件:

public class Car {
   
    private Engine engine;
    private List<Tire> tires;

    public Car(Engine engine, List<Tire> tires) {
   
        this.engine = engine;
        this.tires = tires;
    }

    public void start() {
   
        engine.start();
    }

    public void stop() {
   
        engine.stop();
    }

    public void run() {
   
        for (Tire tire : tires) {
   
            tire.roll();
        }
    }
}

然后,我们可以定义不同类型的引擎和轮胎,通过组合的方式创建不同型号的汽车:

Engine gasolineEngine = new GasolineEngine();
List<Tire> suvTires = Arrays.asList(new Tire(), new Tire(), new Tire(), new Tire());
Car suv = new Car(gasolineEngine, suvTires);

Engine electricEngine = new ElectricEngine();
List<Tire> sedanTires = Arrays.asList(new Tire(), new Tire(), new Tire(), new Tire());
Car sedan = new Car(electricEngine, sedanTires);

通过这种方式,我们可以将汽车的引擎和轮胎等子部件抽象出来,并在不同场景下组合起来创建不同型号的汽车。

总结

抽象和组合是软件开发中重要的技术,可以帮助我们避免重复代码,提高代码的可复用性、可维护性和可扩展性。通过抽象,我们可以将通用的业务逻辑或功能封装成类和接口,从而实现代码共享;通过泛型,我们可以提高代码的灵活性和扩展性。通过组合,我们可以将多个对象组合成一个更大的对象,避免了代码的重复定义和冗余。在实际开发中,我们应该根据具体情况选择合适的抽象和组合方法,以提高代码的质量和效率。

目录
相关文章
|
5月前
|
设计模式 算法 开发者
软件复用问题之区分「不重复」和「复用」,如何解决
「不重复」和「复用」之间有何区别软件复用问题之区分「不重复」和「复用」,如何解决
|
5月前
|
Java
代码优化设计问题之推荐使用函数式方法进行null判断问题如何解决
代码优化设计问题之推荐使用函数式方法进行null判断问题如何解决
|
7月前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
一个 C#例子,代码简化的过程
一个 C#例子,代码简化的过程
70 0
|
设计模式 JavaScript 前端开发
如何优雅的消除系统重复代码
在程序猿的日常工作中,不仅要跟随业务侧的发展不断开发新的需求,同时也需要维护老的已有平台。无论是开发新需求还是维护老系统,我们都会遇到同样一个问题,系统中总是充斥着很多重复的代码。
29585 11
如何优雅的消除系统重复代码
|
SQL 缓存 安全
如何避免写重复代码:善用抽象和组合
通过抽象和组合,我们可以编写出更加简洁、易于理解和稳定的代码;类似于金字塔的建筑过程,我们总是可以在一层抽象之上再叠加一层,从而达到自己的目标。但是在日常的开发工作中,我们如何进行实践呢?本文将以笔者在Akka项目中的一段社区贡献作为引子分享笔者的一点心得。
163 0
如何避免写重复代码:善用抽象和组合
|
Java
使用java反射机制读取任意类内部细节
使用java反射机制读取任意类内部细节
135 0
|
自然语言处理 JavaScript Java
从重复到重用
开发技术的发展,从第一次提出“函数/子程序”,实现代码级重用;到面向对象的“类”,重用数据结构与算法;再到“动态链接库”、“控件”等重用模块;到如今流行的云计算、微服务可重用整个系统。技术发展虽然日新月异,但本质都是重用,只是粒度不同。所以写代码的动机都应是把重复的工作变成可重用的方案,其中重复的工作包括业务上重复的场景、技术上重复的代码等。合格的系统可以简化当下重复的工作;优秀的系统还能预见未来重复的工作。
从重复到重用