Résumé Exagg'itive (TM)
Vous obtenez quelques choses.
- Héritage et clonage prototypique
- Ajout dynamique de nouvelles propriétés
- Coexistence d'objets de versions différentes (niveaux de spécification) de la même classe.
- Les objets appartenant aux versions les plus récentes (niveaux de spécification) auront des propriétés "optionnelles" supplémentaires.
- Introspection de propriétés, anciennes et nouvelles
- Introspection des règles de validation (discutée ci-dessous)
Il y a un inconvénient fatal.
- Le compilateur ne vérifie pas pour vous les chaînes mal orthographiées.
- Les outils de refactorisation automatique ne renommeront pas les noms de clé de propriété pour vous - à moins que vous ne payiez pour ceux de fantaisie.
Le fait est que vous pouvez obtenir une introspection en utilisant, euh, l'introspection. C'est ce qui se produit généralement:
- Activez la réflexion.
- Ajoutez une grande bibliothèque d'introspection à votre projet.
- Marquez diverses méthodes et propriétés d'objet avec des attributs ou des annotations.
- Laissez la bibliothèque d'introspection faire la magie.
En d'autres termes, si vous n'avez jamais besoin d'interfacer avec FP, vous n'avez pas à suivre les conseils de Rich Hickey.
Dernier point, mais pas le moindre (ni le plus joli), bien que l'utilisation String
comme clé de propriété ait le sens le plus simple, vous n'avez pas besoin d'utiliser le String
s. De nombreux systèmes hérités, y compris Android ™, utilisent largement les identifiants entiers dans l'ensemble du cadre pour faire référence aux classes, propriétés, ressources, etc.
Android est une marque déposée de Google Inc.
Vous pouvez également rendre les deux mondes heureux.
Pour le monde Java, implémentez les getters et setters comme d'habitude.
Pour le monde de la PF, implémentez le
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
À l'intérieur de ces fonctions, oui, du code laid, mais il y a des plugins IDE qui le rempliront pour vous, en utilisant ... euh, un plugin intelligent qui lit votre code.
Le côté Java des choses sera aussi performant que d'habitude. Ils n'utiliseront jamais cette laideur du code. Vous voudrez peut-être même le cacher à Javadoc.
Le côté FP du monde peut écrire le code "leet" qu'il veut, et il ne vous crie généralement pas que le code est lent.
En général, l'utilisation d'une carte (sac de propriété) à la place d'un objet est courante dans le développement de logiciels. Il n'est pas propre à la programmation fonctionnelle ou à tout type de langage particulier. Ce n'est peut-être pas une approche idiomatique pour une langue donnée, mais certaines situations l'exigent.
En particulier, la sérialisation / désérialisation nécessite souvent une technique similaire.
Juste quelques réflexions générales concernant la "carte comme objet".
- Vous devez toujours fournir une fonction pour valider une telle "carte en tant qu'objet". La différence est que "mapper en tant qu'objet" permet des critères de validation plus flexibles (moins restrictifs).
- Vous pouvez facilement ajouter des champs d'addition à la "carte en tant qu'objet".
- Pour fournir une spécification de l'exigence minimale d'un objet valide, vous devrez:
- Énumérer le jeu de clés «minimalement requis» attendu sur la carte
- Pour chaque clé dont la valeur doit être validée, fournissez une fonction de validation de valeur
- S'il existe des règles de validation qui doivent vérifier plusieurs valeurs de clé, fournissez-les également.
- Quel est l'avantage? Fournir la spécification de cette manière est introspectif: vous pouvez écrire un programme pour interroger le jeu de clés minimalement requis et pour obtenir la fonction de validation pour chaque clé.
- Dans la POO, tous ces éléments sont regroupés dans une boîte noire, au nom de "l'encapsulation". Au lieu d'une logique de validation lisible par machine, l'appelant ne peut lire que la "documentation API" lisible par l'homme (si elle existe heureusement).