La progettazione per contratto è uguale all'utilizzo di interfacce per creare un "contratto"?

3

Un design OOP che utilizza un design per contratto indica che il progettista sta utilizzando le interfacce per creare un "contratto". Il termine "contratto" viene usato abbastanza spesso quando si discutono le interfacce OOP, quindi non sapevo se questi stessero parlando dello stesso concetto quando si utilizzava la parola "Contratto".

Quello che voglio fare in uno dei miei progetti è forzare la classe a inviare un messaggio per farlo basandosi sull'implementazione di un'interfaccia. Ad esempio,

class MyClass
{
  IMyInterfact someKindOfThing;
  public MyClass(IMyInterface something)
  {
        this.someKindOfThing = something;
  }

}
    
posta johnny 21.11.2016 - 22:43
fonte

1 risposta

4

Non proprio. Le interfacce sono piuttosto limitate nella quantità e nel tipo di informazioni sui contratti che possono fornire.

Ad esempio, l'interfaccia:

interface ISizeable
{
    public int Size;
}

ti dice che il "contratto" ha un membro Dimensione, ma non ti dice nient'altro su quel valore, come quanto grande o piccolo possa essere.

Normalmente, la dimensione non è negativa. È possibile risolvere questo problema rendendolo un int unsigned, ma funziona solo per le dimensioni e non vincola il valore positivo. Puoi creare un tipo specifico che accetterà solo i valori all'interno di un intervallo di vincoli specificato, ma ora stai solo spingendo il problema da qualche altra parte.

I contratti di Microsoft Code adottano un approccio diverso:

Contract.Requires( x != null );
Contract.Ensures( this .result > 0 );

I Contratti di codice contengono un analizzatore statico, quindi il compilatore può effettivamente identificare le condizioni in base alle quali i contratti non saranno mai soddisfatti.

    
risposta data 21.11.2016 - 23:03
fonte