schicker File - Loader



  • Hallo,

    Ich bin gerade dabei mir (zwangsweise) einen eigenen Image - Loader zu basteln. Vorläufig nur für Tiff, aber er soll ja dann schön erweiterbar sein. Jetzt geht es darum switch - case zu vermeiden. Ich habe verschiedene Loader - Classen ( BitmapIO, TiffIo, .... ), die von einer abstrakten Basisklasse ihre Load / Save Schnittstelle erben. In der Factory Klasse will ich nun deren Instanzen kreieren. Dazu giebt es eine Funktion, die mir den Bildtypen ermittelt (derzeit nur anhande des Filenames).
    Wie komme ich jetzt darum herum hier einen häßlichen switch - case Block zu basteln. Sämtliche Libraries, die ich mir angeschaut habe machen das sogar noch unschöner, indem sogar die Laderoutinen in den einzelnen switch / cases liegen.

    vielen Dank für Eure Ideen,

    Tobias



  • Was ist denn an einem Switch/Case Block so hässlich?

    Du könntest zum Beispiel eine std::map<std::string, Reader *> verwenden, da du ja noch nach Dateiendungen gehst. Am Anfang werden die Reader in der map registriert und du machst dann sowas wie:

    Reader * read = readermap[".tiff"];
    read->loadImage(input);
    

    loadImage ist dann eine virtuelle Funktion, die von allen Readern implementiert wird.



  • Switch / case ist häßlich, weil:

    1.)
    Ich hab dann ein enum am backen, in dem ich alle unterstützen Filetypen definiere, um das ganze ein bisschen leserlich zu gestalten.

    2.)
    Ich den switch case Block jedesmal bei Änderungen nachziehen muß, wenn eine neue Loader - Klasse dazukommt.

    Das mit den virtuellen Load / Save Routinen hab ich schon so (man muß es ja nicht noch häßlicher machen als es so schon ist 🙂 ).
    Deshalb ja die Factory - Klasse, um den häßlichn Teil wenigstens an einbem Ort zu haben.
    Das mit den Dateiendungen soll natürlich auf lange Sicht nicht so bleiben.

    nach derzeitigem Stand:

    int iImageType = GetImageType( char* pstrFileName );
    ImageLoader* pLoader = 0;
    switch( iImageType )
    {
    .......
    }
    if(pLoader)//nur, wenn Loader dafür vorhanden
        pLoader->LoadImage(......);
    


  • Also eine map würde die switch Anweisung auf

    ImageLoader* pLoader = loaderMap[iImageType];
    

    reduzieren.



  • Für den Fall, das es bei den Fileendungen als Kriterium bleibt, wäre das OK, soll es aber ja langfristig nicht.
    Hab gerade eine neue Idee. Es giebt einen LoaderContainer und jede Loader - Klasse bekommt eine virtuelle Funktion IsFileTypeSupported(....). Der Loader - Kontainer klappert dann beim Laden einfach alle bei ihm registrierten Loader ab bis einer den Job übernimmt / oder halt nicht.


Anmelden zum Antworten