Domanda

Sembra una domanda stupida con una risposta ovvia:)

Ancora ho osato chiedere tanto per essere doppiamente sicuro.

Siamo davvero usando afferma come indicato di seguito

ArrayList alProperties = new ArrayList();

assert alProperties != null : "alProperties is null";

Il problema è che per fare un documento di piccolo e semplice da seguire, asserisce su è difficile. Ci sono molti libri sulla asserisce, ma idealmente mi piace dare un nuovo programmatore linee guida molto semplici di utilizzare qualcosa come asserisce. Btw, fa qualche strumento come controllo PMD per un uso appropriato delle afferma?

Grazie in anticipo.

È stato utile?

Soluzione

Non c'è motivo sano di mente di usare afferma così. Se non verrà creato l'oggetto per qualche motivo, il vostro assert sarà nemmeno essere raggiunto (perché un'eccezione è stato gettato o la VM uscito, per esempio)

Altri suggerimenti

Ci sono alcune linee guida piuttosto concise sull'uso affermazioni in di Sun Programmazione con asserzioni . Tale articolo ricorda che asserisce dovrebbe essere utilizzato per cose come invarianti interno, comando-Flow invarianti, e precondizioni, Postcondizioni, e Classe invarianti.

No, non si desidera controllare la creazione di oggetti.

Se la creazione dell'oggetto non riesce, la JVM genera un OutOfMemoryError, e se ciò accade è molto probabile che essere screwd irreparabilmente comunque.

che è come non fidarsi della JVM. Per quanto riguarda ciò che si prende come un dato di fatto, è avuto modo di tracciare una linea da qualche parte ...

Questa asserzione solo ingombra il vostro codice, sarebbe equivalente a questa asserzione:

boolean a = true;
assert a : "A should be true"

Non si dovrebbe essere in prova la tua JVM, a meno che questo è il punto del programma (ad esempio, si tratta di una suite di test per una JVM si stanno facendo). Invece si dovrebbe essere in prova il vostro pre-condizioni, post-condizioni e invarianti. A volte questi test sono troppo di base o troppo costoso.

Pre-condizioni probabilmente dovrebbe apparire solo all'inizio di un metodo (se si dispone di metodi molto lunghi, allora si dovrebbe rompere quel metodo in piccole parti, anche se sono tutti privati).

Post-condizioni devono rendere chiaro ciò che avete restituito al chiamante, non si prova che la funzione sqrt appena tornato lo sqrt, ma si potrebbe provare che era positivo per rendere chiaro ciò che si aspettano (forse codice in seguito utilizza numeri complessi e il vostro non è testato per quello). Invece lasciare un commento in fondo.

invarianti spesso non può essere testato, non è possibile verificare che la soluzione attuale è la soluzione parziale corretta (vedi sotto) - anche se questa è una delle cose belle di scrivere cose con la coda-ricorsione. Invece, si dichiara l'invariante con un commento.

Se si sta chiamando le cose dall'esterno, si sarebbe anche utilizzare un'asserzione, per esempio nel tuo esempio se si ha ArrayList.Create(), allora si potrebbe scegliere il controllo di asserzione per null. Ma solo perché non si fida l'altro codice. Se hai scritto che il codice, si potrebbe mettere l'affermazione (commento o altro) nel metodo fabbrica stessa.

int max(int[] a, int n) {
  assert n <= a.length : "N should not exceed the bounds of the array"
  assert n > 0 : "N should be at least one"

  // invariant: m is the maximum of a[0..i]
  int m = a[0];
  for( int i = 1; i < n; n++ ) {
    if( m < a[i] )
      m = a[i];
  }

  // if these were not basic types, we might assert that we found
  // something sensible here, such as m != null
  return m;
}

In Java ogni chiamata a nuovi rendimenti sia un punto di riferimento non nullo per il nuovo oggetto o solleva un'eccezione o un errore. Nel primo caso il vostro assert è vero, nel secondo caso, non sarà raggiunto l'asserzione, perché si finisce nella prossima corrispondenza catch-block.

Questo test assert se il Java-implementazione è rotto e in questo caso non si può nemmeno contare su l'asserzione. In modo da non fare come afferma. Utilizzare valere per le restrizioni sugli oggetti, che non vengono applicate dal linguaggio (per esempio, se il metodo viene passato un parametro che è nullo, ma non dovrebbe essere).

Non sono sicuro di completa capito la tua domanda, ma penso che le affermazioni di questo tipo non sono necessari.

Quando si crea un esempio, se il flusso del programma continua, l'istanza non è un riferimento null.

Si desidera afferma per verificare le proprietà o le invarianti del vostro programma. Un buon documento di insegnare questo dovrebbe incoraggiare il programmatore a pensare a queste proprietà in modo sistematico / metodico.

se l'asserzione non riesce, mi creda, si sta andando ad avere problemi più grandi di solo a che fare con l'asserzione.

Se questo assert fallisce penso che sia tempo che cercare un altro lavoro perché il computer non si comporta come dovrebbe per e quando ciò accade l'inferno sta per scatenarsi!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top