typedef This?



  • Hi,

    nutzt ihr ein typedef, um die eigene Klasse zu bezeichnen?

    Viel mit namespaces zu arbeiten kann Sinn ergeben. In UI-Projekten werden aber auch gerne eindeutige, aber lange Bezeichner verwendet. Es kann da durchaus auch mal 5-6 CamelCase-Blöcke geben. Wenn man dann Signale/Slots verwendet und auf Memberfunktionen referenzieren muss, ist das eklig. Z.B. in QT:

    connect(this, &SomeUnfortunatelyLongClassName::signal, this, &SomeUnfortunatelyLongClassName::slot);
    

    Wenn ich dann 12 connects hab, wird es noch lästiger.
    Man könnte sich jedoch ein typedef im UI-Bereich angewöhnen:

    class SomeUnfortunatelyLongClassName
    {
        typedef SomeUnfortunatelyLongClassName This; // oder ein andrer Name
    

    und den dann nutzen. Man könnte sich auch ein typedef für Parent bei Vererbung angewöhnen, das wäre ja auch praktisch, aber ist erstmal ne andere Diskussion.

    Und wenn man den Klassennamen ändert, braucht man die connects nicht alle ändern (ja, ist ein replace all, aber weniger replacements sind weniger potentielle Fehlersetzungen).

    Nutzt jemand so ein typedef This? STL-Implementierungen haben's ja auch. VC2013 hat ein typedef _MyIter für den vector-iterator (an der Stelle mit nur einem Template-Argument, könnte man auch stets dazu schreiben).



  • Nein



  • Meine Qt-Verbindungsaufrufe sehen so aus:

    connect(this, SIGNAL(signalName(int)), this, SLOT(slotName(int)));
    

    Ein typedef brauche ich da nicht...



  • Das ist die alte Schreibweise. Die neue ist zu bevorzugen, weil man dort eine compile-time-Typsicherheit hat. Zudem erfordert ein Lambda-Slot ebenfalls die Schreibweise ohne SIGNAL.



  • Nein, ich nutze auch kein typedef.

    Eisflamme schrieb:

    Das ist die alte Schreibweise. Die neue ist zu bevorzugen, weil man dort eine compile-time-Typsicherheit hat. Zudem erfordert ein Lambda-Slot ebenfalls die Schreibweise ohne SIGNAL.

    Geht meines Wissens erst ab Qt5.
    Meinst Du folgende Schreibweise mit Lambda-Slot?

    connect( object, &MyObject::mySignal, [=]() {} );
    

    Davon wurde mir abgeraten, sofern man im Slot auf (Qt) Objekte zugreift. Es kann u.U. sein, dass das Objekt zwischenzeitlich gelöscht wurde.

    Und noch eine Anmerkung: Ich schreibe selten die expliziten Signal-Slot-Verbindungen hin, die Fähigkeit die Signal-Slots automatisch miteinander zu verbinden finde ich ganz praktisch.
    http://doc.qt.io/qt-4.8/designer-using-a-ui-file.html#automatic-connections
    (Qt meldet einen Fehler, falls der Entwickler sich vertippen sollte.)



  • Hi,

    ja, mit der Lambdaschreibweise muss man aufpassen. Nichtsdestotrotz kann sie sehr praktisch sein, beispielsweise, wenn man einfach eine andere Funktion aufruft und nicht direkt auf Attribute zugreift.

    Und ja, ist natürlich erst ab neueren QT-Versionen möglich. Aber dann ist die neue Schreibweise eben aus o.g. Gründen meistens besser.

    Klar melden sich Fehler zur Laufzeit, wenn man falsch verbindet, aber ich bevorzuge den Fehler zur Kompilierzeit.

    Ist aber eigentlich auch überhaupt nicht das Thema hier. Spricht denn irgendwas gegen so ein typedef ? Ich fände es in vielen Situationen praktisch. Vielleicht übersehe ich aber auch Nachteile.


Log in to reply