Restituisce array di più oggetti diversi?

1

Ho codice lungo le seguenti linee:

public void processInput() {
    List<String> input = readInput();
    final Object[] returnObj = createInternalStructureFrom(input);
    final Dictionary dictionary = (Dictionary) returnObj[0];
    final List<Order> orderList = (List<Order>) returnObj[1];
    final List<String> invalidInput = (List<String>) returnObj[2];

    // some more code that processes the created objects
}

private Object[] createInternalStructureFrom(final List<String> input) {

    // here is some code that creates objects along the lines of

    // Dictionary dictionary = createDictionaryFrom(input);
    // List<Order> orderList = createOrderListFrom(input);
    // List<String> invalidInput = getInvalidInputFrom(input);

    // but actually these methods can not be seperated
    // and all objects are created simultaniously when the input is parsed

    final Object[] returnObj = new Object[3];
    returnObj[0] = dictionary;
    returnObj[1] = orderList;
    returnObj[2] = invalidInput;
    return returnObj;
}

Quindi il metodo 'createInternalStructureFrom' restituisce una matrice di oggetti di tipi diversi che vengono quindi convertiti nel tipo corrispondente nel metodo del chiamante.

Questa è considerata una buona pratica in termini di scrittura di codice pulito? Quali sarebbero le alternative?

    
posta Andreas Braun 06.04.2017 - 10:26
fonte

2 risposte

8

Is this considered good practice in terms of writing clean code?

Inferno, no! È orribile.

What would be the alternatives?

Crea una classe che ha quelle cose come campi e restituisce un'istanza di quella classe. Inoltre, quella classe può avere metodi che usano i dati per fare cose utili. Questo è ciò che significa OOP: metti la logica in cui i dati sono, invece di traghettare i dati tra le procedure.

    
risposta data 06.04.2017 - 10:31
fonte
5

No, questa è una cattiva pratica. La soluzione corretta è creare una classe personalizzata con membri dei tipi appropriati.

Ci sono molte ragioni per cui è meglio:

  • Non ci sono possibilità di typecasts dimenticati, errati o sottilmente errati. Invece di lanci manuali lenti e rischiosi si ottiene una memorizzazione automatica ed efficiente verificata dal compilatore.

  • I membri possono avere nomi descrittivi invece di posizioni difficili da ricordare negli array non descrittivi.

  • Puoi passare più valori in un oggetto se ne hai mai bisogno insieme in un altro punto del tuo programma (e l'esperienza insegna che lo farai spesso).

risposta data 06.04.2017 - 10:31
fonte

Leggi altre domande sui tag