Je connais un peu de Design orienté objet , mais je ne sais pas comment Allez utiliser ces principes de mon code. Voici ce que je travaille sur:
public void Query(Agency agency, Citation queryCitation) {
queryCitation.AgencyCode = agency.AgencyCode;
switch (agency.ClientDb.Type) {
case "SQL":
QueryOracle(agency, queryCitation);
break;
case "PIC":
QueryPick(agency, queryCitation);
break;
}
}
6 Réponses :
Je refacteur pour profiter d'une interface. Je le ferais probablement quelque chose comme: Vous pouvez ensuite modifier la classe d'agence pour stocker une instance d'objet code> iQuery code> plutôt que (ou en plus de) le puis dans votre code d'initialisation (où vous définiriez normalement la propriété clientdb code> objet: p> ClientDB code> Propriété), vous pourrait définir l'instance dans la mise en oeuvre code> IQuery p> p>
Ado.net dispose d'un ensemble de classes génériques: dbcommand, dbconnection, etc ... qui implémentent également un autre ensemble d'interfaces génériques: IDBCOMMAND, IDBConnection, etc ... P>
Pour que vous puissiez les utiliser, mais cela peut devenir assez compliqué à la fin. L'avantage de votre solution est que c'est très lisible. Plus peut-être que la base de données de sélection n'a pas de fournisseur Ado.net ... P>
PS: Je remplacerais le type de propriété Type et utilisez plutôt une énumération. P>
Vous voudrez probablement mettre en œuvre le modèle de stratégie ici. Fondamentalement, chacun de vos "types" possibles dans votre relevé de commutateur deviendrait une classe à part entière qui implémente la même interface. P>
Application du modèle de stratégie P>
Vous pouvez ensuite utiliser une méthode d'usine qui prend une valeur de "type" comme paramètre. Cette méthode retournerait la classe correcte (son type de retour est l'interface mentionnée ci-dessus). P>
L'agence est-elle une classe que vous contrôlez? Si oui, faites quelque chose comme ceci: dans votre classe d'agence, vous pouvez avoir p> puis avoir une classe SQLDB comme: p> alors ce code: p> devient p> à cause de Héritage, il saura que ClientDB a une classe de base de générique. Il saura par le type du paramètre ClientDB s'il doit exécuter le SQLDB ou le PICDB ou l'oracle, etc. P> P>
Il y a deux solutions OOP polymorphisme et modèle de visiteur . p>
Peux-tu expliquer? Les réponses uniquement des liaisons ne sont pas tout à fait les bienvenues sur Stackoverflow.
Pour écrire moins de code mais améliorer la lisibilité Le niveau de code de déclaration que vous pouvez gifler à un dictionnaire avec les délégués pour chaque base de données. Cela peut facilement être étendu et est très lisible. Avec cette approche plus fonctionnelle à l'esprit, vous obtenez quelque chose comme