Ho una semplice lista in Java che devo cercare usando uno dei due metodi. Il primo metodo restituisce semplicemente la posizione nell'elenco del primo elemento corrispondente. Il secondo filtra tutti gli elementi che non corrispondono. Ecco alcuni pseudo-ish-code:
public int positionMatch(String search) {
for (Element e: myList) {
if (matches(search, e)) return position(e);
}
}
public List<Element> filterMatch(String search) {
for (Element e: myList) {
if (matches(search, e)) filteredList.add(e);
}
}
public boolean matches(String search, Element element) {
// Some logic to determine whether or not the element
// matches the search term, which is the core functionality
// shared across all search types. This is ~100 LOC.
}
Il problema arriva con le chiamate a match(String search, Element e)
. La mia lista è di decine di migliaia di elementi, e avere una chiamata di funzione per elemento sta causando una lentezza estrema (di un fattore di circa 500). Il problema è che la logica di ricerca in matches(search, e)
è condivisa, indipendentemente da come vengono restituiti gli elementi (come posizione o come elenco filtrato), quindi non ha senso duplicare il codice per ogni metodo positionMatch
e filterMatch
(e qualsiasi altro tipo di ricerca che potrebbe essere aggiunto in seguito). Tuttavia, il rendimento delle prestazioni in non la duplicazione del codice non è accettabile.
Un altro problema è che, almeno in Java, non puoi avere più tipi di ritorno (o almeno non sarebbe molto carino o intuitivo con i generici). Pertanto, non posso semplicemente avere un tipo di funzione match(String search, List<Element> elements, SearchType searchType)
che restituisca un int position
o List<Element> filteredList
.
Va bene in questo caso duplicare il codice attraverso positionMatch
e filterMatch
per annullare le decine di migliaia di chiamate di funzione al codice comune che causa la lentezza?
Oppure mi manca qualcosa di molto semplice qui che potrebbe evitare la duplicazione e non causare problemi di prestazioni? PS - Al momento sto scrivendo una domanda su CodeReview per vedere se esiste un modo specifico di Java per evitare questo problema ...