2016-08-08 6 views
0

Ich habe eine Klasse XmlReader, die liest ein XML und eine Klasse Point, die einen Punkt darstellt. Ein Punkt kann verschiedene Typen haben, die verschiedenen Typen werden durch eine Aufzählung innerhalb der Klasse Point beschrieben.Design eines XML-Lesers

class XmlReader { 

    void read() 
    { 
     string typeReadFromXML; 
     vector<double> coordinates; 
     Point* pt = newPoint(typeReadFromXML, coordinates); 

     // OR 
     //string typeReadFromXML; 
     //PointType type= XMLReader::conversion(typeReadFromXML); 
     //vector<double> coordinates; 
     //Point* pt = newPoint(type, coordinates); 
    } 
}; 

class Point { 

    Point(string type, vector<double> v) 
    { 
     _type = conversion(type); 
    } 

    Point(PointType type, vector<double> v) 
    { 
     _type = type; 
    } 

private: 
    enum PointType { 
     type1, 
     type2 
    }; 

    PointType conversion(string){} 

    PointType _type; 
    vector<double> _coords; 
}; 

Ist es in Ordnung, um die Umwandlung von einem String zu meinen benutzerdefinierten Typ in der Point-Klasse zu tun, oder ist es vorzuziehen, diese Umwandlung in dem Leseverfahren der XmlReader-Klasse zu tun?

Das Problem mit einer Zeichenfolge in einen PointType in der Punktklasse Umwandlung ist, dass wenn
ich die Keywords meiner XML-Format zu ändern, ich werde auch die Punktklasse ändern müssen (dh die Umwandlung Methode). Was denken Sie ?

Antwort

1

Normalerweise ist es die beste Vorgehensweise, Module und Komponenten so orthogonal wie möglich zu entwerfen.

In diesem Fall bedeutet dies, dass eine Point-Klasse, die sauber gekapselt und nicht bewusst, oder abhängig von dem zugrunde liegenden XML-Format ist, kann für andere Zwecke wiederverwendet wird: verschiedenes XML-Format, JSON, andere Quellen. Es macht es auch einfacher für jemanden zu verstehen lesen den Code, und einfacher zu pflegen.

Auf diese Weise erhalten Sie eine dreistufige Architektur: XML-Format> Konvertierung> Punktklasse.

Es gibt natürlich Ausnahmen von allen Regeln, und im Allgemeinen, wenn es andere Ziele als Code Wiederverwendung, Lesbarkeit und Wartung (wie, wenn Leistung ist kritisch), kann es rechtfertigen, die Anzahl der Ebenen in der die Architektur.

1

Sie können eine Format-Klasse hinzufügen, um zwischen Point und XMLReader zu kommunizieren.

static PointType conversion(string typ, const Format& format) 
{ if (format.is...()) 
    return (typ == "...") ? ... : ...; 
    ... 
} 

könnte den geeigneten Typ je nach Format entscheiden.

Wenn Sie sich entscheiden, Ableitungsklassen von Point zu verwenden, z. B. CrossPoint, BulletPoint, kann das Schlüsselwort static dazu beitragen, je nach TypReadFromXML den richtigen Punkt zu erstellen.