Question

C'est fondamentalement le même que Codage aux interfaces, mais joué dans le monde réel de Lorsqu'il existe diverses complexités d'ingénierie telles que l'immuabilité des interfaces et des implémentations publiées, etc.


Considérez la situation suivante:

Une bibliothèque orientée objet de niveau OS avec un ensemble d'interfaces publiées et une implémentation fournie par le système d'exploitation.

Certains points d'extension sont fournis afin que des tiers puissent étendre des comportements spécifiques en mettant en œuvre un sous-ensemble des interfaces publiées et en les enregistrant auprès du système d'exploitation.

Un programmeur examine l'ensemble des interfaces publiées et dit à moi: "Il semble que je puisse réimplémenter la plupart des fonctionnalités (avec de meilleurs algorithmes), y compris les domaines qui ne sont pas désignés comme extensibles." Et donc le programmeur travaille.

Ce n'est que lorsque la propre implémentation du programmeur se masque (com-style) avec l'implémentation du système d'exploit suite d'objets Comme mis en œuvre par le système d'exploitation reposent fortement sur les communications à l'aide d'interfaces non publiées, car l'interface publiée a été minimaliste et a bloqué de nombreuses opportunités aux optimisations (*).

(*) Dans les tâches de codage / décodage / trans-codage (des données / image / sono / compression vidéo), il est bien connu que certaines étapes de pipelines peuvent s'annuler s'ils effectuent l'exécution exact de fonctionnement / inverse, par exemple G(F(x)) == x.

Une interaction typique est comme:

  1. Le consommateur demande au producteur s'il implémente une interface spéciale x que seul le fournisseur V connaît.
  2. Si oui, le consommateur parle au producteur en utilisant l'interface X et voyez s'ils sont exacts en face (# 1).
  3. Si oui, le consommateur demande au producteur son "stade supérieur" (c.-à-d. Producteur de contournement) (# 2) afin qu'en fait, les deux soient annulés.

(# 1) et (# 2) sont des capacités qui manquent dans l'interface publiée minimaliste. À première vue, il semble que Le vendeur pourrait également les fournir, mais choisissez de ne pas.

Il se pourrait également que fournir ces interfaces axées sur les performances polluerait gravement l'espace de noms.


Le résultat final est que chaque fois qu'un programmeur fournit sa propre implémentation d'une certaine classe, elle échouerait (i) lamentablement, soit (ii) fonctionner très lentement, car elle ne pouvait pas interagir avec le reste des suite en utilisant les interfaces internes améliorées des performances connues uniquement suite.

Est-ce un problème plus fréquent avec certaines saveurs de la technologie orientée objet? Ou est-il plus courant avec certaines saveurs de l'ingénierie basée sur les composants?

Les défenseurs de l'OOP soutiendront que le refactorisation et la publication de ces interfaces résoudront le problème. Cela suppose qu'il est possible de distribuer une nouvelle version de la bibliothèque avec un nouvel ensemble d'interface. Pour une technologie, ce n'est pas possible.


La façon dont cela compte de est que c'est QueryInterface La méthode permet une requête d'exécution (et une réponse d'exécution) des interfaces supplémentaires implémentées par une classe. Son équivalent Java serait comme une bibliothèque qui fait de la forte utilisation de instanceof pour les interfaces internes au package.

Aux critiques: Je suis ouvert aux suggestions sur la réduction de la question de son essence.

Le terme correct semble être Mélanger, grâce à ça question.


Cette réponse est en partie pertinent, mais mon exemple se concentre sur les opportunités perdues d'optimisations au sein d'une seule bibliothèque. Fondamentalement, si un implémentateur tiers n'a pas fait les deux:

  1. Mettre en œuvre à la fois l'encodeur et le décodeur
  2. Mettez en œuvre sa propre interface propriétaire sur l'encodeur et le décodeur, afin de détecter et de contourner les opérations qui s'annulent

Ensuite, l'implémentation n'obtiendra des «performances de base» que lors de l'interopération avec différents encodeurs / décodeurs des autres fournisseurs.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
scroll top