Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » directory abstrahiert einlesen

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
11.12.2011, 18:11 Uhr
banshee



Hallo,

ich habe vor einigen Semestern eine Vorlesung zum Thema Software Engineering gehört in der es um gutes Software Design ging und da mir das sehr gefallen hat, versuche ich zumindest teilweise meinen Code dahingehend zu optimieren.

Ich habe in meinem aktuellen Projekt also folgende Funktion, die alle Bilder in einem Ordner liest.


C++:
void readDir(std::string dirName)
{
    WIN32_FIND_DATA wfd;
    dirName += "\\";
    
    HANDLE hFind = FindFirstFile((dirName + "*").c_str(), &wfd);

    if(INVALID_HANDLE_VALUE == hFind)
    {
        printf("Didn't find any files in directory!\n");
        exit(-1);
    }
    
    do
    {
        // while current file is not a directory...
        if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
            // read img
            cv::Mat img = cv::imread((dirName + wfd.cFileName).c_str(), 0);
            
            // if image was read successfully...
            if(img.data)
            {
                ... // verarbeiten
            }
        }
    } while(FindNextFile(hFind, &wfd));

    FindClose(hFind);

    return;
}


Ich habe mir also gedacht, etwas aus einem Verzeichnis zu lesen braucht man ja dauernd, warum das ganze also nicht in eine abstrakte Klasse kapseln.

D.h. ich habe versucht eine abstrakte Klasse DirectoryReader zu schreiben, die eine Funktion readDir(char*) enthält und rein virtuelle Funktionen wie z.B. readFile(), processContent(), closeFile() aufruft. Um eine konkrete Implementierung zu erhalten, würde man die abstrakte Klasse einfach ableiten und die virtuellen Methoden implementieren.
Das Problem ist nur, dass das Lesen unter Windows so einfach nicht funktioniert und readFile() je nach Zeitpunkt des Aufrufs einmal FindFirstFile() und sonst FindNextFile() aufrufen müsste. Wie das unter Linux aussieht weiß ich jetzt nicht. Ich habe jetzt also die Wahl aus einer zwei rein virtuelle Funktionen readFirstFile() und readNextFile() zu machen, würde dann aber spezielle Windows-Implementationsdetails in meine Abstraktion übernehmen und genau das will ich einerseits verhindern, andererseits könnte ich mir meine Abstraktion dann auch sparen, weil sie viel zu speziell wäre.
Wegen solcher Sachen scheitere ich ständig daran, designtechnisch guten Code zu schreiben und irgendwann sieht es nur noch aus wie Assembler. Wie kann ich so ein Problem lösen? Es wäre doch total praktisch, wenn ich das nächste mal ein Verzeichnis aus Textdateien lesen möchte, nur meine abstrakte Basisklasse ableiten und die Low-Level-Implementierungen einfüllen muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.12.2011, 11:26 Uhr
0xdeadbeef
Gott
(Operator)


Suchst du womöglich nach Boost.Filesystem?

Ansonsten könntest du quasi one-ahead lesen, also im Konstruktor einmal FindFirstFile, danach bei jedem Methodenaufruf FindNextFile, so dass du die Stammdaten der nächsten Datei schon vorliegen hast. Damit ließe sich dann auch eine "ist noch mehr da?"-Methode leicht umsetzen, wenn man so etwas will.

Oder halt ein bool-Flag in der Klasse halten und je nach dessen Status die eine oder andere Funktion aufrufen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.12.2011 um 11:34 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.12.2011, 10:45 Uhr
banshee



Ja danke, ich probiere es einfach mal aus. Das Boost.Filesystem werde ich mir auch mal im Hinterkopf behalten, ist allerdings für das relativ kleine Projekt eher mit Spatzen auf Kanonen geschossen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: