Ho una domanda su come scrivere codice pulito. Sto cercando di rifattorizzare il seguente metodo:
private static Map<String, String> createMapOfAttributes(
final String Id,
final String attributes,
final Map<String, String> invalidLines
) {
final String[] arrayOfAttributes = attributes.split(";");
final int numberOfAttributes = arrayOfAttributes.length;
final Map<String, String> mapOfAttributes =
new HashMap<String, String>(numberOfAttributes);
for (int i = 0; i < numberOfAttributes; i++) {
final String attributeEntry = arrayOfAttributes[i];
if (attributeEntry == null || attributeEntry.isEmpty()) {
continue;
}
//extract family and attribute
final int attributeEntryDelimitPosition =
attributeEntry.indexOf("=");
final String family =
attributeEntry.substring(0, attributeEntryDelimitPosition).trim();
final String attribute =
attributeEntry.substring(attributeEntryDelimitPosition + 1).trim();
final String familyAndAttribute = family + '=' + attribute;
final String previousFamilyAndAttribute =
mapOfAttributes.put(family,familyAndAttribute);
if (previousFamilyAndAttribute != null) {
invalidLines.put(Id, family);
}
}
return mapOfAttributes;
}
Quindi i primi due argomenti sono argomenti di input, l'ultimo argomento è un argomento di output che viene manipolato e quindi viene restituito un argomento di output.
Una linea guida per scrivere codice pulito è che ogni metodo dovrebbe fare solo una cosa, che il metodo non fa.
Quando provo a separare le cose il metodo esegue un problema: nelle quattro ultime righe del ciclo for, mapOfAttributes viene riempito e viene verificato se una voce esiste già nella mappa; in tal caso, la voce viene raccolta nella mappa invalidLines.
Quando provo a separare queste due cose, mi viene in mente quanto segue: un metodo restituisce mapOfAttributes e un secondo metodo restituisce la mappa invalidLines. Nel secondo metodo avrei bisogno di testare in qualche modo ogni voce se si tratta di una voce pubblicitaria, eventualmente aggiungendola di nuovo ad una mappa e facendo così come nel primo metodo (che porta al codice pubblicitario e al carico computazionale dublicate). Inoltre, avrei bisogno di avere il codice per estrarre famiglia e attributo in entrambi i metodi, portando anche a un codice pubblicitario.
Quindi la mia domanda è: quale sarebbe la tua opinione su questo? Come giudicheresti il metodo? E inoltre, in termini più generali, sono codice leggibile, efficienza del codice e dublicità del codice obiettivi contrari che a volte non possono essere soddisfatti tutti allo stesso tempo? (Che in questo caso potrebbe significare che non esiste una soluzione soddisfacente?)