Nom de l'Interface en Java [fermé]

la plupart des langues oo préfixent leurs noms d'interface avec un I majuscule, pourquoi Java ne fait-il pas cela? Pourquoi ne pas avoir suivi cette convention?

pour démontrer ce que je veux dire, si je voulais avoir une interface utilisateur et une implémentation utilisateur, j'aurais deux choix en Java:

  1. Class = User, Interface =UserInterface
  2. Class = UserImpl, L'Interface D'Utilisateur =

où dans la plupart des langues:

Class = User, Interface =IUser

Maintenant, vous pourriez faire valoir que vous pourriez toujours choisir un nom le plus descriptif pour l'implémentation de l'utilisateur et le problème disparaît, mais Java pousse une approche POJO pour les choses et la plupart des conteneurs IOC utilisent DynamicProxies intensivement. Ces deux choses ensemble signifier que vous aurez beaucoup d'interfaces avec un seul POJO implementation.

donc, je suppose que ma question se résume à: " est-ce que cela vaut la peine de suivre la convention de nommage de L'Interface plus large en particulier à la lumière de L'endroit où Java Frameworks semblent se diriger?"

287
demandé sur mavis 2009-02-12 18:51:33

11 réponses

je préfère ne pas utiliser de préfixe sur les interfaces:

  • le préfixe nuit à la lisibilité.

  • L'utilisation d'interfaces dans les clients est la meilleure façon standard de programmer, donc les noms d'interfaces doivent être aussi courts et agréables que possible. La mise en place de classes devrait être plus laide pour décourager leur utilisation.

  • lors du passage d'une classe abstraite à une interface a convention de codage avec le préfixe I implique de renommer toutes les occurrences de la classe - - - pas bon!

298
répondu starblue 2009-02-12 16:23:43

Est-il vraiment une différence entre:

class User implements IUser

et

class UserImpl implements User

si on ne parle que de conventions de nommage?

personnellement, je préfère ne pas précéder l'interface avec I car je veux coder à l'interface et je considère que à être plus important en termes de la convention de nommage. Si vous appelez l'interface IUser alors chaque consommateur de cette classe a besoin de connaître ses une IUser . Si vous appelez la classe UserImpl , alors seulement la classe et votre contenant DI savent à propos de la partie Impl et les consommateurs savent juste qu'ils travaillent avec un User .

encore une fois, les fois où j'ai été forcé d'utiliser Impl parce qu'un meilleur nom ne se présente pas lui-même ont été rares et loin entre parce que l'application se nomme selon à l'application parce que c'est là que c'est important, par exemple

class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
101
répondu tddmonkey 2017-11-21 13:53:23

il peut y avoir plusieurs raisons pour lesquelles Java n'utilise pas généralement la convention IUser.

  1. une partie de l'approche orientée objet est que vous ne devriez pas avoir à savoir si le client utilise une interface ou une classe d'implémentation. Donc, même List est une interface et String est une classe réelle, une méthode peut être passée à la fois - cela n'a pas de sens de distinguer visuellement les interfaces.

  2. en général, nous préférerons en fait l'utilisation d'interfaces dans le code client (préférons List à ArrayList, par exemple). Il n'est donc pas logique de faire des interfaces des exceptions.

  3. la Convention de nommage Java préfère les noms plus longs avec des significations réelles aux préfixes de style Hongrois. Ainsi, le code sera aussi lisible que possible: une liste représente une liste, et un utilisateur représente un utilisateur - pas un utilisateur.

71
répondu Avi 2009-02-12 16:17:16

il y a aussi une autre convention, utilisée par de nombreux projets open source dont Spring.

interface User {
}

class DefaultUser implements User {
}

class AnotherClassOfUser implements User {
}

personnellement, je n'aime pas le préfixe" I " pour la simple raison que c'est une convention facultative. Donc si j'adopte ceci, est-ce que IIOPConnection signifie une interface pour IOPConnection? Que faire si la classe n'a pas le préfixe "I", puis-je sais que ce n'est pas une interface..la réponse ici est non, parce que les conventions ne sont pas toujours suivies, et leur maintien créera plus de travail que la convention elle-même sauve.

69
répondu ng. 2009-02-12 16:15:07

comme l'a dit un autre poster, il est généralement préférable d'avoir des interfaces qui définissent des capacités et non des types. J'aurais tendance à ne pas "mettre en œuvre" quelque chose comme un "utilisateur", et c'est pourquoi "IUser" n'est souvent pas vraiment nécessaire de la façon décrite ici. Je vois souvent les classes comme des noms et les interfaces comme des adjectifs:

class Number implements Comparable{...}  
class MyThread implements Runnable{...}
class SessionData implements Serializable{....}

parfois un adjectif n'a pas de sens, mais j'utiliserais généralement des interfaces pour modéliser le comportement, les actions, les capacités, les propriétés, etc.,.. pas types.

aussi, si vous alliez vraiment faire qu'un seul utilisateur et l'appeler utilisateur alors quel est l'intérêt d'avoir aussi une interface IUser? Et si vous allez avoir quelques différents types d'utilisateurs qui ont besoin d'implémenter une interface commune, ce qui n'ajoutant un "je" de l'interface vous sauver dans le choix des noms des implémentations?

