Je dirais que les méta-structures, les modules, les cadres, les plates-formes et les services sont tous des groupes de fonctionnalités de niveau supérieur aux classes. Ma hiérarchie des abstractions du système de programmation:
- prestations de service
- plateformes, piles de solutions
- cadres
- modules, packages
- méta structures: métaclasses, fonctions d'ordre supérieur, génériques, modèles, traits, aspects, décorateurs
- objets, classes, types de données
- fonctions, procédures, sous-programmes
- Structures de contrôle
- lignes de code
Les méta-structures telles que les métaclasses ,
les fonctions d'ordre supérieur et les
génériques
ajoutent clairement une abstraction aux classes, fonctions, types de données et instances de données de base. Les traits, les aspects et les décorateurs sont des mécanismes plus récents pour combiner des fonctionnalités de code et «accélérer» de la même manière d'autres classes et fonctions.
Même les langages pré-objet avaient des modules et des packages, donc les mettre au-dessus des classes pourrait être discutable. Mais ils contiennent ces classes et méta-structures, donc je les classe plus haut.
Les cadres sont la réponse la plus charnue - ils orchestrent plusieurs classes, méta-structures, modules, fonctions et autres afin de fournir des abstractions sophistiquées de haut niveau. Et pourtant, les cadres fonctionnent encore presque entièrement dans le domaine de la programmation.
Les piles de solutions ou les plates-formes combinent généralement plusieurs cadres, sous-systèmes ou composants dans un environnement pour résoudre plusieurs problèmes.
Enfin, il existe des services - souvent déployés en tant que services Web ou de réseau. Ce sont des architectures, des cadres, des piles de solutions ou des capacités d'application fournies sous forme de bundles complets. Leurs composants internes sont souvent opaques, exposant principalement les interfaces administrateur, de programmation et utilisateur. PaaS et SaaS sont des exemples courants.
Or, cette progression peut ne pas être entièrement satisfaisante, pour plusieurs raisons. Tout d'abord, il crée une progression linéaire ou une hiérarchie nette de choses qui ne sont pas parfaitement linéaires ou hiérarchiques. Il couvre certaines abstractions comme les "piles" et les services qui ne sont pas entièrement sous le contrôle des développeurs. Et cela ne pose aucune nouvelle poussière de lutin magique. (Spoiler: Il n'y a pas de poussière de lutin magique. )
Je pense que c'est une erreur de chercher uniquement de nouveaux niveaux d' abstraction . Tous ceux que j'ai énumérés ci-dessus existent depuis des années , même s'ils n'ont pas tous été aussi importants ou populaires qu'ils le sont maintenant. Et au cours de ces années, les abstractions possibles à tous les niveaux de codage se sont améliorées. Nous avons maintenant des collections génériques à usage général, pas seulement des tableaux. Nous parcourons les collections, pas seulement les plages d'index. Nous avons des compréhensions de listes et des opérations de filtrage et de cartographie de listes. De nombreuses fonctions de langage peuvent avoir un nombre variable d'arguments et / ou des arguments par défaut. Etc. Nous augmentons l'abstraction à tous les niveaux, donc l'ajout de niveaux n'est pas une condition pour augmenter le niveau global d'abstraction.