web-dev-qa-db-fra.com

Pourquoi utiliser l'interface dans le modèle de conception Dao ou d'autres modèles de conception

Veuillez voir ci-dessous les composants d'un motif de conception Dao: 

Le modèle d'objet d'accès aux données ou le modèle DAO est utilisé pour séparer les données de bas niveau qui accèdent à l'API ou aux opérations des services métier de niveau supérieur. Voici les participants au modèle d’objet d’accès aux données.

Interface d'accès aux données - Cette interface définit les opérations standard à effectuer sur un ou plusieurs objets de modèle.

Classe concrète de Data Access Object - Cette classe implémente l'interface ci-dessus. Cette classe est chargée d’obtenir des données d’une source de données pouvant être la base de données/xml ou tout autre mécanisme de stockage.

Objet modèle ou objet valeur - Cet objet est un simple POJO contenant des méthodes get/set pour stocker les données extraites à l'aide de la classe DAO.

Pourquoi avons-nous besoin d'une INTERFACE lorsque nous avons un cours concret et pourquoi ne pouvons-nous pas l'utiliser directement? C'est peut-être une question naïve, mais aidez-moi, s'il vous plaît, à bien comprendre. Non seulement dans le motif de conception DAO, mais aussi dans d’autres, l’utilisation d’INTERFACE est un peu déroutante. Je conviens que cela est lié à la réutilisabilité du code et au couplage réduit. Mais peut-on expliquer un peu plus s'il vous plaît. 

21
user3541375

Non seulement dans le modèle de conception DAO, mais également dans d’autres, utiliser D’INTERFACE est un peu déroutant.

Interfaces est l'un des concepts les mieux utilisés en Java. Permettez-moi de vous expliquer ceci à l'aide d'un exemple: supposons que vous ayez conçu un appareil GPS pour voiture qui regarde sur la carte et oriente automatiquement la voiture dans la direction indiquée sur la carte. Cet appareil GPS peut être utilisé dans de nombreuses voitures telles que benz, fiat, etc. Pour chaque voiture, le mécanisme de rotation à gauche ou à droite peut différer en fonction de la mise en oeuvre du système de la voiture. Donc, ces fonctions doivent être écrites par le constructeur de la voiture et, partant, ces méthodes sont placées dans une interface, qui est mise en œuvre par le constructeur de la voiture conformément à l'implémentation de sa voiture. L'interface comprend uniquement un ensemble de fonctions déclarations qui doivent être définies par le constructeur automobile (dans ce cas). Je l'ai? 

Pour en savoir plus sur les interfaces et leur utilité, lisez cet article .

Ma question est la suivante: pourquoi avons-nous besoin d’une INTERFACE lorsque nous avons une classe Concrète et pourquoi ne pouvons-nous pas l’utiliser directement?.

Parmi les nombreux avantages mentionnés dans les réponses ci-dessous, vous pouvez créer de nombreuses classes DAO pour différents structureurs de données (base de données derby, énormes piles, etc.), qui implémentent l'interface DAO. L'avantage est que chaque classe peut être stockée dans une variable d'interface DAO, elle s'appelle polymorphism

22
Matej Špilár

En réalité, il n'est pas nécessaire d'avoir une interface lorsque vous n'avez qu'une seule implémentation. Mais il y a certaines situations où il est très pratique de ne pas avoir une dépendance à la classe de béton:

  • Tester votre service qui appelle le DAO: Vous pouvez écrire un DAO simulé Qui se comporte exactement comme vous en avez besoin dans le test (par exemple, simulez qu'il n'y a pas de connexion à la base de données, ce qui est difficile à reproduire automatiquement. )

  • générer des couches autour de votre DAO. Vous pouvez utiliser AOP pour générer La mise en cache ou le traitement des transactions autour de vos méthodes DAO. Dans ce cas, Vous avez un objet qui implémente l'interface DAO mais n'a rien à faire avec Avec l'implémentation d'origine.

  • Changer de technologie DB. Si vous passez de MySQL à DB2, il vous suffit D'écrire une autre implémentation de l'interface et de commuter MySQL DAO et DB2 DAO.

C'est donc une bonne pratique d'avoir une interface pour vos DAO et services.

13
Jens Baitinger

Ma question est la suivante: pourquoi avons-nous besoin d’une INTERFACE lorsque nous avons un cours concret et pourquoi ne pouvons-nous pas l’utiliser directement?.

C'est simple abstraction. Supposons que vous utilisiez Oracle Database comme base de données. La classe concrète disposera donc d’une logique pour accéder (à CRUD) à la base de données Oracle. Demain, si votre licence expire et que vous ne souhaitez plus utiliser Oracle DB, vous préférerez utiliser MySQL. Maintenant, vous devrez réécrire la classe concrète déjà mentionnée et avec cela, vous devrez également réécrire la couche de service, car en utilisant directement la classe concrète et ses méthodes, vous obtenez un couplage étroit entre la couche de service et la couche d'accès aux données. Il faut toujours concevoir des systèmes avec un couplage lâche à l’esprit.

Si vous deviez utiliser une interface au lieu de la classe concrète, la couche de service et la couche d'accès aux données ont un contrat d'interaction. Ainsi, la couche de service ne sera pas affectée par les modifications apportées à la couche de données, car le contrat n'a pas changé et elles peuvent interagir de la même manière.

6
Kishore

Il est toujours judicieux de séparer l'interface de l'implémentation. Il fournit plus d'abstraction et flexibilité à votre code. Les clients de votre interface DAO n'ont pas besoin de savoir comment elle est implémentée, mais uniquement les méthodes fournies.

En fin de compte, les interfaces sont une bonne pratique pour la maintenabilité de votre code.

Pour ajouter à mon expérience dans les tests unitaires via des simulacres, il est beaucoup plus facile de créer des objets simulacres lorsque l’objet que vous simulez a une interface. Donc, utiliser des interfaces facilite pour moi isoler et test votre code.

2
renz

Une bonne raison est qu’il est facile d’écrire des implémentations factices pour tester votre application. 

Supposons que vous souhaitiez tester le module X utilisant UserService. Lorsque vous écrivez un code de test, vous souhaiterez qu'il n'utilise pas le véritable UserService, mais une version de test spéciale de UserService qui renvoie des données de test prédéfinies. Ainsi, lors de votre test, vous passez votre propre implémentation fictive d'IUserService au lieu du véritable UserService. 

De plus, cela facilite l’extension future du système avec une implémentation différente de IUserService. Peut-être avez-vous maintenant un UserService qui lit des informations sur les utilisateurs à partir d'une base de données. Par exemple, à l'avenir, vous voudrez peut-être également disposer d'un UserService qui obtienne des informations à partir de LDAP. Ce ne serait qu'une autre implémentation d'IUserService. Etant donné que le reste de l'application utilise UserService uniquement via l'interface, il sera facile d'échanger une implémentation pour une autre. 

0
user1686621

Cela concerne plus la séparation logique du code.

Pour des informations détaillées sur les interfaces, veuillez lire cette page à partir de Java:

http://docs.Oracle.com/javase/tutorial/Java/concepts/interface.html

0
Aeseir