dovrei buttare un'eccezione dal costruttore?


46

So di poter gettare un'eccezione dal costruttore in PHP, ma dovrei farlo? Ad esempio, se il valore di un parametro non è come me l'aspettavo.

O dovrei posticipare il lancio di un'eccezione fino a quando non viene invocato un metodo. Quali sono i vantaggi e gli svantaggi in entrambi i casi?


la domanda è: vuoi che i tuoi utenti vedano brutti messaggi di errore di eccezione?

15
@LawrenceCherone no, non è questa la domanda. Affatto. La domanda è se sollevare immediatamente un'eccezione quando il ctor non è in grado di impostare l'oggetto in uno stato valido dagli argomenti passati ad esso o rinviarlo fino a quando viene chiamato un metodo che opera su quell'istanza con possibile stato non valido. Più adatto per i programmatori però.

4
@LawrenceCherone Hai ragione. Nessun software dovrebbe mai fallire deliberatamente; dovrebbe semplicemente andare avanti e vedere cosa succede. / s
user253751

@immibis Il buon sarcasmo è buono.
kodeart

Questa è una domanda fantastica !!! Non ho mai preso in considerazione questa idea fino ad oggi.
Rhys Johns,

Risposte:


75

Perché rinviare il lancio dell'eccezione?

Se sai che l'oggetto non è in grado di creare un'istanza correttamente con i parametri indicati, allora dovresti assolutamente lanciare un'eccezione.

Altrimenti, qualcuno potrebbe testare il tuo oggetto per null, che non sarà, e potrebbe presumere che tutto sia andato come previsto.

Ci sono molte cose che possono essere fatte al tuo oggetto senza richiamare un metodo su di esso: potrebbe essere aggiunto a un elenco, potrebbe essere confrontato, potrebbe essere inviato come parametro, ecc. Ecc. Ecc. Tutte queste sono cose ciò non avrebbe dovuto accadere, considerato che non è un oggetto valido.


21

Se il tuo costruttore è invocato con parametri errati, dovresti (devi?) Lanciare un'eccezione. In caso contrario, potresti ottenere un oggetto danneggiato che non si comporterà come previsto.


17

Assolutamente!!

Dovresti lanciare l'eccezione se i parametri per la costruzione dell'oggetto non sono validi o meno secondo il contratto. Non è una buona idea proseguire con il flusso sapendo che l'oggetto è costruito con dati errati che possono causare molti problemi se si consente al chiamante di andare avanti.

È sempre meglio "FAIL FAST AND FAIL EARLY"


7

So di poter gettare un'eccezione dal costruttore in PHP, ma dovrei farlo?

Questo è l'unico modo sensato per informare che la costruzione dell'oggetto non è riuscita.


2

Perché non dovresti convalidare il set di parametri prima di creare un'istanza dell'oggetto? Ciò garantirebbe la creazione del tuo oggetto, eliminando così tutti gli effetti collaterali che potrebbero verificarsi dal suo fallimento.

Anche se so che puoi controllare le cose nel tuo costruttore e generare eccezioni, preferisco scrivere i miei costruttori in modo che non falliscano. Eseguo la convalida dei parametri prima di creare un'istanza di oggetti che posso quindi generare eccezioni senza che i costruttori falliscano. Inoltre, generalmente non provo a creare un'istanza di nuovi oggetti nei miei costruttori, scegliendo invece di istanziarli quando ne ho bisogno.

Solo la mia opinione. PHP offre molta libertà - divertiti!


Non sono sicuro del motivo per cui questa risposta è stata sottoposta a downgrade. Fornisce un approccio valido utilizzando la convalida dei parametri prima della costruzione dell'oggetto ( un metodo "guard" ) che è un buon modo per progettare le classi / funzioni per regole specifiche (di solito aziendali). Se anche non risponde direttamente alla domanda del PO, ma è comunque un buon consiglio :)
kodeart
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.