Il tipo di restituzione condizionale è sempre una buona idea?

3

Quindi ho un metodo simile a questo:

-(BOOL)isSingleValueRecord

E un altro metodo come questo:

-(Type)typeOfSingleValueRecord

E mi è venuto in mente che potevo combinarli in qualcosa del genere:

-(id)isSingleValueRecord

E fai in modo che l'implementazione sia qualcosa del tipo:

-(id)isSingleValueRecord {
    //If it is single value
    if(self.recordValue = 0) {

        //Do some stuff to determine type, then return it
        return typeOfSingleValueRecord;         
    }
    //If its not single value 
    else {
        //Return "NO"
        return [NSNumber numberWithBool:NO];
    }
}

Quindi combinare i due metodi lo rende più efficiente ma riduce la leggibilità. Nel mio intimo, sento che dovrei andare con la versione a due metodi, ma è davvero giusto? C'è qualche caso che dovrei andare con la versione combinata?

    
posta pasawaya 31.10.2012 - 06:39
fonte

4 risposte

4

Ci sono occasioni in cui restituire diversi tipi è OK - quelle occasioni sono quando si vuole sfruttare il polimorfismo o qualche altro meccanismo che equivale a "i tipi che si restituiscono risponderanno alle stesse operazioni" (modelli, tipizzazione delle anatre, ecc.)

Il tuo esempio sopra non rientra in questa categoria. In questo caso stai creando un'interfaccia che è solo più efficiente per te, ma non ha salvato il client della tua classe. Un chiamante deve ancora determinare se si tratta di un singolo valoreRecord.

Ci sono un paio di opzioni migliori.

  • Utilizza una struttura o una tupla per combinare il valore booleano e il Tipo in un unico valore restituito.
  • Come menzionato da altri, fornire un valore di ritorno booleano e un parametro di output per la funzione che terrebbe le informazioni sul tipo.
  • Se per te è molto insolito restituire NO, potresti lanciare un'eccezione

Cerca di pensare a cosa renderà la vita più facile per il codice chiamante, non a ciò che sembra migliore nell'implementazione.

    
risposta data 31.10.2012 - 11:01
fonte
2

Cosa succede se elimini entrambe le soluzioni e hai un design diverso? Ad esempio, potresti fornire un singolo metodo come:

- (NSArray*)recordTypes;

Se il record è un record a valore singolo, l'array restituito contiene un tipo. Se si tratta di un record a più valori, la matrice contiene più di un tipo.

Qui presumo che affrontare il disco sia di per sé difficile o dispendioso in termini di tempo. Se non lo è, puoi semplicemente fornire il record stesso e lasciare che il client lo interroghi per tipo o tipi.

    
risposta data 31.10.2012 - 07:14
fonte
1

Sono uno sviluppatore Java, ma in Java non avrei mai combinato questi due.

Poiché un metodo chiamato is* suggerisce di restituire un valore booleano, mentre uno chiamato typeOf* suggerisce di restituire un determinato tipo.

Ma puoi usare quello nell'altro per evitare la duplicazione del codice, ad es. in typeOfSingleValueRecord fai qualcosa come (pseudo codice) if(isSingleValueRecord) return "type of record"

    
risposta data 31.10.2012 - 07:15
fonte
1

Sembra che tu stia cercando di restituire più di una cosa da un singolo metodo, che non è una cosa insolita. Una cosa insolita (e di solito brutta) è che stai cercando di combinare entrambi gli elementi in un singolo valore, che deve essere interpretato dal chiamante in modo non intuitivo (simile al famigerato " sì / no / file-non-trovato " mix-up).

Una firma migliore per il tuo metodo separerebbe i due valori che restituisce come segue:

-(BOOL)tryGetSingleValueRecordType:(Type**)typePtr {
    if (self.recordValue = 0) {
        *typePtr = typeOfSingleValueRecord;
        return YES;
    } else {
        return NO;
    }
}

Ora il chiamante sarebbe in grado di chiamare la tua API in questo modo:

Type *srType;
if ([record tryGetSingleValueRecordType:&srType]) {
    NSLog("Single record type: %@", srType);
} else {
    NSLog("Not a single record");
}

I due elementi restituiti dalla tua API, ovvero la risposta SÌ / NO e il tipo effettivo, vengono restituiti tramite due meccanismi separati, senza perdere leggibilità, efficienza o sicurezza del tipo.

    
risposta data 31.10.2012 - 07:25
fonte

Leggi altre domande sui tag