Interfaces Java - Ce qui est exactement dans le contrat? [fermé]


Je connais et comprends la valeur des interfaces en Java. Vous codez sur l'interface, puis vous pouvez modifier vos implémentations sans avoir à changer de code à l'aide de l'interface. Souvent, le terme "contrat" est utilisé en relation avec les interfaces. La façon dont je le comprends est que l'interface définit le" contrat " entre l'application et l'implémentation.

Donc, lorsque je crée une implémentation, je dois remplir le contrat. Mes questions sont, ce qui est exactement dans ce contrat que je dois remplir?

, Évidemment, au minimum, vous devez fournir des méthodes avec les mêmes signatures que l'interface. Le code ne compilera pas autrement. Est-ce tout le "contrat" implique? Il semble comme il devrait y en avoir plus.

Par exemple, j'ai lu des articles débattant de la valeur des tests sur l'interface par rapport aux tests d'implémentations spécifiques, ou faisant les deux. Je vois une grande valeur à avoir des tests pour une interface afin que vous sachiez quelles entrées ont quelles sorties attendues. Il serait il me semble que cela ferait également partie de l'interface "contrat". Chaque implémentation de l'interface doit produire les mêmes sorties à partir des mêmes entrées. Évidemment, il n'y a aucun moyen d'appliquer ce contrat dans le code, mais il peut être appliqué via des cas de test. Ai-je tort dans ma pensée ici?

Enfin, qu'en est-il des effets secondaires des implémentations? Ici, je parle principalement de toute persistance qui pourrait se produire dans le cadre de la mise en œuvre. Disons que j'ai une implémentation c'est enregistrer certains enregistrements dans la base de données pendant qu'il préforme l'opération. Cela ferait-il en quelque sorte partie du "contrat"d'interface? Si oui, comment pourriez-vous faire respecter ce contrat? Au niveau de l'interface, je n'ai aucune idée de ce que fait réellement l'implémentation. Tout ce que je sais, c'est que je lui donne des entrées, et cela me donne une sortie, que je peux tester. Toute persistance qui se produit est-elle également considérée comme une "sortie"? Si oui, je ne vois pas comment cela peut être testé et appliqué. Je suis un partisan de l'ignorance persistante, donc Je pourrais savoir que quelque chose devraitêtre persisté, mais je ne sais pas comment il est persisté. Donc, je ne sais pas comment dire quand quelque chose a réellement persisté. Cela peut être simple si votre interface a quelques opérations CRUD simples, mais je veux penser à des interfaces plus compliquées.

J'espère que ma question a du sens et que quelqu'un peut fournir de bons commentaires. Je veux en discuter en général, mais je peux fournir un exemple spécifique si ce n'est pas clair de quoi je parle Au sujet.

Author: Woot4Moo, 2012-03-30

3 answers

Je pense que "contrat" et "Interface" ont très moins en commun.

Une interface est quelque chose comme une porte. Une porte peut passer l'homme typique, mais pas les éléphants, les girafes ou la voiture.

Un contrat est quand vous pourriez assurer que par la porte seule une femme, un homme ou un développeur de logiciels viendra.

Ainsi, un contrat définit le COMPORTEMENT tandis que l'interface définit les informations transmises

 2
Author: stefan bachert, 2012-03-30 18:11:29

Je pense que vous faites une trop grosse affaire sur le terme "contrat".

"Eiffel" a une "conception par contrat" de la philosophie. Personnellement, je pense que d'autres langues bénéficieraient de quelque chose de similaire.

De manière informelle, vous pouvez certainement penser aux "interfaces" de Java comme étant un "contrat". Votre définition d'une interface Java est certainement bonne:

, Au minimum, vous devez fournir des méthodes avec les mêmes signatures que interface. Le code ne le fera pas compiler le contraire.

Q: Est-ce tout ce que le "contrat" implique?

A: Probablement pas. Tout dépend de la façon dont vous définissez "contrat";)

Mais, À mon HUMBLE avis, les interfaces Java sont un beaucoup caractéristique plus propre que l'horreur de C++ "héritage multiple". Et l'une des principales motivations derrière les deux sont à l'appui "mixin":

De même, Java intefaces fournit également une solution de sauvegarde de type propre et relativement simple à prendre en charge "rappels".

Suggestion finale: veuillez considérer la différence entre "interface" et "classe abstraite". Cela pourrait également vous donner un aperçu supplémentaire des interfaces Java, et comment vous pouvez les utiliser efficacement dans votre propre code:

Interface vs Classe abstraite (OO général)

 2
Author: paulsm4, 2017-05-23 12:07:37

Donc un contrat est la signature de la méthode + toute documentation associée à la fonction / classe . Une conclusion à retenir de ceci est qu'une interface ne signifie pas la même chose que le mot clé java interface . Une interface est tout ce qui vous permet d'interagir avec un autre système. Donc, à la question de savoir comment remplissez-vous le contrat d'une fonction déclarée comme telle:

    /**  Throws IllegalArgumentException if s is null.    
Converts the input <b>s</b> into an {@link Integer}  */
    function go(String s);

Vous devez écrire une implémentation comme suit:

function go(String s)  
{  
    if(null == s) throw new IllegalArgumentException();  
    int i = Integer.parseInt(s);
}  

Artificiel, oui, mais cela devrait expliquer comment mettre en œuvre un contrat et le respecter.

 0
Author: Woot4Moo, 2012-03-30 18:12:57