Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Sauberes C++ ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.02.2006, 10:34 Uhr
Janka



Also, hallo erst mal!

Ich habe die Methoden "CreateList1....6", also sechs Methoden!

Diese schreiben jeweils initial Daten in die Listen. Dann soll aus einer XML-Datei bestimmte Parameter ausgelesen werden und auch in die jeweiligen Listen geschrieben werden. Da diese XML-Datei aber sehr verschaltelt sein kann, habe ich eine weitere Methode geschrieben, die bei einer weiteren Verschachtelungstiefe als Rekursion aufgerufen wird.

Hier also mal die abgespeckte Variante:


C++:
void __fastcall modul::CreateList1(void)
{
   // Deklarationsteil
   // ......

   this->Add_FileHeader(this->LIST1,"EINS");

   // Finden der Technology
   HeaderNode = this->XMLNode->ChildNodes->FindNode(L"HEADER");
   HeaderList = HeaderNode->ChildNodes;
   CType    = HeaderList->FindNode(L"Type")->GetText();
   CType    = CType.Trim();  

   if(CType == "LT")
   {
      this->SearchLT_1(this->PNode, "");    // PNode = Fester StartNode in Konstruktor
   }                                                    // festgelegt und in modul gespeichert
   else
   {
      if(CType == "DU")
      {
         this->SearchDU_1(this->PNode, "");
      }
   }
}




C++:
void _fastcall modul::SearchLT_1(IXMLNode *PNode, AnsiString PreviousRef)
{
   // Deklarationsteil:
   // .......

   // Programmteil:
  
   PList = PNode->ChildNodes;
   counter = PList->Count;
   for(i=0; i<counter; i++)
   {
      PLNode = PList->Get(i);

      if (PLNode->NodeType != ntComment)
      {
         // Wenn kein Kommentar, Name behalten und weiter suchen
         Reference = PLNode->GetAttribute(L"reference");
         if (Reference != PreviousRef)
         {
            // Sammeln aller benötigten Daten:

            PLList = PLNode->ChildNodes;
            
            // Wenn weiter verschachtelt:
            // Daten auslesen und in Liste schreiben
            // .......
            if ((PLList->FindNode(L"PL")) != NULL)
            {
                 // Daten auslesen und in Liste schreiben
                 this->SearchLT_1(PLList->FindNode(L"P"),Reference);
        }
         }
      }
      PreviousRef = Reference;
   }
}



Und so oder ähnlich ist es für alle 6 Methoden "CreateList...". Bzw. bei einigen so wie hier gibt es eine Auswahl zw. SearchLT und SearchDU, aber die ist gleich aufgebaut, holt sich nur etwas andere Daten, bzw. verarbeitet sie anders.

Jetzt meine Frage/n:
Ist das sauberes C++-Programmieren? Also das ganze in zwei verschiedene Methoden aufzuteilen.
Oder wäre es besser, die zweite Methode als Funktion zu schreiben?
Mir erscheint es so als ob ich es aufjeden Fall aufteilen muss, denn sonst kann ich die Rekursion ja gar nicht machen, dann würden ja immer die Initialdaten reingeschrieben, oder sollte ich diese Initialdaten in eine if-Abfrage stecken und wenn sie schon mal aufgerufen wurde, darf sie nicht mehr aufgerufen werden. (Variable in modul).

Wäre dankbar für ein paar Expertenmeinungen. Danke! Danke! Danke!

*JANKA*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.02.2006, 11:06 Uhr
ao

(Operator)



Zitat von Janka:
Und so oder ähnlich ist es für alle 6 Methoden "CreateList...". Bzw. bei einigen so wie hier gibt es eine Auswahl zw. SearchLT und SearchDU, aber die ist gleich aufgebaut, holt sich nur etwas andere Daten, bzw. verarbeitet sie anders.

Hallo Janka,

einerseits ist es ratsam, möglichst wenig Code zu duplizieren. 6 Funktionen, die alle ganz ähnliche Sachen machen, sind ne erstklassige Fehlerquelle für die Zukunft; behalt da mal den Überblick, welche Funktion was tut.

Andererseits, eine einzige Funktion, die mit einer riesigen if-else-Orgie die 6 anderen zu ersetzen versucht, ist auch nicht gerade übersichtlich.

Vielleicht kannst du das nicht in einer einzigen Klasse lösen, sondern die Gemeinsamkeiten in eine Basisklasse stecken und die Unterschiede auf mehrere angepasste Ableitungen verteilen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.02.2006, 11:16 Uhr
~Janka
Gast


Also es ist so, dass es das Programm schon gibt. Das heißt die Klasse modul gibt es schon und sollte möglichst wenig verändert werden.

Meine Aufgabe war ein, die sonst ausgelesene Textdatei in eine XML-Datei zu wandeln. Das ist jetzt passiert und ist auch ok so.

Jetzt muss das Programm das sonst die Textdatei eingelesen hat umgeschrieben werden, um die XML-Daten lesen zu lönnen. Das bedeutet, dass es die sechs Methoden schon gibt. Das einzige andere ist, dass die XML-Datei geschachtelt sein kann und somit das "Problem" der Rekursion auftritt. Vorher wurden die Daten einfach nacheinander in einer for-Schleife ausgelesen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.02.2006, 11:54 Uhr
ao

(Operator)


Also wieder mal eins dieser allseits beliebten "Pflegeprojekte", bei denen alle Sünden der Vergangenheit beibehalten werden müssen, weil keiner mehr schnallt, wie das eigentlich damals gedacht war, oder weil keiner den Mut hat, uralte Zöpfe endlich mal abzuschneiden.
Auf dem alten Mist rumprogrammieren müssen, aber nichts wirklich verbessern dürfen, das sind Sachen, die ich lieben gelernt habe

Um zurückzukommen zu deiner ursprünglichen Frage: Man geht an XML anders ran als an Plaintext, von daher empfiehlt es sich wahrscheinlich für ein "sauberes" Programm, ein von Grund auf neues Design zu machen und infolgedessen auch den Code neu zu schreiben.

Wenn das ne Vorgabe von deinen Chefs ist, dass der bestehende Code möglichst wenig verändert werden soll, dann drängt sich die Frage auf, wieso überhaupt der "Technologiewechsel" von Text nach XML stattfinden soll, wenn von den Vorteilen nicht profitiert werden darf.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: