2010-08-05 21 views
2

Est-ce que quelqu'un a vu du code métamorphique - c'est-à-dire du code qui génère et exécute des instructions (y compris IL et Java Bytecode, ainsi que du code natif)? Quelle que soit l'application ou la langue, on a généralement un code de base de données pour obtenir des lignes de la base de données et retourner une liste d'objets. Bien sûr, il existe d'innombrables façons de le faire en fonction de votre connecteur de base de données. Vous pourriez finir par accéder aux cellules de la ligne par index (maladroit, parce que changer "SELECT Name, Age" en "SELECT Age, Name" casserait votre code, plus les index obscurciraient le sens), ou en utilisant myObject.Age = resultRow. getValue ("Age") (gênant, car il s'agit simplement de parcourir tous les champs pour définir ses données en fonction des colonnes). En gardant le thème de base de données, LINQ to SQL est génial. Cependant, la définition de modèles de données est moins géniale, en particulier lorsque votre base de données contient tellement de tables que SSMS ne peut pas toutes les répertorier dans le navigateur d'objets. En outre, ce n'est pas l'écriture de procédure stockée ou l'implication SQL que je n'aime pas; juste la connexion d'objets à la base de données. Quelqu'un de la société où j'ai stagiaire a écrit une méthode vraiment géniale de notre classe SqlCommand (qui hérite de la classe System) qui utilise la réflexion .NET, avec System.Reflection.Emit, pour générer une méthode qui définirait les champs (décoré avec un attribut contenant le nom de la colonne) sur tout objet modèle avec un constructeur nul. Je considérerais cela comme métamorphique car une partie spécifique du programme écrit de nouvelles méthodes.Utilisation de code métamorphique pour réduire la plaque chauffante

Ce modèle de génération d'objets à partir de la base de données n'est qu'un exemple. Un de ceux que j'ai rencontré il y a deux jours était le support de liaison de données pour SWT (via JFace). J'ai fait ces modèles parfaitement propres avec setAddress (Address address) et getName() et maintenant je dois polluer les setters avec les fireCharters PropertyChangeSupport et transporter une instance de PropertyChangeSupport (même si c'est juste dans une classe de base abstraite)! Puis j'ai trouvé PojoBindables et maintenant je me sens comme un databinder niveau 80, tout simplement parce que j'ai besoin d'écrire moins. Plus précisément, les choses qui utilisent du code natif avec quelque chose comme ceci ou un Java Agent seraient vraiment douces.

Répondre

0

La programmation générique pourrait vous aider. Le Concept C++ website a un très bon tutoriel qui couvre l'abstraction et le levage, des idées qui peuvent être utilisées dans n'importe quel langage et transformer le code standard en une force positive. En examinant un tas de méthodes standard qui sont presque exactement les mêmes, vous pouvez dériver un ensemble d'exigences qui unissent conceptuellement le code ("Pour faire X, vous devez faire Y, alors faites X1, vous devez faire Y avec la différence 1") . À partir de là, vous pouvez utiliser un modèle pour capturer les points communs et utiliser les entrées du modèle pour spécifier les différences. C# et Java ont leurs propres implémentations de génériques à ce stade, il pourrait donc être utile de vérifier.