2009-08-17 6 views
1

Simple question pour tous les gars orientés objet pragmatique. J'ai lu plusieurs fois pour éviter les classes comme "Processeur", et "xxxxHandler" afin d'accepter les normes OO: et je crois que c'est une bonne mesure de la compréhensibilité du code système. Supposons que nous ayons un logiciel qui analyse une structure de fichiers, disons une série de fichiers CSV spécifiques. Disons que nous avons un module indépendant appelé CsvParser. Cela permettra d'économiser une classe "FileScanner", qui est une classe de type -Processor-. Quelque chose qui va collecter dire, un tas de fichiers d'un répertoire, et numériser chaque.OO Style - Question simple

class MyFileScan { 
    public string[] Files { get; set; } 

    public void GetFiles() { this.Files = Directory.GetFiles(..); } 

    public void ScanFiles() { 
     foreach (string thisFilePath in Files) 
     { 
      CsvParser csvp(thisFilePath); 
      /* ... */ 
     } 
    } 
} 

L'approche OO dicte ayant la classe MyCsvFile, puis une méthode représentant l'opération sur l'objet.

Des pensées? Que pensez-vous des programmeurs.

+0

Est-ce que ça ne devrait pas être un wiki de ma communauté? (Je ne peux pas croire que je suis devenu l'une des personnes qui posent cette question.) – Imagist

Répondre

1

Je pense que ce que vous décrivez est que les objets doivent prendre en charge les opérations qui ne nécessitent que leur propre comportement, ce qui est généralement une bonne règle à suivre. Il n'y a rien de mal avec une classe "processeur", à condition qu'elle "traite" quelques choses différentes (mais liées).Mais si vous avez une classe qui ne traite qu'une seule chose (comme un parseur CSV ne traite que des CSV), alors il n'y a vraiment aucune raison pour que le processeur ne fasse pas le traitement sur lui-même. Cependant, il y a une raison courante pour enfreindre cette règle: habituellement vous ne voulez pas faire des choses que vous n'avez pas à faire. Par exemple, avec votre classe CSV, si tout ce que vous voulez est de trouver la ligne dans le CSV où la première cellule est "Bob" et obtenir la troisième colonne dans cette rangée (qui est, disons, la date de naissance de Bob) alors vous ne Je veux lire tout le fichier, l'analyser, puis chercher dans la structure de données que vous venez de créer: c'est inefficace, surtout si votre CSV a 100K lignes et l'entrée de Bob sur la ligne 5.

Classe CSV pour faire des opérations à petite échelle sur CSV, comme sauter à la ligne suivante et obtenir la première cellule. Mais maintenant vous mettez en œuvre des méthodes dont vous ne parleriez pas vraiment d'un fichier CSV. Les CSV ne lisent pas les lignes, ils les stockent. Ils ne trouvent pas de cellules, ils les ont juste. En outre, si vous souhaitez effectuer une opération à grande échelle, telle que la lecture dans l'intégralité du fichier CSV et le tri des lignes par la première cellule, vous souhaiterez avoir votre ancienne méthode de lecture dans le fichier entier, l'analyser et la parcourir toute la structure de données que vous avez créée. Vous pouvez faire les deux dans la même classe, mais maintenant votre classe est vraiment deux classes à deux fins différentes. Votre classe a perdu la cohésion et toute instance de la classe que vous créez aura deux fois plus de bagages, alors que vous n'en utiliserez probablement que la moitié.

Dans ce cas, il est logique d'avoir une abstraction de haut niveau de la classe CSV (pour les opérations à grande échelle) et une classe «processeur» pour les opérations de bas niveau. (Ce qui suit est écrit en Java depuis que je sais mieux que je sais C#):

public class CSV 
{ 
    final private String filename; 
    private String[][] data; 
    private boolean loaded; 

    public CSV(String filename) { ... } 

    public boolean isLoaded() { ... } 
    public void load() { ... } 
    public void saveChanges() { ... } 
    public void insertRowAt(int rowIndex, String[] row) { ... } 
    public void sortRowsByColumn(int columnIndex) { ... } 

    ... 
} 

public class CSVReader 
{ 
    /* 
    * This kind of thing is reasonably implemented as a subclassable singleton 
    * because it doesn't hold state but you might want to subclass it, perhaps with 
    * a processor class for another tabular file format. 
    */ 
    protected CSVReader(); 
    protected static class SingletonHolder 
    { 
     final public static CSVReader instance = new CSVReader(); 
    } 

    public static CSVReader getInstance() 
    { 
     return SingletonHolder.instance; 
    } 

    public String getCell(String filename, int row, int column) { ... } 
    public String searchRelative(String filename, 
     String searchValue, 
     int searchColumn, 
     int returnColumn) 
    { ... } 

    ... 
} 

Un exemple bien connu de ce même est SAX et DOM. SAX est l'accès de bas niveau, à granularité fine, tandis que DOM est l'abstraction de haut niveau.

+0

A dû choisir ceci car il m'a ouvert les yeux un peu: J'ai bin demandant un peu comment je pourrais résumer le CSVParser. À ce moment, il n'aura que des opérations en lecture seule sur le fichier .. mais éventuellement, les exigences changent. Je vais prendre le conseil de sipwiz et laisser l'objet faire ce dont il a besoin. Merci les gars. –

3

Je serais d'accord avec votre philosophie, mais si c'était moi, j'appellerais probablement la classe CsvFile et aurais une méthode Parse en plus de celle de Scan. Dans la programmation OO, il est toujours souhaitable que vos classes représentent des "choses" (noms en anglais). Cela mis à part, si on me demandait de conserver votre code, je comprendrais ce qu'une classe CsvParser est susceptible de faire alors que MyFileScan m'enverrait des accès de colère et me ferait lire le code pour le résoudre.

+0

Aussi, nommer les choses "MyX" me rend fou. C'est bien si vous donnez un exemple explicatif très général comme MyObject ou MyClass (bien que dans ce cas j'irais avec les variables métasyntaxiques: foo, bar, baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud). Mais si vous allez utiliser une classe pour quelque chose, je veux voir CSV pas MyCSV. À qui appartient ce CSV et pourquoi revendiquent-ils la propriété? – Imagist

