Erben von mehreren Klassen

  • Nur fürs Protokoll:
    DU vermisst Klassenvariablen, die WIR auf Grund des Objective-C Konzepts überhaupt nicht brauchen.

    Wer unterscheidet jetzt die Konzepte nicht? ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • RegExpressive schrieb:

    macmoonshine schrieb:

    Was meinst Du damit?
    Ob ich in C++ eine Klassenvariable deklariere oder in Obj-C auf den alten ANSI-C-Mechanismus mit einer statischen Variable zurückgreifen muß, führt letztlich zur selben Funktionalität: Eine Variable, die bei bestimmten Instanz-Methoden zwar verwendet und aktualisiert werden kann, von der es aber nur eine einzige zentrale und gemeinsame Inkarnation gibt.

    Was eine Klassenvariable beziehungsweise eine statische Variable ist, weiß ich. Was meinst Du mit

    RegExpressive schrieb:

    aber an der Stelle fehlt dann halt die Abstraktion im Code.
    ?
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Was eine Klassenvariable beziehungsweise eine statische Variable ist, weiß ich. Was meinst Du mit
    Zitat von »RegExpressive«
    aber an der Stelle fehlt dann halt die Abstraktion im Code.
    ?
    Ich bin wie gesagt bei Obj-C noch am Anfang, aber bei dem Gedanken, in vielen Bereichen womöglich wieder auf ANSI-C-Niveau zurückzufallen schüttelt es mich noch einigermaßen. :pinch:

    Ich hoffe ja auch noch, daß es alles nicht so schlimm wird, aber deshalb wäre ja ein konkretes Beispiel ganz nett. :)
  • RegExpressive schrieb:

    macmoonshine schrieb:

    Was eine Klassenvariable beziehungsweise eine statische Variable ist, weiß ich. Was meinst Du mit
    Zitat von »RegExpressive«
    aber an der Stelle fehlt dann halt die Abstraktion im Code.
    ?
    Ich bin wie gesagt bei Obj-C noch am Anfang, aber bei dem Gedanken, in vielen Bereichen womöglich wieder auf ANSI-C-Niveau zurückzufallen schüttelt es mich noch einigermaßen. :pinch:

    Was für Bereiche sollen denn das bitte sein?
    Du musst (außer bei extremst hardwarenaher Programmierung) nicht auf ANSI-C zurückgreifen.
    Außer, um deine Designfehler im Nachhinein auszubessern anstatt sie von Anfang an zu lassen.

    Davon abgesehen hast du die Frage nach der fehlenden Abstraktion nicht beantwortet.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • RegExpressive schrieb:

    Ich bin wie gesagt bei Obj-C noch am Anfang, aber bei dem Gedanken, in vielen Bereichen womöglich wieder auf ANSI-C-Niveau zurückzufallen schüttelt es mich noch einigermaßen.

    Eine Klassenvariable ist doch nicht abstrakter als eine statische Variable. So gesehen ist die Deklaration der statischen Variable im Header in den meisten Fällen schlicht überflüssig. Du kannst sie natürlich dort deklarieren. Das macht aber nur Sinn, wenn auch andere Klassen darauf zugreifen dürfen. So etwas ist eklig.

    In beiden Fällen sollte der Zugriff nach außen gekapselt werden.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Eine Klassenvariable ist doch nicht abstrakter als eine statische Variable. So gesehen ist die Deklaration der statischen Variable im Header in den meisten Fällen schlicht überflüssig. Du kannst sie natürlich dort deklarieren. Das macht aber nur Sinn, wenn auch andere Klassen darauf zugreifen dürfen. So etwas ist eklig.

    In beiden Fällen sollte der Zugriff nach außen gekapselt werden.
    Wenn ich in C++ eine Klassenvariable deklariere, wird sie in den hierarchischen Namespace der Klasse aufgenommen und erhält einen Visibility-Qualifier (entweder explizit oder implizit).

    Vor allem auch Subklassen kann so auf ordentlichem Weg der Zugriff kontrolliert erlaubt oder auch verwehrt werden, je nachdem.

    Vererbbare Methoden erben auch den Zugriff auf diese Variable; Die ganze Geschichte ist weitgehend orthogonal und logisch.

    In C++ kann man das durchaus sauber benutzen und vor allem die hierarchischen Namespaces (jede Klasse öffnet einen eigenen, man kann aber auch beliebig Code und Daten in expliziten Namespaces gruppieren) sind aus meiner Sicht zum sauberen und wiederverwendbaren Strukturieren eines Projekts sehr nützlich und angenehm.

    Irgendwo im Code "flach" deklarierte static-Variablen wie im alten ANSI-C kann man zwar notfalls für denselben Zweck heranziehen, aber soweit ich das sehe, wäre das in punkto Sauberkeit und Wartbarkeit dann in der Tat so riskant und unsauber, daß man normalerweise andere Wege suchen sollte, selbst wenn das Laufzeit-Kosten mit sich bringt.

    Wie schon gesagt: Man paßt sich an die jeweiligen Möglichkeiten und Einschränkungen an und verändert die Projektstrukturen und Implementierungsstrategien entsprechend.
  • RegExpressive schrieb:

    Lucas de Vil schrieb:

    Nur fürs Protokoll:
    DU vermisst Klassenvariablen, die WIR auf Grund des Objective-C Konzepts überhaupt nicht brauchen.

    Okay. Wie sieht das bei Dir dann konkret aus?

    Was genau?
    Ich nutze keine Klassenvariablen, weil es sie nicht gibt.
    Ich nutze keine Instanz-Zähler, weil ich sie nicht brauche.

    Der Instanz-Zähler wird irgendwoher seine Berechtigung haben.
    Diese stammt aber nicht aus Objective-C. Sonst gäbe es das Konzept ja.

    Ich brauche also einen konkreten Anwendungsfall.
    'Wie realisierst du einen Instanz-Zähler?' ist kein Anwendungsfall, sondern ein Konzept.

    'Wie bekommst du raus, wie viele Instanzen einer Klasse existieren?' würde ich mit 'Ich schreibs in ein Singleton. Aber was soll diese unnötige Information?' beantworten.

    'Ich möchte sicher gehen, dass am Ende alle Instanzen der Klasse entfernt werden. Dafür möchte ich die Instanzen zählen und schauen, ob ich am Ende alle losgeworden bin.' wäre ein Anwendungsfall.
    Daraufhin würde ich allerdings sparsam gucken und sagen '+ähm+ Halte dich einfach an die Regeln für das Memory Management. Auf die Anzahl der Instanzen hast du keinen Einfluss, weil zwischendurch auch ohne dein Zutun sonst was damit passieren kann.'

    Also, nenn mir nen schicken Anwendungsfall für etwas, dass du in C++ mit Klassenvariablen löst, und ich sage dir, wie das in Objective-C ohne Klassenvariable gelöst wird. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • RegExpressive schrieb:

    Wenn ich in C++ eine Klassenvariable deklariere, wird sie in den hierarchischen Namespace der Klasse aufgenommen und erhält einen Visibility-Qualifier (entweder explizit oder implizit).

    Vor allem auch Subklassen kann so auf ordentlichem Weg der Zugriff kontrolliert erlaubt oder auch verwehrt werden, je nachdem.

    Den direkten Zugriff auf Attribute einer Klasse, egal ob statisch oder nicht, halte ich für einen Verstoß gegen das Prinzip der Datenkapselung und somit für unsauber. Wie ich bereits geschrieben habe, sollte der Zugriff auf Klassenattribute gekapselt werden.

    Andererseits verwende ich Klassenattribute oder statische Variablen - außer für Konstanten - nur sehr selten. Es gibt nur sehr, sehr wenige Anwendungsfälle, wo sie wirklich gebraucht werden.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Andererseits verwende ich Klassenattribute oder statische Variablen - außer für Konstanten - nur sehr selten. Es gibt nur sehr, sehr wenige Anwendungsfälle, wo sie wirklich gebraucht werden.

    Naja, z.B. hab ich eine Vektor Klasse. Da greif ich lieber mit position.x=55 drauf zu, anstelle position.set_x(55). Soetwas mache ich zwar häufig, aber im Prinzip gebe ich Dir recht ;)
    C++

  • Neee, nee, du verstehst mich falsch. Das geht auch in Objective-C ganz einfach. Es ist nur meist so, dass es ein Designfehler ist.

    Quellcode

    1. + (NSMutableSet*)knownInstances
    2. {
    3. static NSMutableSet* knownInstances = nil;
    4. if( knownInstances == nil ) {
    5. knownInstances = [NSMutableSet set];
    6. }
    7. return knownINstances;
    8. }

    Da hast du deine Cvar. Aber wie gesagt: Es ist meist nicht richtig. Und meine Argumentation war nicht im Geringsten sprachbezogen. Ich hatte deine Argumentation von der "logischen" Verortung widersprochen.

    Übrigens würde ich die Verwendung von Klassenvariablen nicht als "Pattern" bezeichnen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • zerm schrieb:

    macmoonshine schrieb:

    Andererseits verwende ich Klassenattribute oder statische Variablen - außer für Konstanten - nur sehr selten. Es gibt nur sehr, sehr wenige Anwendungsfälle, wo sie wirklich gebraucht werden.

    Naja, z.B. hab ich eine Vektor Klasse. Da greif ich lieber mit position.x=55 drauf zu, anstelle position.set_x(55). Soetwas mache ich zwar häufig, aber im Prinzip gebe ich Dir recht ;)

    Vor allem verhinderst du damit Lazy-Evaluation. Sogar bei einer Position, wo das ja eigentlich eher unwahrscheinlich ist, kann das passieren. Stell dir vor, das ist die Position eine Textzelle – in einer Reihe von Textzellen, die Primzahlen darstellen …

    Aber wir sind uns ja einig, dass der Zugriff über Accessoren besser ist.

    Übrigens: position.x ist in Objective-C bei einem vorhandenen Getter ein Zugriff über Accessoren. Manche finden das nur unschön, weil es modern ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • zerm schrieb:

    macmoonshine schrieb:

    Andererseits verwende ich Klassenattribute oder statische Variablen - außer für Konstanten - nur sehr selten. Es gibt nur sehr, sehr wenige Anwendungsfälle, wo sie wirklich gebraucht werden.

    Naja, z.B. hab ich eine Vektor Klasse. Da greif ich lieber mit position.x=55 drauf zu, anstelle position.set_x(55). Soetwas mache ich zwar häufig, aber im Prinzip gebe ich Dir recht ;)

    Machst Du das aus Performancegründen? Wie hoch ist der Geschwindigkeitszuwachs vom direkten Attributzugriff gegenüber einer Inline-Methode? Macht sich der Unterschied im Programmlauf wirklich bemerkbar?

    Ich bin mal davon ausgegangen, dass sich Dein Beispiel auf meine Bemerkungen zur Datenkapselung beziehen - zu Klassenattributen bzw. statischen Variablen ergibt das meines Erachtens keinen Sinn.
    „Meine Komplikation hatte eine Komplikation.“
  • RegExpressive schrieb:

    Lucas de Vil schrieb:

    Nur fürs Protokoll:
    DU vermisst Klassenvariablen, die WIR auf Grund des Objective-C Konzepts überhaupt nicht brauchen.

    Okay. Wie sieht das bei Dir dann konkret aus?

    Es hat mit der dynamischen Bindung von Objective-C nichts zu tun. Bei C++ ist das ja auch nachträglich eingeführt worden!?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    zerm schrieb:

    macmoonshine schrieb:

    Andererseits verwende ich Klassenattribute oder statische Variablen - außer für Konstanten - nur sehr selten. Es gibt nur sehr, sehr wenige Anwendungsfälle, wo sie wirklich gebraucht werden.

    Naja, z.B. hab ich eine Vektor Klasse. Da greif ich lieber mit position.x=55 drauf zu, anstelle position.set_x(55). Soetwas mache ich zwar häufig, aber im Prinzip gebe ich Dir recht ;)

    Machst Du das aus Performancegründen? Wie hoch ist der Geschwindigkeitszuwachs vom direkten Attributzugriff gegenüber einer Inline-Methode? Macht sich der Unterschied im Programmlauf wirklich bemerkbar?

    Ich bin mal davon ausgegangen, dass sich Dein Beispiel auf meine Bemerkungen zur Datenkapselung beziehen - zu Klassenattributen bzw. statischen Variablen ergibt das meines Erachtens keinen Sinn.

    Un vor allem kann man sich dann keinen Zugriffszähler bauen. ;)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    Un vor allem kann man sich dann keinen Zugriffszähler bauen. ;)

    Zapperlot, Schock, schwere Not :(

    :)

    Und, das wiegt noch viel schwerer: Mein AOP-Framework hängt sich an Methodenaufrufe, nicht an Ivar-Zugriffe. DU KANNST ALSO BEDEUTENDE TECHNOLOGIEN9811 NICHT NUTZEN!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Und, das wiegt noch viel schwerer: Mein AOP-Framework hängt sich an Methodenaufrufe, nicht an Ivar-Zugriffe. DU KANNST ALSO BEDEUTENDE TECHNOLOGIEN9811 NICHT NUTZEN!

    Neeeeeeiiiiiiiin.

    Aber wenn zerm position.set_x(55) schreibt, kann das ja nur bedeuten, dass Du Dein AOP-Framework auch auf C++ migriert hast. Endlich ;) +scnr+
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    Und, das wiegt noch viel schwerer: Mein AOP-Framework hängt sich an Methodenaufrufe, nicht an Ivar-Zugriffe. DU KANNST ALSO BEDEUTENDE TECHNOLOGIEN9811 NICHT NUTZEN!

    Neeeeeeiiiiiiiin.

    Aber wenn zerm position.set_x(55) schreibt, kann das ja nur bedeuten, dass Du Dein AOP-Framework auch auf C++ migriert hast. Endlich ;) +scnr+

    Tsss, als ob ich es mit C++ besudeln würde. Aber eigentlich müsste es sogar gehen, da ich ja mit Method-Swizzling arbeite. Jedenfalls technisch geht das auch mit C++. Man kann doch in C++ mit RTTI auch an Funktionsnamen kommen, oder!?

    @zerm: Gibt es in C++ eine offizielle Möglichkeit, an der vtab herumzufummeln?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    Machst Du das aus Performancegründen? Wie hoch ist der Geschwindigkeitszuwachs vom direkten Attributzugriff gegenüber einer Inline-Methode? Macht sich der Unterschied im Programmlauf wirklich bemerkbar?

    Nein, nicht aus Performancegründen. Da erwarte ich auch keinen Unterschied.
    Einzig und alleine aus Faulheit, weil ich so viele Vektoren habe, denen ich so oft an den Komponenten rumfummeln muss. Es sieht so schöner aus und fühlt sich mehr wie GLSL an. Und ich kann mir beim besten Willen nichts vorstellen, was dagegen spricht.
    Aber sonst so ziemlich überall zieh ich das konsequent durch mit Accessoren :)

    Amin Negm-Awad schrieb:

    @zerm: Gibt es in C++ eine offizielle Möglichkeit, an der vtab herumzufummeln?
    Mir ist keine Bekannt, ich glaube auch nicht, dass es eine "offizielle" geben wird. Nachschauen, wie GCC das macht und da rumpfuschen?
    C++