Cet article présente à tout le monde certaines choses sur la programmation orientée interface en combinant la nature des interfaces, la relation entre la programmation orientée objet et la programmation orientée interface, et la propre compréhension de l'auteur. Les amis qui en ont besoin peuvent en apprendre davantage.
Je pense que pour les programmeurs qui utilisent des langages de programmation orientés objet, le terme « interface » doit être familier, mais je me demande si vous avez de tels doutes : à quoi servent les interfaces ? Quelle est la différence entre cette classe et la classe abstraite ? Une classe abstraite peut-elle être utilisée à la place d’une interface ? De plus, en tant que programmeur, vous devez souvent entendre l'expression « programmation orientée interface », alors qu'est-ce que cela signifie ? Quelle est la connotation idéologique ? Quelle est sa relation avec la programmation orientée objet ? Cet article répondra à ces questions une par une.
1. Quelle est la relation entre la programmation orientée interface et la programmation orientée objet
Tout d'abord, la programmation orientée interface et ? La programmation orientée objet n'est pas au même niveau, ce n'est pas une idée de programmation indépendante plus avancée que la programmation orientée objet, mais elle est attachée au système idéologique orienté objet et en fait partie. En d’autres termes, c’est l’essence même des idées du système de programmation orientée objet.
2. L'essence de l'interface
L'interface, en apparence, est une collection de plusieurs définitions de méthodes sans code corporel. qui peut être implémenté (ou hérité) par une classe ou une autre interface. Sous sa forme, cela peut ressembler à ceci :
interface InterfaceName { void Method1(); void Method2(int para1); void Method3(string para2,string para3); }
Alors, quelle est l'essence d'une interface ? En d’autres termes, quel est le sens de l’existence de l’interface. Je pense que cela peut être considéré sous les deux angles suivants :
1) Une interface est un ensemble de règles, qui stipule un ensemble de règles qu'une classe ou une interface qui implémente cette interface doit avoir. Incarne la philosophie de la nature selon laquelle « si vous êtes..., vous devez être capable de... ».
Par exemple, dans la nature, les gens peuvent manger, c'est-à-dire "si vous êtes un humain, vous devez pouvoir manger". Ensuite, lors de la simulation dans un programme informatique, il devrait y avoir une interface IPerson (habituellement, le nom de l'interface commence par "I") et une méthode appelée Eat(). Nous stipulons ensuite que chaque classe représentant "personne" doit implémenter l'interface IPerson, qui. simule la règle de la nature "Si vous êtes un humain, vous devez pouvoir manger".
À partir de là, je pense que vous pouvez également voir une certaine pensée orientée objet. L'un des cœurs de la pensée orientée objet est de simuler le monde réel et d'abstraire les choses du monde réel en classes. L'ensemble du programme s'appuie sur des instances de chaque classe pour communiquer entre elles et coopérer pour accomplir les fonctions du système. est très cohérent avec les conditions de fonctionnement du monde réel et est également orienté vers l'essence de la pensée objet.
2) Une interface est une représentation abstraite de choses similaires sur une certaine vue granulaire. Notez qu'ici j'insiste sur une certaine vue granulaire, car le concept de « choses similaires » est relatif, et il diffère en raison de vues granulaires différentes.
Par exemple, à mes yeux, je suis une personne fondamentalement différente d'un cochon. Je peux accepter que mes camarades de classe et moi soyons du même genre, mais je ne pourrai jamais accepter que moi et un cochon. sont les mêmes. Cependant, si aux yeux d'un zoologiste, les cochons et moi sommes de la même espèce, parce que nous sommes tous les deux des animaux, il peut penser que "les gens" et "le cochon" implémentent l'interface IAnimal, et lorsqu'il étudie le comportement animal, il ne le fera pas. Il traitera moi et le cochon séparément, et l'étudiera à partir de la plus grande granularité de « l'animal », mais il pensera qu'il y a une différence essentielle entre moi et un arbre.
Maintenant, je suis devenu généticien, et la situation est différente Parce que les êtres vivants peuvent être hérités, à ses yeux, je ne suis pas seulement différent d'un cochon, mais aussi d'un moustique, d'un. bactérie, a Il n'y a aucune différence entre un arbre, un champignon ou même un virus du SRAS, car il pensera que nous implémentons tous l'interface IDescendable (note : descendre vi. héritage), c'est-à-dire que nous sommes tous des choses héréditaires, et il Il ne nous étudiera pas séparément, mais il étudiera tous les êtres vivants comme étant de la même espèce. À ses yeux, il n'y a pas de distinction entre les humains et les virus, seulement les matériaux héréditaires et les matériaux non héréditaires. Mais au moins il y a une différence entre moi et une pierre.
Mais quelque chose de malheureux s'est produit. Un jour, un grand homme est apparu sur la terre. Il s'appelait Lénine. Il a donc fait une définition célèbre : la soi-disant substance est la réalité objective qui peut être reflétée. par la conscience. À ce stade, il n’y a aucune différence entre moi et une pierre, un souffle d’air, un idiome et le champ électromagnétique qui transmet les signaux des téléphones portables, car aux yeux de Lénine, nous sommes tous des réalités objectives qui peuvent être reflétées par la conscience. Si Lénine était programmeur, il dirait ceci : Ce qu'on appelle la matière, ce sont les instances générées par toutes les classes qui implémentent à la fois les interfaces "IReflectabe" et "IEsse". (Remarque : réfléchir v. refléter esse n. réalité objective)
Peut-être penserez-vous que mon exemple ci-dessus est absurde, mais c'est exactement la raison pour laquelle les interfaces existent. L'un des concepts fondamentaux de la pensée orientée objet est appelé polymorphisme. Qu'est-ce que le polymorphisme ? Pour parler franchement, cela signifie que les choses similaires sont traitées uniformément sans distinction à un certain niveau de vue granulaire. La raison pour laquelle nous osons le faire est l’existence d’interfaces. Comme le généticien, il comprend que tous les organismes implémentent l'interface IDescendable, donc tant qu'il s'agit d'un organisme, il doit avoir la méthode Descend(), afin qu'il puisse mener des recherches unifiées au lieu d'étudier chaque organisme séparément et finir par mourir d'épuisement.
Peut-être que je ne peux pas vous donner une impression intuitive de la nature et de la fonction de l'interface ici. Ensuite, dans les exemples suivants et l'analyse de plusieurs modèles de conception, vous découvrirez plus intuitivement la connotation des interfaces.
3. Aperçu de la programmation orientée interface
Grâce à ce qui précède, je pense que tout le monde a une compréhension des interfaces et de la connotation idéologique des interfaces , puis Qu'est-ce que la programmation orientée interface ? Ma définition personnelle est la suivante : dans l'analyse et l'architecture du système, distinguer les niveaux et les dépendances. Chaque niveau ne fournit pas directement de services à sa couche supérieure (c'est-à-dire qu'il n'est pas directement instancié dans la couche supérieure), mais uniquement en définissant un ensemble d'interfaces. . La couche supérieure expose sa fonction d'interface, et la couche supérieure dépend uniquement de l'interface de la couche inférieure et ne s'appuie pas sur des classes spécifiques.
Les avantages de cette méthode sont évidents. Tout d'abord, c'est excellent pour la flexibilité du système. Lorsque la couche inférieure doit être modifiée, tant que l'interface et la fonction d'interface restent inchangées, la couche supérieure n'a besoin d'aucune modification. Vous pouvez même remplacer toute la couche inférieure sans modifier le code de la couche supérieure, tout comme nous remplaçons un disque dur WD 60G par un disque dur Seagate 160G. Il n'est pas nécessaire d'apporter des modifications aux autres parties de l'ordinateur. le disque dur d'origine et installez le nouveau disque dur. Branchez-le simplement, car les autres parties de l'ordinateur ne dépendent pas d'un disque dur spécifique, mais uniquement d'une interface IDE. Tant que le disque dur implémente cette interface, il peut être remplacé. À partir de là, l'interface du programme est très similaire à l'interface dans la réalité, donc je pense toujours que le mot interface est vraiment similaire !
Un autre avantage de l'utilisation des interfaces est que les développeurs de différents composants ou niveaux peuvent commencer à travailler en parallèle, tout comme ceux qui construisent des disques durs n'ont pas à attendre ceux qui construisent des processeurs ou des moniteurs. tant que les interfaces sont cohérentes, la conception est raisonnable et peut être développée en parallèle pour améliorer l'efficacité.
Cet article se termine ici en premier. Enfin, je voudrais dire encore une chose : l'essence de l'orientation objet est de simuler la réalité, ce qui peut aussi être considéré comme l'âme de mon article. Par conséquent, réfléchir davantage aux choses orientées objet à partir de la réalité sera très utile pour améliorer les capacités d’analyse et de conception du système.
Dans le prochain article, j'utiliserai un exemple pour démontrer les méthodes de base de la programmation d'interface.
Dans le troisième article, j'analyserai quelques idées de programmation orientée interface dans les modèles de conception classiques et analyserai les idées orientées interface dans l'architecture en couches .NET.
1. Concernant les deux mots « interface » dans « programmation orientée interface » et « interface » dans des langages orientés objet spécifiques
Voir Un ami a suggéré un jour que le mot « interface » dans « programmation orientée interface » devrait avoir une portée plus large que le mot « interface » dans un langage de programmation pur. Après réflexion, je pense que c'est logique. Ce que j'ai écrit ici est en effet déraisonnable. Je pense que « interface » dans les langages orientés objet fait référence à une structure de code spécifique, telle que l'interface définie avec le mot-clé interface en C#. L'« interface » dans la « programmation orientée interface » peut être considérée comme faisant référence à un composant structurel utilisé pour masquer des classes sous-jacentes spécifiques et implémenter le polymorphisme du point de vue de l'architecture logicielle et à un niveau plus abstrait. En ce sens, si une classe abstraite est définie et que le but est de réaliser le polymorphisme, alors je pense qu'il est raisonnable d'appeler cette classe abstraite une « interface ». Mais est-il raisonnable d’utiliser des classes abstraites pour implémenter le polymorphisme ? Discuté dans le deuxième article ci-dessous.
En résumé, je pense que les deux concepts d'"interface" sont à la fois différents l'un de l'autre et liés l'un à l'autre. L'interface dans la « programmation orientée interface » est un composant architectural idéologique utilisé pour réaliser le polymorphisme, améliorer la flexibilité et la maintenabilité du logiciel, et « l'interface » dans un langage spécifique est un composant concret à ce niveau idéologique implémenté dans le code.
2. À propos des classes abstraites et des interfaces
J'ai vu qu'il s'agissait d'une question très débattue dans les réponses. Je suis désolé d'avoir mal pensé à discuter de cette question dans l'article. Ma compréhension personnelle de ce problème est la suivante :
Si vous regardez le code spécifique seul, il est facile de brouiller ces deux concepts, et vous pensez même que l'interface est redondante, car à partir de la seule fonction spécifique, à l'exception de héritage multiple (C# , Java), les classes abstraites semblent pouvoir remplacer complètement les interfaces. Cependant, l’interface existe-t-elle pour implémenter l’héritage multiple ? Bien sûr que non. À mon avis, la différence entre les classes abstraites et les interfaces réside dans la motivation de leur utilisation. Le but de l'utilisation de classes abstraites est la réutilisation du code, tandis que la motivation de l'utilisation des interfaces est d'atteindre le polymorphisme. Donc, si vous ne savez pas si vous devez utiliser une interface ou une classe abstraite quelque part, réfléchissez à votre motivation.
J'ai vu des amis remettre en question l'interface IPerson. Ma compréhension personnelle est que la définition de l'interface IPerson dépend de l'application spécifique. Si nous avons Women et Man dans notre projet, tous deux héritent de Person, et que la plupart des méthodes de Women et Man sont les mêmes, une seule méthode
DoSomethingInWC() est différente (l'exemple est plutôt vulgaire, veuillez pardonner moi), alors bien sûr, la définition d'une classe abstraite An AbstractPerson est plus raisonnable, car elle peut inclure toutes les autres méthodes, et la sous-classe définit uniquement DoSomethingInWC(), ce qui réduit considérablement la quantité de code répété.
Cependant, si les classes Women et Man de notre programme n'ont fondamentalement pas de code commun et qu'il existe une classe PersonHandle qui doit les instancier, et que nous ne voulons pas savoir s'ils sont de sexe masculin ou féminines, mais simplement les traiter comme des êtres humains et mettre en œuvre le polymorphisme, alors il faut les définir comme des interfaces.
En bref, la différence entre les interfaces et les classes abstraites réside principalement dans la motivation d'utilisation, pas en elles-mêmes. Le fait que quelque chose doive être défini comme une classe abstraite ou une interface dépend du contexte de l'environnement spécifique.
De plus, je pense qu'une autre différence entre les interfaces et les classes abstraites est qu'il devrait y avoir une relation générale et spéciale entre une classe abstraite et ses sous-classes, alors qu'une interface est simplement que ses sous-classes devraient Un ensemble de règles mises en œuvre. (Bien sûr, il peut parfois y avoir une relation générale et spéciale, mais le but de l'utilisation des interfaces n'est pas ici.) Par exemple, il est acceptable de définir les véhicules comme des classes abstraites, et les voitures, les avions et les navires comme des sous-classes, car les voitures , les avions, les navires sont un moyen de transport spécial. Un autre exemple est l'interface Icomparable. Elle dit simplement que les classes qui implémentent cette interface doivent être comparables. Si la classe Car implémente Icomparable, cela signifie simplement qu'il existe une méthode dans notre Car pour comparer deux instances de Car. Elle peut être plus chère ou plus grande, cela n'a pas d'importance. Mais nous ne pouvons pas dire « les voitures sont d'un type spécial ». de chose qui peut être comparée. » C’est grammaticalement déraisonnable.
Résumé
En général, la programmation orientée interface signifie qu'entre toutes les classes ou modules d'un système orienté objet L'interaction est complétée par l'interface.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!