Come gestire il codice ripetitivo relativo alle proprietà dell'oggetto?

2

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);
        }
    }
    
posta user506069 11.05.2012 - 01:25
fonte

1 risposta

3

Dovresti utilizzare Reflection .

Nel tuo caso particolare dovresti creare una mappa tra i metodi di Tipo1 ai metodi di Tipo2 (se hanno sempre lo stesso nome anche meglio). Quindi, usando il reflection, chiamerai getPropertyA in un oggetto di Type1 e chiamerai il setter per inserire il valore sull'altro oggetto di Type2. È molto semplice e questo è un caso classico in cui è necessario utilizzare le cose al livello metadati .

    
risposta data 11.05.2012 - 02:38
fonte

Leggi altre domande sui tag