java - 重构了很多类似方法的代码

标签 java refactoring

嗨,我的代码中有很多类似的方法,如下所示,也许将来我会有更多。

public void getParticularBook(String nameOfBook){
    String bookDetails = "";
    Iterator<Book> iterator = allBooks.iterator();
    while(iterator.hasNext()) {
        Book b = iterator.next();
        if(b.getTitle().equalsIgnoreCase(nameOfBook)){
            bookDetails = b.toString();
        }
    }
    System.out.println(bookDetails);
}

public void getBooksDataOnRange(int from, int to){
    String bookDetails = "";
    Iterator<Book> iterator = allBooks.iterator();
    while(iterator.hasNext()) {
        Book b = iterator.next();
        if(b.getIssueYear() >= from && b.getIssueYear() <= to){
            bookDetails = b.toString();
        }
    }

    if(bookDetails.isEmpty()){
        System.out.println("No books in range of: " + from + "-" + to);
    }
    System.out.println(bookDetails);
}

public void getBooksDataOnType(String type){
    String bookDetails = "";
    Iterator<Book> iterator = allBooks.iterator();
    while(iterator.hasNext()) {
        Book b = iterator.next();
        if(b.getType().equalsIgnoreCase(type)){
            bookDetails = b.toString();
        }
    }

    if(bookDetails.isEmpty()){
        System.out.println("No books of type: " + type);
    }
    System.out.println(bookDetails);
}

以上方法是某种过滤器,它基于例如返回数据书籍类型、书籍发行日期。

问题是,是否可以重构所有此类方法的代码?或者也许更好地遵循上述方案? 谢谢各位的解答

最佳答案

您可以创建一个名为 getBooksWithPredicate 的方法:

public static void getBooksWithPredicate(Predicate<Book> predicate, String errorMessage) {
    String bookDetails = "";
    Iterator<Book> iterator = allBooks.iterator();
    while(iterator.hasNext()) {
        Book b = iterator.next();
        if(predicate.test(b)){
            bookDetails = b.toString();
        }
    }

    if(bookDetails.isEmpty()){
        System.out.println(errorMessage);
    }
    System.out.println(bookDetails);
}

这基本上是所显示的所有三种方法的概括。然后调用这个方法就可以实现这三个方法:

public void getParticularBook(String nameOfBook){
    getBooksWithPredicate(b -> b.getTitle().equalsIgnoreCase(nameOfBook), "");
}

public void getBooksDataOnRange(int from, int to){
    getBooksWithPredicate(b -> b.getIssueYear() >= from && b.getIssueYear() <= to, "No books in range of: " + from + "-" + to);
}

public void getBooksDataOnType(String type){
    getBooksWithPredicate(b -> b.getType().equalsIgnoreCase(type), "No books of type: " + type);
}

关于java - 重构了很多类似方法的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49852173/

相关文章:

javascript - JSP 提交文本框值

java - 从字符串Java中提取文本

Java HashSet remove(e) 方法不符合我的预期

java - @Inject 字段的空对象

java - eclipse 自动且可追溯地将对象添加到类中

java - 如何在 Morphia/Mongo Java 驱动程序上自动重试命令

javascript - Webpack 捆绑导致未知提供者 $injector/unpr 错误

Python递归函数超出了递归限制。如何将其转换为迭代

refactoring - 您维护的任何功能的最高圈复杂度是多少?你将如何重构它?

emacs - Emacs 中的重构