Sens de l'Abstraction qui Fuit?
Que signifie le terme "Abstraction qui Fuit" signifie? (Veuillez expliquer avec des exemples. J'ai souvent un moment difficile grokking une simple théorie.)
- double possible de Couramment les interfaces et les abstractions qui fuient
- Vous voudrez peut-être lire Joel Spolsky de l'article original La Loi des Abstractions qui fuient qui, autant que je sais, c'est l'origine du terme.
- La plupart des réponses de la proposition de dupe sont couramment sur les interfaces.
- Deuxième plus voter post répond à ce qu'il fuit à l'abstraction, et avec un excellent exemple.
- Lorsque vous google votre manière à cette question 4 ans plus tard, il est difficile de deviner quel poste utilisé pour être le 2ème plus haut voté un.
Vous devez vous connecter pour publier un commentaire.
Voici un espace réel (meatspace) exemple:
Automobiles ont des abstractions pour les conducteurs. Dans sa forme la plus pure, il y a un volant, l'accélérateur et le frein. Cette abstraction se cache beaucoup de détails à propos de ce qui se trouve sous le capot: moteur, cams, courroie de distribution, bougies d'allumage, radiateur, etc.
La chose intéressante à propos de cette abstraction est que l'on peut remplacer une partie de la mise en œuvre avec l'amélioration des pièces sans recyclage de l'utilisateur. Disons-nous remplacer le bouchon du distributeur avec allumage électronique, et nous remplaçons le fixe cam avec une variable cam. Ces changements visent à améliorer la performance, mais l'utilisateur a toujours steers avec la roue et utilise les pédales pour démarrer et arrêter.
C'est en fait tout à fait remarquable... un vieux de 16 ans ou d'une personne âgée de 80 ans peuvent utiliser cette pièce compliquée de machines sans vraiment trop savoir comment il fonctionne à l'intérieur!
Mais il y a des fuites. La transmission est une petite fuite. Dans une transmission automatique, vous pouvez sentir la voiture à perdre de la puissance pour un moment, comme il change de vitesse, alors que dans le CVT vous vous sentez un couple tout le chemin jusqu'à.
Il y a plus de fuites, trop. Si vous tourner le moteur trop vite, vous risquez de faire des dégâts. Si le bloc moteur est trop froid, la voiture ne peut pas démarrer ou il peut avoir de mauvaises performances. Et si vous les appliquez la radio, les phares, et CA tous en même temps, vous verrez votre consommation d'essence aller vers le bas.
Cela signifie simplement que votre abstraction expose certains des détails de mise en œuvre, ou que vous devez être au courant des détails de mise en œuvre lors de l'utilisation de l'abstraction. Le terme est attribué à Joel Spolsky, circa 2002. Voir wikipedia l'article pour plus d'informations.
Un exemple classique de réseau sont les bibliothèques qui permettent de traiter des fichiers à distance et locales. Le développeur à l'aide de cette abstraction doit être conscient que les problèmes de réseau qui peuvent provoquer ce à l'échec dans les moyens que les fichiers locaux ne pas. Vous avez ensuite besoin de développer du code pour gérer spécifiquement les erreurs à l'extérieur de l'abstraction que le réseau de la bibliothèque fournit.
Wikipédia a un assez bonne définition pour cette
Ou en d'autres termes, pour les logiciels, c'est quand vous pouvez observer les détails de l'implémentation d'une fonction au moyen de limitations ou d'effets secondaires dans le programme.
Un exemple rapide serait C# /VB.Net fermetures et de leur incapacité à saisir ref /paramètres de sortie. La raison pour laquelle ils ne peuvent pas être capturés est due à une mise en œuvre détaillée de la façon dont le processus de levage se produit. Ce n'est pas à dire cependant qu'il existe une meilleure façon de le faire.
Voici un exemple familier .NET développeurs: ASP.NET's
Page
classe tente de masquer les détails de l'adresse HTTP opérations, en particulier la gestion des données d'un formulaire, afin que les développeurs n'ont pas à traiter avec les valeurs envoyées (parce qu'il mappe automatiquement les valeurs d'un formulaire pour les commandes de serveur).Mais si vous vous promenez au-delà de l'utilisation la plus élémentaire des scénarios de la
Page
l'abstraction commence à fuir, et il devient très difficile de travailler avec des pages à moins de comprendre la classe de détails de mise en œuvre.Un exemple courant est l'ajout dynamique de contrôles à une page - la valeur ajouté dynamiquement des contrôles de ne pas être mappé pour vous, sauf si vous les ajoutez à juste au bon moment: avant le moteur sous-jacent de cartes entrant les valeurs d'un formulaire pour les commandes appropriées. Lorsque vous avez à apprendre, que l'abstraction a fuite.
Bien, dans un sens, c'est purement théorique de la chose, mais pas sans importance.
Nous utilisons des abstractions pour rendre les choses plus facile à comprendre. J'ai peut fonctionner sur une chaîne de la classe dans un langage de cacher le fait que je fais face à un ensemble ordonné de caractères qui sont des éléments individuels. Je traite avec un ensemble ordonné de caractères de cacher le fait que je suis jongler avec les chiffres. Je traite avec les numéros de cacher le fait que je m'occupe de 1s et 0s.
Une abstraction qui fuit en est une qui ne cache pas les détails de sa destinée à cacher. Si l'appel en chaîne.La longueur sur une 5-chaîne de caractères en Java ou en .NET que j'ai pu obtenir aucune réponse de 5 à 10, à cause de détails de mise en œuvre où ce que ces langues appeler les personnages sont vraiment les données UTF-16-points qui peuvent représenter plus de 1 ou 5 de caractère. L'abstraction a fui. Pas de fuite même si ça signifie que la longueur soit besoin de plus d'espace de stockage (pour stocker la longueur réelle) ou le changement de O(1) O(n) (à déterminer la longueur réelle est). Si je me soucie de la vraie réponse (souvent vous n'avez pas vraiment) vous avez besoin de travailler sur la connaissance de ce qui se passe réellement.
Plus discutable cas, arriver à de tels cas où une méthode ou une propriété vous permet d'obtenir dans les rouages, s'ils sont abstraction des fuites, ou bien défini de façons de passer à un niveau inférieur de l'abstraction, peut parfois être une question de personnes sont en désaccord sur.
Je vais continuer dans la veine de donner des exemples à l'aide de RPC.
Dans le monde idéal de la RPC, remote procedure call devrait ressembler à un appel de procédure locale (ou ainsi va l'histoire). Il devrait être totalement transparente pour le programmeur à ce que, quand ils appellent
SomeObject.someFunction()
ils n'ont aucune idée siSomeObject
(ou justesomeFunction
d'ailleurs) sont stockés localement et exécutées ou à distance stockés et exécutés. La théorie est que cela rend la programmation plus simple.La réalité est différente, car il y a une ÉNORME différence entre faire un local d'appel de fonction (même si vous utilisez le monde est plus lent langage interprété) et:
Dans le temps seul qui agit sur les trois ordres (ou plus!) de grandeur de la différence. Ces trois+ ordres de grandeur vont faire une énorme différence dans la performance qui feront de votre abstraction d'une procédure d'appel fuite plutôt bien évidemment, la première fois, par erreur, vous traiter la RPC comme un véritable appel de fonction. En outre un véritable appel de fonction, sauf à de graves problèmes dans votre code, y aura très peu de points de défaillance en dehors de la mise en œuvre de bugs. Un appel RPC a tout de la suite à d'éventuels problèmes qui vous permettra d'obtenir badigeonné sur que la défaillance des cas au-delà de ce que vous attendez d'un régulier appel local:
Alors maintenant, votre appel RPC, qui est "comme un local appel de fonction" a un buttload supplémentaire sur les conditions d'échec, vous n'avez pas à composer avec quand de faire des appels de fonction. L'abstraction n'a filtré de nouveau, encore plus fort.
À la fin de la RPC est une mauvaise abstraction car il fuit comme une passoire à tous les niveaux -- en cas de succès et en cas d'échec à la fois.
Un exemple dans le l'ORM de django plusieurs-à-plusieurs exemple:
Notez dans l'Exemple d'Utilisation de l'API que vous en avez besoin .save() l'Article de la base de l'objet a1 avant de pouvoir ajouter des objets de Publication de la plusieurs-à-plusieurs attribut. Et notez que la mise à jour de la plusieurs-à-plusieurs attribut enregistre dans la base de données immédiatement, alors que la mise à jour d'un singulier attribut n'est pas reflétée dans la db jusqu'à ce que l' .save() est appelée.
L'abstraction, c'est que nous travaillons avec un objet graphique, où seule la valeur des attributs et mult-les attributs de valeur sont les attributs. Mais la mise en œuvre d'une base de données relationnelle soutenu banque de données des fuites... que l'intégrité du système de la RBDS apparaît à travers le mince vernis d'un objet de l'interface.
Le fait que à un certain point, qui sera guidé par votre échelle et de l'exécution, vous seront nécessaires pour se familiariser avec les détails de mise en œuvre de votre abstraction cadre afin de comprendre pourquoi elle se comporte de cette façon de se comporter.
Prenons l'exemple de cette
SQL
requête:Et c'est alternative:
Maintenant, ils le font ressembler à une logique solutions équivalentes, mais la performance de la première est mieux car les noms de colonnes de la spécification.
C'est un exemple trivial, mais finalement on en revient à Joel Spolsky citation:
À un certain point, quand vous arrivez à une certaine échelle de votre exploitation, vous souhaitez optimiser votre base de données (SQL) fonctionne. Pour ce faire, vous aurez besoin de connaître la façon dont les bases de données relationnelles œuvres. Elle a été prélevée pour vous au début, mais c'est qui fuit. Vous avez besoin d'apprendre à un certain point.
Assumer, nous avons le code suivant dans une bibliothèque:
Lorsque le consommateur appelle l'API, ils obtiennent un Objet[]. Le consommateur doit comprendre que le premier champ de l'objet de tableau a valeur de couleur et le deuxième champ est la valeur de modèle. Ici, l'abstraction n'a filtré de la bibliothèque le code de la consommation.
L'une des solutions est de renvoyer un objet qui encapsule le Modèle et la Couleur de l'Appareil. Le consommateur peut appeler cet objet pour obtenir le modèle et la couleur de la valeur.
Abstraction qui fuit est tout au sujet de l'encapsulation de l'état. exemple très simple d'abstraction qui fuit:
et de la bonne façon(pas abstraction qui fuit):
plus description ici.