代码重构的实战案例

热血战士喵 2022-02-19 ⋅ 12 阅读

引言

代码重构是软件开发中的一项重要工作。它旨在通过改进代码结构和设计,使代码更易于理解、维护和扩展,并且更加高效。

在本篇博客中,我将分享一个真实的代码重构实战案例。我将详细介绍代码原始状态,以及通过重构所带来的改进效果。希望通过这个案例,能够让你了解到代码重构的实际应用价值。

代码原始状态

我们的案例是一个简化的图书管理系统,由以下几个类组成:

public class Library {
    private List<Book> books;

    public Library(List<Book> books) {
        this.books = books;
    }

    public List<Book> searchByTitle(String title) {
        List<Book> result = new ArrayList<>();
        for (Book book : books) {
            if (book.getTitle().contains(title)) {
                result.add(book);
            }
        }
        return result;
    }

    public List<Book> searchByAuthor(String author) {
        List<Book> result = new ArrayList<>();
        for (Book book : books) {
            if (book.getAuthor().equals(author)) {
                result.add(book);
            }
        }
        return result;
    }
    
    // ... 其他一些方法 ...
}

public class Book {
    private String title;
    private String author;
    // ... 其他属性和方法 ...
}

这是一个简单的图书管理系统,其中Library类负责管理图书,包含了一些基本的查询操作,如按标题和作者搜索图书。

然而,随着业务的发展,这个系统变得越来越庞大,代码变得越来越复杂。查询操作的代码重复度很高,不易于扩展和维护。为了改善代码的质量,我们决定对其进行重构。

重构改进

提取公共逻辑

我们注意到按标题和作者搜索图书的逻辑非常相似,只有判断条件不同。为了避免重复代码,我们可以将这部分公共逻辑提取出来,建立一个辅助方法。

public class Library {
    // ... 其他代码 ...

    private List<Book> search(Predicate<Book> predicate) {
        List<Book> result = new ArrayList<>();
        for (Book book : books) {
            if (predicate.test(book)) {
                result.add(book);
            }
        }
        return result;
    }

    public List<Book> searchByTitle(String title) {
        return search(book -> book.getTitle().contains(title));
    }

    public List<Book> searchByAuthor(String author) {
        return search(book -> book.getAuthor().equals(author));
    }
}

通过提取公共逻辑,我们成功消除了冗余代码,并且使查询方法更加简洁。

引入策略模式

虽然通过上述重构我们消除了重复代码,但是查询逻辑依然分散在Library类的不同方法中,不易于管理和扩展。

为了进一步改进代码结构,我们可以引入策略模式。我们定义一个SearchStrategy接口,并为每种查询策略创建一个实现类。

public interface SearchStrategy {
    boolean test(Book book);
}

public class TitleSearchStrategy implements SearchStrategy {
    private String title;

    public TitleSearchStrategy(String title) {
        this.title = title;
    }

    @Override
    public boolean test(Book book) {
        return book.getTitle().contains(title);
    }
}

public class AuthorSearchStrategy implements SearchStrategy {
    private String author;

    public AuthorSearchStrategy(String author) {
        this.author = author;
    }

    @Override
    public boolean test(Book book) {
        return book.getAuthor().equals(author);
    }
}

然后,我们修改searchByTitlesearchByAuthor方法,使其接受一个SearchStrategy对象作为参数,从而实现查询策略的灵活切换。

public class Library {
    // ... 其他代码 ...

    private List<Book> search(SearchStrategy strategy) {
        List<Book> result = new ArrayList<>();
        for (Book book : books) {
            if (strategy.test(book)) {
                result.add(book);
            }
        }
        return result;
    }

    public List<Book> searchByTitle(String title) {
        return search(new TitleSearchStrategy(title));
    }

    public List<Book> searchByAuthor(String author) {
        return search(new AuthorSearchStrategy(author));
    }
}

通过引入策略模式,我们将查询逻辑与具体的查询条件解耦,实现了更好的扩展性和可维护性。

总结

通过上述案例,我们看到了一个简化的图书管理系统如何通过代码重构得到改进。我们通过提取公共逻辑和引入策略模式,使代码更具可读性、可维护性和扩展性。

代码重构是一个持续改进的过程,它并不是一蹴而就的事情。在实践中,我们需要根据具体场景来选择适合的重构手法,并且谨慎评估重构所带来的改进效果。

希望通过本篇博客的实战案例,能够让你深入理解代码重构的重要性和实际应用。在实际开发中,不断改善和优化代码质量,将使我们的软件更加稳定、高效和可靠。


全部评论: 0

    我有话说: