2009-09-05 8 views
4

Lorsque vous créez une interface, créez-la en fonction du comportement, suivez la norme -able, par ex.Créer une interface pour un objet ou pour une action/un comportement?

interface Comparable 
interface Enumerable 
interface Listable 
interface Talkable 
interface Thinkable 

Ou basé sur un objet, par ex.

interface Comparator 
interface Enumerator 
interface List 
interface Human 

Et pourquoi?

MISE À JOUR

Cette question ne concerne pas la convention de nommage (suffixe ou préfixe able I). Ceci est de l'intention de la conception de l'interface, et l'impact de celui-ci, en termes de: -

  1. flexibilité
  2. complexité/simplicité
  3. maintenabilité

Par exemple, si je dois pour mettre en œuvre des fonctionnalités différentes, en faisant -able façon, je peux déclarer ma classe comme

public class Man implements Talkable, Thinkable, Laughable 
public class Woman implements Talkable, Thinkable, Laughable 

D'autre part Par contre, si nous créons interface sur l'objet, nous pouvons l'utiliser comme

public class Man implements Human 
public class Woman implements Human 

Et nous pouvons également l'utiliser à des fins de polymorphisme.

Human man = new Man(); 
+0

Les normes pour cela sont en grande partie spécifiques à la langue, et parfois subjective pour le programmeur et les normes d'une organisation. –

Répondre

4

Les interfaces ne sont pas à propos de ce que fait une classe concrète. Ils concernent davantage les besoins du client et ce qui est substituable à ce dont le client a besoin. Par exemple, au lieu d'essayer d'extraire une interface d'une classe Man, placez plutôt l'accent sur l'une des classes qui utilisent la classe Man. Qu'est ce que ça fait? Peut-être que c'est une classe Conversation qui veut que les choses se parlent. Si vous lui avez donné deux classes Man, il peut appeler le talk(). Mais si vous voulez que ce soit plus flexible, vous pouvez faire abstraction du concept de ce qu'il fait: faire parler les choses et utiliser une interface Talkable (par exemple). Quand vous voyez une interface Talkable sur cette classe Conversation, vous ne devriez pas penser « qui est vraiment un Man » mais plutôt, « Là où je vois un Talkable, je peux substituer tout ce qui met en œuvre Talkable, que ce soit un Man, Woman, Parrot , Robot, etc. "

Si je ne suis pas clair, il y a de bonnes ressources disponibles sur le sujet. Consultez les articles Dependency Inversion Principle de Robert Martin, Interface Segregation Principle et Liskov Substitution Principle pour les débutants.

+0

Merci pour les liens! – janetsmith

1

Interfaces ont été faits pour définir le comportement nécessaire des objets, et vous pouvez avoir un comportement similaire pour plusieurs objets .. Comme si vous voulez créer le comportement de l'être humain, vous pouvez avoir l'homme des objets et des femmes, qui partagent les mêmes comportements, mais ont des fonctions/attributs distincts. Si vous n'utilisez pas les interfaces de cette façon, dans ce cas, vous devrez créer 2 interfaces pour les deux sexes. Ainsi, les interfaces sont liées au comportement des objets. Par conséquent, les interfaces sont liées au comportement des objets.

3

Une interface Comparable doit être implémentée par des classes dont les instances peuvent être COMPARÉES; une interface Comparator (dans les langages qui font n'importe quel niveau de programmation générique, probablement Comparator<T>! -) devrait être implémentée par des classes dont les instances peuvent COMPARER D'AUTRES. Les deux usages ont d'excellents cas d'utilisation, essentiellement disjoints les uns des autres; vous semblez manquer cette distinction sémantique clé.

+0

l'exemple que j'utilise n'est lié à aucune implémentation d'un langage particulier (Java). L'interface Comparable/Comparator n'est qu'un exemple, qui pourrait être utilisé en C#, C++, ActionScript etc. – janetsmith

+0

Ma réponse n'est pas Java-y, je suggère simplement la notation '' pour la généricité parce qu'elle est largement utilisée. Mon point concerne * Anglais *: un Enumerable * peut être * énuméré, un Enumérateur * effectue * l'énumération; et ainsi de suite, pour la plupart des verbes transitifs. Sémantique très différente. Même les verbes intransitifs fonctionnent de manière similaire (typiquement avec une certaine préposition implicite): un objet Lughable est celui qui * peut être * ri (c'est ce que le mot MEANS!), Un Laugher est un sujet qui rit. C'est objet vs (grammatical) objet direct. –

Questions connexes