Bedingungen und Eindeutigkeit



  • Hallo Leute,

    folgender Umstand:

    ich habe 3 Elemente

    A, B, C

    A hat eigenschaft X
    B hat eigenschaft X und Y
    C hat eigenschaft X, Y und Z

    und dann habe ich sowas wie:

    if(obj has Z))
    {
    ..
    }
    else if (obj has Y)
    {
    ..
    }
    else if( obj has X)
    {
    ..
    }
    

    (Hier muss ich unbedingt mit der Reihenfolge der Bedingungen im klaren sein,
    und "else" Blöcke verwenden)

    oder ich mach sowas:

    if((obj has Z) && !(obj has Y) && !(obj has X) )
    {
    ..
    }
    if if(!(obj has Z) && (obj has Y) && !(obj has X) )
    {
    ..
    }
    if(!(obj has Z) && !(obj has Y) && (obj has X) )
    {
    ..
    }
    

    hier ist die reihenfolge egal und kann ohne else verwenden!

    Hier kann ich mir über das verhalten immer sicher sein, und wenn ich mal eine
    neue Bedingung brauche, muss ich mir noch überlegen wo ich diese eingliedern muss!

    Nun frag ich euch? Wie geht ihr bei sowas um? Gibt für sowas ein Fachbegriff?

    Grüßesle, ich Hoffe ihr versteht meine Intension;) 😃


  • Mod

    Die beiden Codes machen völlig unterschiedliche Dinge. Es ist unklar, was dein Beitrag aussagen soll.

    Gibt für sowas ein Fachbegriff?

    Logik.



  • SeppJ schrieb:

    Gibt für sowas ein Fachbegriff?

    Logik.

    Das erste mal seit längerer Zeit, dass mich das Internet zum Lachen gebracht hat 😃



  • Ich mach das immer so:

    switch (0100*(obj has Z) + 010*(obj has Y) + 01*(obj has X)) {
      case 0000: ...
      case 0001: ...
      case 0010: ...
      case 0011: ...
      case 0100: ...
      case 0101: ...
      case 0110: ...
      case 0111: ...
    }
    


  • octary switch schrieb:

    Ich mach das immer so:

    switch (0100*(obj has Z) + 010*(obj has Y) + 01*(obj has X)) {
      case 0000: ...
      case 0001: ...
      case 0010: ...
      case 0011: ...
      case 0100: ...
      case 0101: ...
      case 0110: ...
      case 0111: ...
    }
    

    Schau Dir das compilat an: lahm, zerfledderter Zahlenbereich im switch, nimm lieber Binärzahlen.



  • Hallo zusammen,

    ich persönlich halte nicht viel von ewigen If-Then-Else-Verzweigungen.
    Ich würde, wenn möglich, auf Vererbung setzten.

    class Object {
    public:
      virtual void doWork() = 0;
    };
    
    class ObjectX {
    public:
      virtual void doWork() { std::cout << "Object with attribute X;" << std::endl; }
    };
    
    class ObjectY {
    public:
      virtual void doWork() { std::cout << "Object with attribute Y;" << std::endl; }
    };
    

    Dann muss der Aufrufer nicht entscheiden und kann dann einfach die Interface-Methode aufrufen:

    object->doWork()
    

    Viele Grüße



  • nebler schrieb:

    Hallo zusammen,

    ich persönlich halte nicht viel von ewigen If-Then-Else-Verzweigungen.
    Ich würde, wenn möglich, auf Vererbung setzten.

    class Object {
    public:
      virtual void doWork() = 0;
    };
    
    class ObjectX {
    public:
      virtual void doWork() { std::cout << "Object with attribute X;" << std::endl; }
    };
    
    class ObjectY {
    public:
      virtual void doWork() { std::cout << "Object with attribute Y;" << std::endl; }
    };
    

    Dann muss der Aufrufer nicht entscheiden und kann dann einfach die Interface-Methode aufrufen:

    object->doWork()
    

    Viele Grüße

    Das hab ich in den Weihnachtsferien 2000 durchexerziert. Multithreaded Homepageuploader. Beim Einlesen von Ist-Stand und Cache-Stand nur ein paar ifs, ab dann echt unterschieden zwischen Root, Dir, SubDir, File, Subfile, DirEntry oder so mit entsprechender Vererbung und es waren unvermeidbar so viele Begriffe.
    Und wenn Datei /foo/bar/a raufwill, müssen erst /foo/ und dann /foo/bar/ erzeugt werden. Wenn einen Tag später Datei /foo raufwill, müssen, weil /foo nu eine Datei ist die Verzeichnisse /foo und alle darin liegenden Verzeichnisse und Dateien erst weg. Man hat kein "rm -rf" oder so, schön selber alle FTP-Befehle absetzen. Und das geht recht easy. Dem zu sterbenden Objekt .delete() schicken und dann dem zu erzeigenden .put() schicken.

    Hab alles mit double dispatching durchgerockt; kein if im eigenen Code. Hat geklappt. Auf ISDN mehr als doppelt so schnell wie der multithreading-Konkurrent damals, weil ich ganz schlau durch den Anhängigkeitsgraphen gehen konnte (nee, voll dumm, fettes File voran, schlau genug). Nee, weil die anderen Trottel waren, die Reihenfolge war völlig egal, solange die Leitung ausgelastet war. Mein Fett-Vor hat nur dafür gesorgt, daß in den letzten Sekunden nicht ein Megabyte-Hänger übrig blieb und das auch nur "meistens".

    War nicht gut wartbar. 😞
    Ein paar ifs sind ok. 😉

    Mie generelle Regel, nirmals per switch/if nach Typen zu schauen, was sie machen sollen, gilt zwar, aber leider auch die Regel, daß keine Regel keine Ausnahme hat.


Log in to reply