Die Steine alter Tempel können sprechen, aber nur wenige Menschen beachten sie. Das Universum ist voller Geräusche, die wir Menschen nicht hören. Farben, die wir nicht sehen: Manchmal sind es die objektiven Einschränkungen von Körper und Geist, aber es gibt auch subjektive Gründe - mangelnde Kenntnisse und Fähigkeiten oder Unfähigkeit, sie in der täglichen Praxis zu verwenden. Ein anschauliches Beispiel für die zweite in der Welt der Programmierung - Funktionssignaturen. Kinder der OO-Welt denken bestenfalls in Schnittstellen - es ist eng, aber "nicht ganz das" und je aufmerksamer Sie werden, desto mehr wird es zu "überhaupt nicht". Und Funktionssignaturen können auch sprechen.
Ehrlich gesagt möchte ich von der Seite wirklich hochrangiger Abstraktionen ausgehen, aber meine bisherigen Erfahrungen zeigen, dass selbst die einfachsten mathematischen Wahrheiten in einer nicht-mathematischen Sprache „nicht klingen“. Nebenbei stelle ich fest, dass alles, worüber ich spreche, aus mathematischem Denken hervorgeht - und dementsprechend streng formalisiert werden kann.
Und jetzt - die Einzelheiten. Wahrscheinlich machen sich alle mehr oder weniger "stöbern" die Mühe, mindestens einmal die epochale Arbeit von GoF zu lesen; wahrscheinlich wissen sogar die "nicht klebenden", dass es ein solches Muster gibt - Iterator. Und sicherlich benutzt es jeder jeden Tag. Also (Festhalten an bedingtem C #):
bool MoveNext(); T Current { get; }
... und jetzt das Gleiche, aber ohne syntaktisches Rauschen (es zeigt an, dass "ohne syntaktisches Rauschen" auf Haskell bedeutet):
MoveNext :: () -> Bool Current :: () -> t
... wenn Sie für eine Weile die Typen vergessen und sich auf den Pfeil selbst konzentrieren (->), kommen Sie unwillkürlich zu der Frage, was passieren wird, wenn er „umgekehrt“ ist? Dann stellt sich heraus:
MoveNext' :: Bool -> () Current' :: t -> ()
Ein leichtes Gefühl von Disharmonie, oder? Wenn es keine Probleme mit
t -> () gibt , sieht
Bool -> () mehr als verdächtig aus. Und tatsächlich - dieses Flag wurde verwendet, um das Ende der Sequenz zu signalisieren, oder? In der umgekehrten Form macht der Fall
True -> () keinen nützlichen Sinn - nur
False -> () ist ausreichend. Die binäre Unsicherheit, die der Bool-Typ bietet, geht verloren - und sollte daher folgendermaßen aussehen:
completed :: () -> () next :: t -> ()
Ähnelt nichts? Was ist mit
reaktiven Erweiterungen ?
Wow! Die Signatur (genauer gesagt die Signaturen, aber der Ansatz selbst funktioniert auf individueller Ebene) der Funktion eines (fast) coolen (Mini) Frameworks hat uns von einem anderen erzählt, das nicht weniger cool ist, oder? Sie müssen nur vorsichtig sein und hören.
Gute Nachrichten für die Welt aus der KategorietheorieWer im Thema weiß natürlich, dass das Beispiel mit IEnumerator <-> IObserver nicht neu ist.
Es ist überraschend, dass selten jemand weiß, dass dies alles andere als das einzige Beispiel ist (obwohl wir Tribut zollen müssen, insbesondere dieses ist sehr hell).
Neugierige Menschen können die verbleibenden GoF-Muster nehmen und sich ihre Duals ansehen. Oft stellt sich völliger Unsinn heraus - das ist normal: An sich ist „Dualität“ höher als die irdische Welt und sieht sich nicht verpflichtet, mit dem praktischen Gebrauch zu rechnen. Schließlich braucht die Sonne auch nichts von Menschen, um zu scheinen.
Warum dann "fast cool"? Ja, wegen der Disharmonie, die dazu führte, dass weiter gemahlen und geschnitten werden musste. Streng genommen stellte sich heraus, dass das Zurückdrehen der Pfeile etwas nicht ganz Nützliches war, was als Nachteil der ursprünglichen Signatur interpretiert werden kann. Mit Blick auf die Zukunft werde ich sagen, dass genau diese Signatur so neu definiert werden kann, dass die Disharmonie verschwindet und es ganz einfach sein wird, sich dem Dualen zuzuwenden. Aber ich werde mich nicht darum kümmern ... zumindest - nicht in dieser Notiz.
Besser zusammenzufassen, ganz basierend auf meiner Erfahrung:
- Funktionssignaturen können sprechen, aber Programmierer sind oft taub.
- Fragen Sie sich jedes Mal, wenn Sie auf eine gut gestaltete Funktion treffen, was diese dual ist und ob sie für Aufgaben nützlich sein könnte.
- Wenn ein Dual vorhanden ist, jedoch eine „geringfügige Änderung“ wie im obigen Beispiel erforderlich ist, weist die ursprüngliche Signatur höchstwahrscheinlich einige implizite Mängel auf. Vielleicht ist es sinnvoll, es neu zu definieren, damit es kein solches Problem gibt?