Asserzioni vs Eccezioni - la mia comprensione delle differenze tra i due è corretta? [duplicare]

1

Design By Contract uses preconditions and postconditions of the public methods in a class together to form a contract between the class and its clients.

a) Nel codice implementiamo precondizioni e postcondizioni come asserzioni o come eccezioni ?

b) Implementiamo precondizioni e postcondizioni nel codice come eccezioni se non soddisfano precondizioni o le post-condizioni non indicano situazioni logicamente impossibili o errori di programmazione?

c) li implementiamo in codice come asserzioni quando non soddisfano le precondizioni o postcondizioni indicano situazioni logicamente impossibili o errori di programmazione?

d) Le precondizioni e le postcondizioni dovrebbero essere definite solo su metodi pubblici?

Modifica

I seguenti controlli non sono considerati parte di un'operazione normale (e come ho già detto, ho visto molti articoli su DbC che utilizzano esempi simili per le condizioni preliminari, in cui i controlli sono stati effettuati su argomenti forniti dall'utente) , dal momento che se l'utente immette dati errati, l'operazione senza controlli non verrà rifiutata e, come tale, il sistema smetterà di funzionare in base alle specifiche:

Link:

public User GetUserWithIdOf(int id,
        UserRepository userRepository) {
  // Pre-conditions
  if (userRepository == null)
      throw new ArgumentNullException(
          "userRepository");
  if (id <= 0)
      throw new ArgumentOutOfRangeException(
          "id must be > 0");

  User foundUser = userRepository.GetById(id);

  // Post-conditions
  if (foundUser == null)
      throw new KeyNotFoundException("No user with " +
          "an ID of " + id.ToString() +
          " could be located.");

  return foundUser;
}
    
posta EdvRusj 02.05.2013 - 22:48
fonte

2 risposte

2

a) In code we implement preconditions and postconditions either as assertions or as exceptions?

Rigorosamente, no. La pre / post-condizione è in realtà il test che solleva l'eccezione. L'eccezione è semplicemente il modo di dire che la pre / postzione è stata violata.

b) We implement preconditions and postconditions in code as exceptions if not fulfilling preconditions or postconditions doesn't indicate logically impossible situations or programming errors?

No. Le persone spesso usano test espliciti / sollevano codice di eccezione per indicare un bug, ecc.

c) we implement them in code as assertions when not fulfilling preconditions or postconditions does indicate logically impossible situations or programming errors?

Puoi farlo. Ma vedi sopra.

d) Should preconditions and postconditions only be defined on public methods?

No. Se li stai utilizzando (formalmente) non c'è motivo di restringerli ai metodi pubblici.

In realtà, la differenza chiave tra i due approcci è che è possibile (in genere) disattivare il controllo dello stile di "asserzione" di pre / post-condizioni (ad esempio istruzioni assert di Java) quando si sposta il codice in produzione. Nel caso di Java, questo viene in genere eseguito utilizzando l'opzione della riga di comando JVM.

Questo significa che non si dovrebbe usare lo stile di asserzione pre / post-condizioni per i controlli che fanno parte di "normale funzionamento" ... come la convalida dell'input dell'utente. In effetti, probabilmente non dovresti trattarli come pre / post-condizioni. Fanno parte della funzionalità attiva del programma (per la mancanza di un modo migliore di descriverlo ...)

    
risposta data 03.05.2013 - 01:07
fonte
0

Dovresti definirli come ipotesi, (nel debug come asserzioni) quindi se la condizione pre o post non è vera, allora hai un errore logico nel tuo programma.

Il punto chiave qui è evitare il test nel codice di produzione per accelerarlo,

per esempio una ricerca binaria può andare in O (log n) tempo solo se l'array è già ordinato (precondizione) ma testare questo (per l'eccezione) prende O (n) quindi se si prova per quello si potrebbe anche andare per la ricerca lineare e ottenere un rapido ritorno da esso.

Possono essere definiti su qualsiasi parte di codice (ad esempio, qualsiasi cosa possa essere estratta in un metodo).

    
risposta data 03.05.2013 - 01:03
fonte

Leggi altre domande sui tag