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