Nello spirito di divide and conquer , ho preso l'abitudine di usare metodi di supporto quasi ovunque, anche per le attività più semplici.
Come esempio molto semplice, supponiamo di avere una sorta di programma di libreria scritto in Java 8 che si occupa di libri, e ha il metodo pubblico filterByAuthor
che accetta come parametri un elenco di libri e il nome di un autore . quando si progetta l'implementazione, lo pseudo codice potrebbe apparire in questo modo:
filter the list of books by
comparing the book's author to the specified one
e quando si implementa effettivamente il codice, avrò qualcosa di simile
public static List<Book> filterByAuthor(List<Book> books, String author) {
return filterBooks(books, book -> isAuthor(book, author));
}
private static List<Book> filterBooks(List<Book> books, Predicate<Book> predicate) {
List<Book> filtered = books.stream()
.filter(predicate)
.collect(Collectors.toList());
return filtered;
}
private static boolean isAuthor(Book book, String author) {
return book.getAuthor().equals(author);
}
Secondo me questo è buono perché rende il codice più semplice per
- leggi
- debug
- cambia
Ma lo stesso metodo potrebbe essere facilmente scritto come
public static List<Book>(List<Book> books, String author) {
List<Book> filtered = books.stream()
.filter(book -> book.getAuthor().equals(author))
.collect(Collectors.toList());
return filtered;
}
Sono preoccupato che se questo tipo di progettazione viene utilizzato in sistemi più grandi potrebbe essere un uso eccessivo dei metodi di supporto. (ad esempio ingombrando lo spazio dei nomi). Ci sono degli svantaggi in questo "uso eccessivo"?