Nella progettazione per contratto, perché le condizioni preliminari dovrebbero essere garantite da un cliente e le post-condizioni - da un fornitore?

4

Ho sentito parlare di Design by Contract molto tempo fa e sono sempre stato confuso da questa domanda. L'approccio utilizza l'analogia del fornitore-cliente del mondo reale per descrivere le relazioni caller-callee. Rimane, che se un cliente assicura i presupposti prima di chiamare un fornitore, il fornitore otterrà i benefici evitando il controllo delle condizioni preliminari; e, d'altra parte, se il fornitore assicura post-condizioni, il cliente otterrà benefici evitando di controllarli; sono tutti felici. Questo è ciò che è scritto in Wikipedia , su sito web EiffelSoftware e in miliardi di altri luoghi.

Ma. Il mondo è crudele. E nella maggior parte dei casi, nel mondo reale, tutti preferiscono controllare ciò che lui ha per lavoro invece di essere sicuro che il lavoro sia eseguito correttamente. Anche nell'esempio sopra, siamo controllati in aeroporto per le condizioni preliminari (biglietto, bagaglio, ecc.), Il fornitore non si fida di noi. E alla fine del volo, vogliamo essere sicuri che siamo davvero a Chicago e il nostro bagaglio non è stato perso.

Quindi, quali sono i vantaggi dei controlli effettuati da un cliente anziché da un fornitore? Non vedo differenza. L'analogia con il mondo reale è cattiva o mi sono perso qualcosa? Potremmo scambiare controllori di postcondizioni e precondizioni e comunque chiamarlo design per contratto?

    
posta neoascetic 05.10.2016 - 19:13
fonte

3 risposte

5

La ragione per cui le precondizioni dovrebbero essere verificate dal cliente è che il cliente è in una posizione migliore per raccogliere o sollecitare qualsiasi informazione mancante perché (presumibilmente) è meglio in grado di comunicare con l'utente. Quando il fornitore viene coinvolto, tutto ciò che può fare è lanciare un errore e interrompere l'elaborazione, poiché non sa da dove provengano le informazioni mancanti.

Le post-condizioni dovrebbero essere gestite dal fornitore per alleviare lo sforzo richiesto per scrivere un cliente. Se il client è garantito (ad esempio) che un particolare valore non sarà mai nullo, o conterrà solo valori all'interno di un intervallo specificato, esso consentirà al client di elaborare semplicemente i valori invece di doverli prima convalidare.

    
risposta data 05.10.2016 - 19:56
fonte
4

Come la maggior parte delle analogie, non è universalmente applicabile. Significa davvero darti il permesso di non sentire che devi sempre controllare tutto ad ogni passo. Tuttavia, non sta dicendo che se il controllo è stato fatto una volta non dovrebbe mai essere fatto di nuovo.

Tra questi due estremi è dove entra in gioco la fiducia. Se non ti aspetti di essere chiamato da nessun'altra persona, avere fiducia nel tuo interlocutore può avere senso. Se sei una biblioteca, fidarsi del tuo chiamante è folle.

Sembra che tu stia sostenendo l'atteggiamento della biblioteca di non fidarsi mai del tuo interlocutore. I vantaggi sono la garanzia di input validi e facili da decifrare messaggi di errore. Il costo, in ordine crescente di importanza, è costituito da controlli ridondanti che influiscono su prestazioni, scrittura del codice e lettura del codice. Il peggio è concettuale.

Il pensiero di ogni limite di oggetto come limite di una biblioteca ha un costo. Io non disegno interfacce uguali su un limite di libreria come faccio all'interno dell'applicazione. È lo stesso con la convalida.

Se tutti i tuoi oggetti conducono vite interessanti, l'atteggiamento della biblioteca è valido. Ma se ho un oggetto piuttosto piccolo che è usato solo da questo chiamante, mi fido che mi perdonerai per aver assunto alcuni assegni, e alcuni lavori, sono già stati fatti.

Vale anche la pena notare che ogni oggetto dovrebbe preoccuparsi delle proprie responsabilità. È compito dei miei chiamanti darmi quello di cui ho bisogno. Ma non per decidere di cosa ho bisogno. Quindi non è ragionevole che l'aereo si aspetti che il taxi controlli le dimensioni e il peso delle tue borse nello stesso modo in cui l'aeroporto farebbe. Queste sono relazioni diverse.

    
risposta data 05.10.2016 - 20:08
fonte
3

Hai ragione. L'analogia non è particolarmente buona. Questo può essere parte della difficoltà con l'idea del design per contratto: è così raro nella vita reale poter contare interamente sul contratto che entrambe le parti eseguono quasi sempre i controlli pre / post / invarianti.

L'idea critica in un linguaggio di design per contratto è che, se puoi stabilire le condizioni, il compilatore può applicarle. Questo ha il vantaggio che devono essere eseguiti una volta sola e, forse più importante, i benefici che sicuramente faranno.

    
risposta data 05.10.2016 - 19:43
fonte

Leggi altre domande sui tag