336 votes

Interface de nommage en Java

La plupart des langages à objets préfixe leurs noms d'interface avec un I majuscule, pourquoi Java ne pas le faire? Quelle fut la raison du non-respect de cette convention?

Pour démontrer ce que je veux dire, si je voulais avoir une interface Utilisateur mise en œuvre que j'avais deux choix en Java:

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

Où, dans la plupart des langues:

Class = Utilisateur, Interface = IUser

Maintenant, vous pourriez dire que vous pouvez toujours choisir un nom plus descriptif pour l'utilisateur mise en œuvre et le problème disparaît, mais Java est en poussant un POJO approche des choses et la plupart du CIO conteneurs utilisation DynamicProxies largement. Ces deux choses ensemble signifier que vous aurez beaucoup d'interfaces avec un simple POJO mise en œuvre.

Donc, je suppose que ma question se résume à: "Est-il la peine de suivre l'ensemble de l'Interface de convention de nommage en particulier à la lumière de l'endroit où Java Cadres semblent être à la tête?"

341voto

starblue Points 29696

Je préfère ne pas utiliser un préfixe sur les interfaces:

  • Le préfixe mal la lisibilité.

  • L'utilisation d'interfaces de clients est la meilleure façon de programmer, de sorte que des noms d'interfaces doit être le plus court et le plus agréable possible. La mise en œuvre de classes devrait être plus laide de décourager leur utilisation.

  • Lors de la modification d'une classe abstraite à une interface d'une convention de codage avec le préfixe je suppose renommer toutes les occurrences de la classe --- pas bon!!!

125voto

MrWiggles Points 6622

Est-il vraiment une différence entre:

class User implements IUser

et

class UserImpl implements User

si tout ce que nous parlons est de conventions de nommage?

Personnellement, je préfère ne PAS en les précédant l'interface avec le "je" que je veux être codage de l'interface, et je considère que le plus important en termes de la convention de nommage. Si vous appelez l'interface IUser puis tous les consommateurs de cette classe a besoin de connaître ses une IUser. Si vous appelez la classe UserImpl ensuite, seule la classe et de votre conteneur d'injection de dépendances savoir sur l'Impl partie et les consommateurs savent qu'ils vont travailler avec un Utilisateur.

Alors encore une fois, la fois où j'ai été forcé d'utiliser Impl parce qu'un meilleur nom, n'est pas de présenter lui-même ont été peu et loin entre les deux, car la mise en œuvre devient nommé conformément à la mise en œuvre parce que c'est là qu'il est important, par ex.

class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO

78voto

Avi Points 14468

Il peut y avoir plusieurs raisons Java n'utilise généralement pas le IUser convention.

  1. Le cadre de l'approche Orientée-Objet, c'est que vous ne devriez pas avoir à savoir si le client est à l'aide d'une interface ou une classe d'implémentation. Ainsi, de la même Liste est une interface et un String est une classe, une méthode pourrait être adoptée par les deux d'entre eux - il n'est pas judicieux de distinguer visuellement les interfaces.

  2. En général, nous fait préférer l'utilisation des interfaces dans le code client (préférez Liste de liste de tableaux, par exemple). Donc, il n'est pas judicieux de rendre les interfaces se démarquent comme des exceptions.

  3. La Java naming convention préfère des noms plus longs avec des significations réelles hongrois style de préfixes. De sorte que le code sera aussi lisible que possible: une Liste représente une liste, et un Utilisateur représente un utilisateur - et non une IUser.

74voto

ng. Points 4096

Il y a aussi une autre convention, utilisé par de nombreux projets open source, y compris de Printemps.

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 option de la convention. Donc, si j'adopte ce n'IIOPConnection dire 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..ici, la réponse est non, parce que les conventions ne sont pas toujours suivies, de la police et leur permettra de créer plus de travail que la convention elle-même sauve.

44voto

Andreas Petersson Points 8096

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.

. vous commencez avec une mise en œuvre sans une interface. plus tard, vous décidez par la suite, ainsi, il ya un besoin pour une interface ici, vous convertissez votre classe à une interface.

il devient alors évident: l'original de votre classe a été appelé de l'Utilisateur. votre interface est maintenant appelé l'Utilisateur. peut-être que vous avez un UserProdImpl et un UserTestImpl. si vous avez conçu votre demande et bien, à chaque classe (à l'exception de ceux qui instancier Utilisateur) ne sera pas modifié et ne sera pas remarqué que, soudain, l'obtenir passé une interface.

ainsi, il devient clair -> Interface Utilisateur mise en œuvre UserImpl.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X