+0

En effet correct et je suis totalement d'accord. J'utilise 'Mon' à titre d'exemple ici. Je voulais garder mon domaine ici sans utiliser foo, bar, etc. Bon point. –

1

Il s'agit du domaine de problème par opposition à la conception de domaine de solution.

Afin de résoudre un problème, nous pouvons concevoir notre classe pour modéliser des objets de la vie réelle, c'est-à-dire un programme selon le domaine du problème.

Une autre manière de programmer est la conception selon le domaine de solution. Par exemple, lorsque nous concevons un système de réservation de vol, pour l'expert en gestion de vol, ils décrivent le voyage comme «itinéraire», «heure», «angle» (je ne peux pas vraiment me rappeler le terme). Si nous concevons selon ce modèle, il s'appelle design selon le domaine du problème.

Nous pouvons également concevoir en utilisant le système de coordonnées (x, y, z), parce que nous pensons qu'en tant que programmeur, nous pouvons traiter ces derniers plus efficacement. C'est un design pour Solution Domain.

Le problème avec le domaine de la solution est, dans le monde du projet, une chose qui est constante est - CHANGEMENT! les exigences changeront toujours! Si les exigences changent, vous devez repenser votre programme. Cependant, si vous modélisez vos classes en tant qu'objets de la vie réelle, vous êtes moins affecté par les changements, car les objets réels changent rarement. "Processeur" et "xxxxHandler" < - ceci est la conception du domaine de la solution.

Vous pouvez jeter un oeil à Domain-Driven Design --- DDD pour les courts métrages.

+0

Je vois, je vois .. va certainement se pencher sur elle - "wikipediaing" comme je parle. Vous voyez, je pense que cela a beaucoup à voir avec le processus de pensée ... comment nous modélisons les choses. Vous dites fondamentalement que la façon dont nous utilisons les objets est plus susceptible de changer que l'objet eux-mêmes? Ou suis-je mal interprété. Merci –

+0

Je dis, les exigences du client changent toujours. Si nous concevons nos classes sur la base du modèle de la vie réelle, il sera à l'abri du changement d'exigence. – janetsmith