Ogni tanto mi imbatto in una situazione in cui ho bisogno di mappare un insieme di proprietà da un oggetto a un altro oggetto di una classe diversa, non correlata. L'insieme di proprietà è abbastanza grande da rendere noioso la digitazione del codice a mano. Il codice principale Anti-DRY come questo è il risultato:
if (objectOfType1.getPropertyA() != null){objectOfType2.setSimilarlyNamedPropertyA(someMethod(objectOfType1.getPropertyA()));}
if (objectOfType1.getPropertyB() != null){objectOfType2.setSimilarlyNamedPropertyB(someMethod(objectOfType1.getPropertyB()));}
...skipping some lines...
if (objectOfType1.getPropertyZ() != null){objectOfType2.setSimilarlyNamedPropertyZ(someMethod(objectOfType1.getPropertyZ()));}
Scrivere e persino guardare un codice come questo è un grosso problema, ma ho voglia di usare una libreria di introspezione come BeanUtils per evitare di avere un paio di metodi come questo che irriterebbe i miei colleghi.
Ho iniziato a scrivere script unici per generare codice come questo per me. In che modo altri programmatori hanno risolto questo problema?
Modifica : ecco il codice tradotto per utilizzare la riflessione / l'introspezione. Certo è ASCIUTTO, ma potrebbe rendere un nemico fuori dal prossimo programmatore del progetto, e io posso essere altrettanto produttivo generare codice come sopra con uno script. Detto questo, se questo è più comune di quanto io sospetto, per favore riempimi:
//Is this really a common technique to use when there's a simpler method?
String[] propertyNamePartsArr = {"A","B", ...skipping some parts..., "Z"};
List<String> propertyNameParts = new ArrayList<String> (Arrays.asList(propertyNamePartsArr));
for (String propertyNamePart : propertyNameParts) {
try {
Object originalValue = BeanUtils.getProperty(objectOfType1, "property" + propertyNamePart);
if (originalValue != null) {
BeanUtils.setProperty(objectOfType2, "similarlyNamedProperty" + propertyNamePart, someMethod(originalValue));
}
} catch (IllegalAccessException e) {
handleIllegalAccessException(e);
} catch (InvocationTargetException e) {
handleInvocationTargetException(e);
} catch (NoSuchMethodException e) {
handleNoSuchMethodException(e);
}
}