10
votes

Comment puis-je concevoir cela mieux? (Éviter une instruction de commutation avec une conception orientée objet)

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;
        }
    }


0 commentaires

6 Réponses :


3
votes

Je refacteur pour profiter d'une interface. Je le ferais probablement quelque chose comme: xxx

Vous pouvez ensuite modifier la classe d'agence pour stocker une instance d'objet iQuery plutôt que (ou en plus de) le clientdb objet: xxx

puis dans votre code d'initialisation (où vous définiriez normalement la propriété ClientDB Propriété), vous pourrait définir l'instance dans la mise en oeuvre IQuery xxx


0 commentaires

2
votes

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 ...

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 ...

PS: Je remplacerais le type de propriété Type et utilisez plutôt une énumération.


0 commentaires

5
votes

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.

Application du modèle de stratégie

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).


0 commentaires

13
votes

L'agence est-elle une classe que vous contrôlez? Si oui, faites quelque chose comme ceci: xxx

dans votre classe d'agence, vous pouvez avoir xxx

puis avoir une classe SQLDB comme: xxx

alors ce code: xxx

devient xxx

à 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.


0 commentaires

0
votes

Il y a deux solutions OOP polymorphisme et modèle de visiteur .


1 commentaires

Peux-tu expliquer? Les réponses uniquement des liaisons ne sont pas tout à fait les bienvenues sur Stackoverflow.



2
votes

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 xxx


0 commentaires