je pense qu'un exemple plus réaliste serait que certains types d'utilisateurs doivent être en mesure de se connecter à un API particulier. Nous pourrions définir une interface de connexion, puis avoir une classe" User " parent avec SuperUser, DefaultUser, AdminUser, AdministrativeContact, etc suclasses, dont certains vont ou ne vont pas implémenter la connexion (Loginable? l'interface sont nécessaires.

43
répondu nairbv 2012-01-06 19:57:18

Bob Lee a dit une fois dans une présentation:

quel est le point d'une interface si vous avoir un seul de la mise en œuvre.

ainsi, vous commencez avec une mise en œuvre i.e. sans interface. plus tard, vous décidez, bien, il y a un besoin pour une interface ici, donc vous convertissez votre classe en une interface.

alors cela devient évident: votre classe d'origine s'appelait User. votre interface est maintenant appelé utilisateur. vous avez peut-être un UserProdImpl et un Userestimpl. si vous avez bien conçu votre application, chaque classe (à l'exception de celles qui instancient L'Utilisateur) sera inchangée et ne remarquera pas qu'ils passent soudainement une interface.

donc il devient clair -> Interface utilisateur de mise en œuvre UserImpl.

35
répondu Andreas Petersson 2017-11-14 06:33:25

En C# c'est

public class AdminForumUser : UserBase, IUser

Java dirait

public class AdminForumUser extends User implements ForumUserInterface

pour cette raison, Je ne pense pas que les conventions soient aussi importantes en java pour les interfaces, puisqu'il y a une différence explicite entre l'héritage et l'implémentation d'interface. Je dirais juste de choisir n'importe quelle convention de nommage que vous voulez, aussi longtemps que vous êtes consistant et utilisez quelque chose pour montrer aux gens que ce sont des interfaces. Je n'ai pas fait java depuis quelques années, mais tout les interfaces seraient simplement dans leur propre répertoire, et c'était la convention. N'a jamais vraiment eu de problèmes avec elle.

23
répondu Matt Briggs 2009-02-12 16:26:07

d'après mon expérience, la convention" I " s'applique aux interfaces qui sont destinées à fournir un contrat à une classe, en particulier lorsque l'interface elle-même n'est pas une notion abstraite de la classe.

Par exemple, dans votre cas, j'avais seulement s'attendre à voir IUser si le seul utilisateur que vous avez l'intention d'avoir User . Si vous prévoyez d'avoir différents types d'utilisateurs - NoviceUser , ExpertUser , etc. - Je m'attendrais à voir une interface User (et, peut-être, une classe AbstractUser qui implémente certaines fonctionnalités communes, comme get/setName() ).

Je m'attendrais aussi à des interfaces qui définissent les capacités - Comparable , Iterable , etc. - pour être nommé comme ça, et pas comme IComparable ou IIterable .

6
répondu David Koelle 2016-01-05 19:23:30

suivant de bons principes OO, votre code devrait (dans la mesure du possible) dépendre d'abstractions plutôt que de classes concrètes. Par exemple, il est généralement préférable d'écrire une méthode comme ceci:

public void doSomething(Collection someStuff) {
    ...
}

que ceci:

public void doSomething(Vector someStuff) {
    ...
}

si vous suivez cette idée, alors je maintiens que votre code sera plus lisible si vous donnez des noms d'interfaces comme "User" et " BankAccount "(par exemple), plutôt que" IUser"," UserInterface", ou d'autres variantes.

les seuls éléments de code qui devraient s'appliquer aux classes de béton proprement dites sont les endroits où les classes de béton sont construites. Tout le reste doit être écrit à l'aide des interfaces.

si vous faites cela, alors les noms de classe" laids "comme" UserImpl "devraient être cachés en toute sécurité du reste du code, qui peut joyeusement continuer à utiliser les noms d'interface" nice".

5
répondu KarstenF 2009-02-12 22:18:41

=v= Le préfixe "I" est également utilisé dans le Guichet cadre, où je me suis habitué rapidement. En général, j'accueille favorablement toute convention qui raccourcit les noms de classe Java encombrants. C'est un problème, cependant, que tout est classé par ordre alphabétique sous "I" dans les répertoires et dans le Javadoc.

wicket coding practice est similaire à Swing, en ce que de nombreuses instances de contrôle/widget sont construites comme classes internes anonymes avec des déclarations de méthode en ligne. Fâcheusement, il en diffère 180° de Swing dans cette Swing utilise un préfixe ("J") pour les classes d'implémentation.

le suffixe "Impl" est une abréviation mangly et ne s'internationalise pas bien. Si seulement nous étions allés au moins avec "Imp" il serait plus mignon (et plus court). "Impl" est utilisé pour le CIO, surtout au printemps, donc on est un peu coincés avec pour l'instant. Il obtient un peu schizo suivant 3 conventions différentes dans trois parties différentes d'une base de données, cependant.

2
répondu Jym Dyer 2011-06-13 20:57:43

S'agit-il d'une convention d'appellation plus large? Je suis plutôt du côté C++, et pas vraiment du côté Java et descendants. Combien de communautés linguistiques utilisent la convention I?

si vous avez une convention de nommage standard boutique indépendante de la langue ici, utilisez-la. Si ce n'est pas le cas, utilisez la convention de nommage des langues.

0
répondu David Thornley 2009-02-12 17:57:25