Que signifie le terme "Abstraction qui Fuit" signifie? (Veuillez expliquer avec des exemples. J'ai souvent un moment difficile grokking une simple théorie.)
Réponses
Trop de publicités?Voici un espace réel (meatspace) exemple:
Les 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 savoir beaucoup plus sur la façon dont il fonctionne à l'intérieur!
Mais il y a des fuites. La transmission est une petite fuite. Dans une tranny 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 la wikipedia 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 traiter spécifiquement de gérer les erreurs de l'extérieur de l'abstraction que le réseau de la bibliothèque.
Wikipedia a une assez bonne définition de ce
Une abstraction qui fuit se réfère à toute mise en œuvre d'abstraction, destiné à réduire (ou masquer) la complexité, où les détails sous-jacents ne sont pas complètement caché
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 l' Page
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 à l'heure: 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 une fuite.
Eh 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 vraiment.
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.