Swift-evolution

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • tsunamix schrieb:

    MCDan schrieb:

    Ich hoffe der Grund für dieses neue Swift-Statement ist nicht einfach nur kompakterer Code, sondern das ganze ist auch deutlich lesbarer und verständlicher als der entsprechende for-/while-loop.
    Wovon träumst Du nachts?
    Bisher war ich der Meinung, dass Swift als Alternative zu bisherigen Programmiersprachen zu verstehen ist.

    Es scheint mir jedoch eher eine Spielwiese für Nerds zu sein, welche versuchen eine obskure Syntax zu etablieren, die nur schwer mit logischem Verstand nachzuvollziehen ist.

    Quellcode

    1. for i in 10.stride(to: 0, by: -2) {
    2. print(i)
    3. }
    Der o.a. Code soll doch wohl nicht wirklich eine Alternative zum C-style-for-loop sein, oder?

    Haben die Swift "Designer" einen Joint zuviel geraucht oder stammen die komplett aus dem Unix Lager und sind eine obskure/kryptische Syntax gewohnt und können daher nicht anders?
  • noch was zu "final by default"

    Da mir wirklich noch nie eine Situation in der Art "verdammt, warum darf ich von dieser Klasse erben und diese Methode hier überschreiben? Ich will das nicht können!" vorgekommen ist*, habe ich noch mal ein bisschen recherchiert und dabei eine ziemlich gute (und erstaunlich neutrale) Erklärung gefunden:
    martinfowler.com/bliki/DirectingAttitude.html
    Das tolle ist: Der Urheber ist quasi prominent (ich hatte den Namen schon vorher gehört ;) - ein gewaltiger Vorteil in Diskussionen mit Leuten, die eigentlich gar keine richtige Meinung haben, sondern nur unreflektiert ihren Vorbildern nachbeten...

    * na gut, manchmal wünscht man sich schon, man könnte einem Kunden einfach sagen "tut mir leid, dass ist nicht nur schlecht, es geht einfach gar nicht" ;)
  • Ehrlich gesagt halte ich den for-loop Syntax mit seinen 3 einzelnen Befehlen nicht für weniger obskur.
    Er ist für jemand der aus dem C-Lager kommt nur gewohnter.
    Ob das ein Argument für eine neue Sprache sein sollte ist aber eher fraglich.

    Stride ist eben typisch Swift, vom Gedanken her nicht unähnlich zu anderen Standardfunktionen.
    Stride liefert dem Sequence Protocol entsprechende Werte zurück, womit das ganze enumerierbar ist.

    func stride(through:by:)
  • MCDan schrieb:

    Der o.a. Code soll doch wohl nicht wirklich eine Alternative zum C-style-for-loop sein, oder?
    Warum denn nicht? Meinst du, ein Pascal-Programmierer (oder Lisp, oder...) würde dir zustimmen, wenn du sagst das C eine eingängige Syntax hat?
    Sind die Chinesen alle bescheuert, weil ihre komischen Schriftzeichen auf keine Tastatur passen?

    Was obskur erscheint hängt vom eigenen Standpunkt ab - und die ganzen "$SpracheA ist Mist weil es nicht SpracheB ist"-Argumente ziehen bei mir überhaupt nicht.
  • tsunamix schrieb:

    Der unmittelbaren Leesbarkeit hilft das auch nicht....
    Wenn man einen Range schon umdrehen kann, verstehe ich nicht, warum es in Swift nicht auch entsprechendes ein Literal dafür gibt. Die Lesbarkeit von meinem oder Thyraz' Vorschlag ist so lala. Eine While-Schleife ist da vielleicht doch lesbarer. Kernighan & Ritchie haben die For-Schleife ja nur als eine spezielle Kurzform für typische While-Schleifen gesehen.

    Lustig wird's, wenn die Schrittweite nicht äquidistant ist, z. B.: for(int i = n; i > 0; i /= 2) { ... } oder for(int i = 1; i < n; 1 <<= 1) { ... }, die man manchmal bei Teilen-Um-Zu-Überwinden- oder Bitmasken-Verfahren braucht. Da landet man dann in vielen Nicht-C-Sprachen wieder beim While.
    „Meine Komplikation hatte eine Komplikation.“
  • t-no schrieb:

    Da mir wirklich noch nie eine Situation in der Art "verdammt, warum darf ich von dieser Klasse erben und diese Methode hier überschreiben? Ich will das nicht können!" vorgekommen ist*, habe ich noch mal ein bisschen recherchiert und dabei eine ziemlich gute (und erstaunlich neutrale) Erklärung gefunden:
    martinfowler.com/bliki/DirectingAttitude.html
    Seine Erklärung finde ich nicht besonders gut.
    1. Auch wenn das Ableiten oder Überschreiben in gewissen Situationen durchaus ein Fehler sein kann, sollte man anderen Programmierern nicht die Möglichkeit nehmen, diesen Fehler zu machen. Manche lernen daraus vielleicht sogar etwas.
    2. Es gibt so vielen grottenschlechten Code, warum sollte man nur das millionste Prozent unterdrücken, das auf falscher Vererbung beruht?
    3. Woher weiß ein Klassendesigner, dass das Ableiten seiner Klassen oder das Überschreiben seiner Methoden immer falsch ist? Martin Fowler mag das vielleicht in vielen noch ganz gut bewerten können. Aber ob selbst er alle Anwendungsfälle vorhersehen kann, in denen man seine Klassen einsetzt?


    t-no schrieb:

    Das tolle ist: Der Urheber ist quasi prominent (ich hatte den Namen schon vorher gehört
    Naja, nicht nur quasi ;) Refactoring gehört sicherlich inzwischen auch zu den Programmier-Bibeln.

    t-no schrieb:

    ein gewaltiger Vorteil in Diskussionen mit Leuten, die eigentlich gar keine richtige Meinung haben, sondern nur unreflektiert ihren Vorbildern nachbeten...
    +lol+
    „Meine Komplikation hatte eine Komplikation.“
  • Moment, final as default heißt eben nicht, ich kann es als vererbbar umflaggen? Dann ist das Blödsinn. Kann ich mir aber nicht vorstellen. um ein Objekt zu erzeugen muss ich es ja von irgend einem Rootobjekt ableiten. Oder kann Swift neuerdings prototypbasierte objektorientierte Programmierung?

    Ja, wenn ich ein Interface weitergeben möchte nutze ich Protokolle.
    Ja, wenn ich eine Implementierung weitergeben möchte, nutze ich Extensions.
    Alles gut und schön und Open Close Principal.

    Wenn ich aber ein Interface sowie Teile einer Implementierung weitergeben möchte bin ich gekniffen?

    Da bin ich doch mal gespannt wie Swift mir da ohne Vererbung unter die Arme greifen will.

    Aber vielleicht bin ich auch sehr konservativ, wenn ich neben einem Greeter auch einen PirateGreeter haben will, der an supers sayHello noch ein ', Arrr!' hängt.

    Oder ist das Methoden überschreiben in Extensions mittlerweile erlaubt?
    Dann reduziert sich der Bedarf an Subklassen natürlich enorm.
    «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
  • Marco Feltmann schrieb:

    Oder ist das Methoden überschreiben in Extensions mittlerweile erlaubt?
    Dann reduziert sich der Bedarf an Subklassen natürlich enorm.
    Nein, siehe auch hier

    https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

    NOTE
    Extensions can add new functionality to a type, but they cannot override existing functionality.
  • Das habe ich erwartet.

    Dann doch mal an den Diskussionen beteiligen. :)
    Obwohl, lohnt nicht.
    Superclasses should be intentionally designed to be subclasses and the author required to opt-in to subclassing and memberoverrides where that is required by the design
    Also doch ein subclassable Flag.
    Dann ist alles okay und es handelt sich nur um einen weiteren Beitrag der Kategorie "Mut zur Hässlichkeit".
    «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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marco Feltmann ()

  • matz schrieb:

    Marco Feltmann schrieb:

    Oder ist das Methoden überschreiben in Extensions mittlerweile erlaubt?
    Dann reduziert sich der Bedarf an Subklassen natürlich enorm.
    Nein, siehe auch hier
    https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

    NOTE
    Extensions can add new functionality to a type, but they cannot override existing functionality.
    @Marco: Das war immer so, das ist so und das wird auch immer so bleiben. Extensions sind ein Konzept, das orthogonal zu Subclassing ist.
    „Meine Komplikation hatte eine Komplikation.“
  • Thyraz schrieb:

    Quellcode

    1. for i in 10.stride(to: 0, by: -2) {
    2. print(i)
    3. }

    10.stride()... Echt jetzt?
    Klar, natürlich, ich durchschreite die 10 bis zur 0 in Zweierschritten.

    Bin ich der Einzige, der sich nicht vorstellen kann eine Zahl zu durchschreiten? Eine Collection, logisch. Einen Range, klar.
    <DeborahMorganMode>
    Aber das ist eine verfickte Scheißganzzahl!
    </DeboraMorganMode>

    Thyraz schrieb:


    Ich denke jedem ist aber klar, dass das Brechen der Kompatibilität alten Codes in den nächsten 1-2 Jahren aufhören muss und IMO wird es das auch.

    Davon ging ich mit Veröffentlichung als OpenSource aus. Nach dem Motto: Wenn die Welt damit arbeiten soll, müssen wir es mal auf einem stabilen Stand halten.

    Hab ich mich geirrt. ;)
    «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
  • @macmoonshine:
    Ne, ich meinte schon den verlinkten Komplex: Fowler selbst sieht in "final by default" anscheinend ja auch etwas negatives - aber die Erklärung für andere Meinungen finde ich interessant.
    In eigenen Worten ausgedrückt gibt es zwei "Religionen" ("Hacker" und "Bürokraten"), die sich unvereinbar gegenüber stehen. De Facto kann man deshalb auch nur innerhalb eines neutralen Bereichs sinnvoll diskutieren, weil die Anhänger der Extrempositionen einfach unterschiedliche Weltbilder und andere Prioritäten haben...
    Ganz konkret kann man eigentlich jeden Versuch, in diesem Umfeld zu "Missionieren" mit martinfowler.com/bliki/DirectingAttitude.html abfertigen.
  • Kann mir einmal jemand erklären, warum man das nicht gleich eine verbreitete moderne Syntax alla 10.for(/*meinetwegen dekrement und end*/) {} nimmt?

    Edit: Ah, natürlich Performance. Man braucht dann einen Call.
    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"?
  • Marco Feltmann schrieb:

    10.stride()... Echt jetzt?
    Klar, natürlich, ich durchschreite die 10 bis zur 0 in Zweierschritten.

    Bin ich der Einzige, der sich nicht vorstellen kann eine Zahl zu durchschreiten? Eine Collection, logisch. Einen Range, klar.
    <DeborahMorganMode>
    Aber das ist eine verfickte Scheißganzzahl!
    </DeboraMorganMode>
    Es gibt zahlreiche OO Programmiersprachen, die ähnliche Konstrukte aufweisen. Wobei Konstrukt dann schon falsch ist, weil das eine ganz gewöhnliche Methode ist. Kann man ja auch in Objective-C programmieren, wenn man lustig ist. Komischerweise ist niemand so lustig. Es mag einen Grund (IM SINNE VON CAUSA) geben.

    Übrigens geht das auch mit Fließkommazahlen.


    Marco Feltmann schrieb:

    Davon ging ich mit Veröffentlichung als OpenSource aus. Nach dem Motto: Wenn die Welt damit arbeiten soll, müssen wir es mal auf einem stabilen Stand halten.

    Hab ich mich geirrt.
    Man ging seit der Veröffentlichung davon aus, dass das in einem halben Jahr praktisch erträglich ist. Dann ein halbes Jahr nach der Veröffentlichung, dass es in einem halben Jahr …

    Swift ist wie Hurd, nur swifter: Man wird in kürzeren Zeitabständen enttäuscht.

    Ach, ja, ich weiß, Hurd ist schon veröffentlicht.
    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:

    matz schrieb:

    Marco Feltmann schrieb:

    Oder ist das Methoden überschreiben in Extensions mittlerweile erlaubt?
    Dann reduziert sich der Bedarf an Subklassen natürlich enorm.
    Nein, siehe auch hierhttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

    NOTE
    Extensions can add new functionality to a type, but they cannot override existing functionality.
    @Marco: Das war immer so, das ist so und das wird auch immer so bleiben. Extensions sind ein Konzept, das orthogonal zu Subclassing ist.
    Hmmm, wenn es orthogonal stünde, müsste es ja Extensions mit Überschreiben und welche ohne Überschreiben geben. ;) Es steht eher alternativ.
    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"?
  • Diese ganze Diskussion ist wirklich sinnbildlich für das Grunddilemma.

    a) Es gibt ein Konstrukt (C-for) zur abzählenden Wiederholung. Man mag das schön mächtig oder hässlich wie die Nacht finden. Das hängt halt davon ab, ob man auf große oder kleine Titten steht.

    b) Also wird das kräftig zurechtgestutzt, in ein Korsett gepresst und die viel zu freie Variante verstoßen.

    c) Dann fällt auf, dass das aber nicht immer so gut funktioniert, weil es eben auch andere Titten gibt. Also wird überlegt, wie man das aufbohrt, damit alles in den BH passt.

    So wird aus einem simplen …:

    Quellcode

    1. for( int a=1; a <=10; a+=1 ) {…}


    … eine Rätselfrage fürs Forum. Wohlgemerkt nicht für einen abgefahrenen Fall, sondern für etwas, was ständig auftritt.

    Man sieht dann eben doch: Es gibt Dinge, bei denen "one size fits all" einfach nicht funktioniert. Dazu gehören BH und for.
    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:

    Hmmm, wenn es orthogonal stünde, müsste es ja Extensions mit Überschreiben und welche ohne Überschreiben geben.
    Orthogonal im Sinne einer weiteren, unabhängigen Eigenschaft, die ich bei der Entwicklung nutzen und beliebig mit Vererbung kombinieren kann.

    Amin Negm-Awad schrieb:

    Es mag einen Grund (IM SINNE VON CAUSA) geben.
    +lol+
    „Meine Komplikation hatte eine Komplikation.“
  • Marco Feltmann schrieb:

    Thyraz schrieb:

    Quellcode

    1. for i in 10.stride(to: 0, by: -2) {
    2. print(i)
    3. }
    10.stride()... Echt jetzt?
    Klar, natürlich, ich durchschreite die 10 bis zur 0 in Zweierschritten.

    Bin ich der Einzige, der sich nicht vorstellen kann eine Zahl zu durchschreiten? Eine Collection, logisch. Einen Range, klar.
    <DeborahMorganMode>
    Aber das ist eine verfickte Scheißganzzahl!
    </DeboraMorganMode>

    Schöner Rant, nur bedeutet "stride" an sich erstmal "schreiten" und nicht durchschreiten (auch wenn dies je nach Zusammenhang eine mögliche Übersetzung ist).
    "To stride to (something)" kann hingegen eher mit auf etwas zuschreiten übersetzt werden.

    Der Aufruf lässt sich also recht problemlos mit "Gehe von 10 nach 0 in Zweierschritten" übersetzen.