È meglio avere un metodo che prende un bool come parametro o due metodi con nomi diversi? [duplicare]

9

Sto scrivendo una classe factory per un Selenium Web Driver e ho trovato una scelta che non riuscivo a capire quale sia più pulito. Avere due metodi con lo stesso parametro.

GetWebDriver(string browser)
GetRemoteWebDriver(string browser)

o aggiunta di un parametro booleano

GetWebDriver(string browser, bool isRemote)

Penserei che in questo caso la prima opzione potrebbe essere migliore perché molto probabilmente non ho motivo di estenderlo a più di un booleano di scelte e quindi di due metodi. D'altra parte, posso vedere il secondo da migliorare quando ci sono più di due scelte o probabilmente molte estensioni nel secondo parametro in futuro.

Quale sceglieresti per il codice Cleaner e perché?

    
posta craastad 14.08.2013 - 14:04
fonte

6 risposte

27

Errare sempre sul lato di un client leggibile ...

GetWebDriver("IE", true)

o

GetRemoteWebDriver("IE")

Mi sembra evidente quale sia più facile da leggere.

Ovviamente, un'altra opzione sarebbe

GetWebDriver("IE", DriverType.Remote)

Che è ugualmente leggibile, ma non andrei su quella strada a meno che non ci siano probabilmente più di due opzioni.

    
risposta data 14.08.2013 - 14:11
fonte
17

Ottimizzando la leggibilità, sceglierei la prima opzione per l'interfaccia pubblica: l'intento di GetRemoteWebDriver("IE") è più evidente di GetWebDriver("IE", true) .

Naturalmente, dal punto di vista dell'implementazione, potrebbe avere senso sia per GetWebDriver(string) che GetRemoteWebDriver(string) per chiamare private GetWebDriverImpl(string, bool) .

    
risposta data 14.08.2013 - 14:12
fonte
7

Un'unità di codice (subroutine, routine, funzione, modulo, oggetto, classe, componente, servizio, applicazione, ...) dovrebbe fare solo una cosa . Quanto grande quella cosa è, dipende: ovviamente una classe dovrebbe avere una responsabilità più grande di un metodo.

Una subroutine che prende un flag booleano fa quasi sempre due cose: una cosa quando il flag è vero, un'altra cosa quando il flag è falso. Pertanto, viola la regola "fai una cosa" e dovrebbe essere divisa in due subroutine (o forse tre: una privata per il comportamento comune tra le altre due).

    
risposta data 14.08.2013 - 14:11
fonte
2

Tendo ad evitare tali flag booleani nell'interfaccia di funzione, perché sono un odore correlato alla "separazione di preoccupazione". Quindi preferirei andare per le 2 funzioni.

Tuttavia, a seconda dell'architettura, potrei provare ad avere un servizio IDriverStore con più implementazioni. Un oggetto di configurazione o qualsiasi cosa decide se l'archivio fornisce un driver remoto o meno. Quindi chiami myDriverStore.GetWebDriver(browser)

    
risposta data 14.08.2013 - 14:11
fonte
2

Preferirei il primo suggerimento: definire due metodi diversi.

Gli sviluppatori sanno immediatamente cosa dovrebbe fare quel metodo (solo leggendo il suo nome), non ha bisogno di preoccuparsi del valore del parametro della funzione per sapere cosa farà. Come hai scritto, quando avrai bisogno di più estensioni, il tipo di bool non sarà sufficiente e forse lo cambierai in intero (o Enum per essere più leggibile). Ma ha alcuni svantaggi:

  • Il tuo metodo conterrebbe qualche switch terribile o una costruzione / else per scoprire quale dovrebbe essere la funzionalità appropriata
  • L'orientamento nel codice sarebbe un po 'più difficile, dovresti sapere, cosa significa 0 o 1 come parametro, o in caso di numero intero sarebbe anche peggio

Se si definiscono due metodi, si consiglia di implementare le parti comuni della funzionalità in un metodo separato (privato) e chiamarlo in entrambi i metodi. I tuoi metodi conterrebbe solo i comandi univoci e si eviterebbero duplicati.

    
risposta data 14.08.2013 - 14:25
fonte
1

Nella mia esperienza i bool poiché i parametri raramente sono una buona idea in quanto influiscono sulla leggibilità nel codice dei chiamanti, quindi scegli due metodi piuttosto che uno.

In alternativa, usa un enum per rendere l'intento più esplicito.

    
risposta data 14.08.2013 - 14:55
fonte

Leggi altre domande sui tag