È una pratica accettabile ottenere una proprietà, che coinvolga l'analisi binaria, che potrebbe generare un'eccezione?

4

Ho una proprietà che viene caricata pigramente, in qualsiasi momento dopo la chiamata del ctor.

È possibile che il file binario su cui si basa la mia proprietà non sia valido. Se non valido, potrei dover fare un'eccezione.

Dovrei

  1. Imposta la proprietà come metodo e fallo con esso.
  2. Lascia le cose come sono.
  3. Lascia la proprietà così com'è, ma aggiungi un metodo per convalidare l'oggetto, che invocherà l'analisi lazy, che potrebbe generare un'eccezione.
posta random65537 10.03.2014 - 21:16
fonte

2 risposte

5

Mi limiterei a lanciare un'eccezione non controllata.

Il motivo è che non è compito chiamare gli oggetti per validare il tuo oggetto. Inoltre, tirare la logica di caricamento su un metodo separato significa che il codice di chiamata deve sapere chiamare il metodo A prima del metodo B, e potenzialmente il metodo A può / deve essere chiamato una sola volta. Questo è un anti-pattern di sequenziamento.

In questo caso, preferisco il caricamento pigro che, se fatto correttamente, assicura che il caricamento sia effettuato una sola volta, B. il codice chiamante non ha bisogno di sapere che i metodi della classe dovrebbero essere chiamati in un ordine specifico, potenzialmente interrotto se non lo fanno.

Pseudocodice:

public object getObject() {
  if (this.data == null) {
    loadObject()
  }
  return this.data
}

private void loadObject() {
  // Expensive loading logic...
}

Modifica: vorrei chiarire che i getter / gli accessor dovrebbero, generalmente, non lanciare nulla. Tuttavia, in questo caso, non abbiamo a che fare con un semplice getter. Mi piace pensare a questo non come "ottenere alcune semplici variabili memorizzate sull'oggetto", ma "vai a prendermi un po 'di birra dal frigo, e se non ce ne sono più, lancia una NullPointerException." Dopotutto se stai ottenendo un valore da qualche file binario o altro, hai intenzione di impostarlo anche tu? Probabilmente no. Quindi forse un'altra domanda è "dovrebbe essere chiamato un 'getter' per cominciare?" che è una domanda separata.

    
risposta data 10.03.2014 - 21:36
fonte
0

Dipende da quanto l'utente della classe conosce il file:

  • Se non sanno che esiste o il suo formato, avere la proprietà è sufficiente in quanto gli utenti non hanno alcuna idea su come gestire l'eccezione.
  • Se l'utente della classe sa che questo file esiste, può specificare il percorso, o può creare questo file, quindi avere un metodo con una semantica di lancio delle eccezioni chiara sarebbe meglio.
  • Se è possibile ottenere entrambi i tipi di utenti, è possibile che sia necessario eseguire una proprietà e un metodo.
risposta data 10.03.2014 - 21:54
fonte