Memory Leek
Memory Leek
  • 18
  • 24 614
Faceted Builder Pattern mit Fluent Syntax: Boost deine C# / Java Skills
Hey Leute, willkommen zurück! In diesem Video tauchen wir in das Faceted Builder Pattern mit der coolen Fluent Syntax ein. Falls du den ersten Teil verpasst hast, keine Sorge! Da haben wir das klassische Builder Pattern und den Nested Builder besprochen. Jetzt geht's darum, wie du in C# komplexe Objekte auf clevere und elegante Weise baust. Ich zeige dir, wie du die Fluent Syntax für sauberen und lesbaren Code einsetzt, komplexe Objekte mit mehreren Facetten erstellst und deinen Code wartbar und flexibel hältst. Also, schnapp dir einen Kaffee, lehn dich zurück und lass uns loslegen! Wenn dir das Video gefällt, vergiss nicht, den Kanal zu abonnieren, damit du keine weiteren Tutorials verpasst!
#CSharp #Programming #BuilderPattern #FacetedBuilder #FluentSyntax #CodingTutorial #CSharpTutorial #SoftwareDevelopment #CodeClean #AdvancedCSharp #DeveloperTips #learntocode2024
──────────────────────────────────────
► Folge uns
Instagram: memoryleekde
TikTok: tiktok.com/@memoryleekde
Twitter: memoryleekde
LinkedIn: linkedin.com/company/memoryleekde
──────────────────────────────────────
► Studieren in Remagen
🧑‍🎓 www.hs-koblenz.de/mathematik-und-technik
──────────────────────────────────────
► Kapitel
0:00 Intro
0:19 Recap
1:52 Faceted Builder
7:04 Ist das gut?
7:48 Mehr Abstraktion
9:26 Nachwort und Outro
──────────────────────────────────────
► Kontakt
kontakt@memoryleek.de
มุมมอง: 231

วีดีโอ

Builder Pattern in C# / Java: Vom Anfänger zum Bau-Meister!
มุมมอง 71014 วันที่ผ่านมา
Hey Leute! In diesem Video nehmen wir das Builder Pattern in C# auseinander und bauen es wieder zusammen - keine Sorge, ohne Schraubenschlüssel! 🛠️ Natürlich ist die Lösung für fast alle Programmiersprachen gültig, wie z.B. Java. Wir starten mit einem Problem, das nach einer coolen Lösung ruft, und tauchen dann in das UML-Diagramm ein. Danach basteln wir das einfachste Builder Pattern und legen...
Es kann nur EINEN geben! 💻 Das Singleton-Pattern in C# / Java
มุมมอง 71721 วันที่ผ่านมา
Entdecke die Grundlagen und Feinheiten des Singleton-Patterns in unserer neuen Videoreihe über Softwarequalität und Design Patterns. In diesem Video zeigen wir, wie das Singleton-Pattern funktioniert, wann es eingesetzt wird und welche Best Practices es gibt. Egal, ob du ein Anfänger oder ein erfahrener Entwickler bist - dieses Video bietet wertvolle Einblicke für jeden. Bleib dran, denn in zuk...
Design Patterns: Die Basis für Clean Coding!
มุมมอง 1.2Kหลายเดือนก่อน
In diesem Video erfährst du, wie du deinen Code effizient strukturieren kannst, indem du bewährte Design Patterns anwendest. Design Patterns bieten Lösungen für wiederkehrende Probleme in der Softwareentwicklung und helfen dir dabei, sauberen und wartbaren Code zu schreiben. Dieses Video ist der Start einer Videoreihe zu Design Patterns, in der du Schritt für Schritt alle wichtigen Patterns ken...
Sieht so die Zukunft in der Medizin aus? MINT-AI Podcast
มุมมอง 589หลายเดือนก่อน
Sieht so die Zukunft in der Medizin aus? MINT-AI Podcast
Clean Coding: Das verstehen alle falsch!
มุมมอง 13Kหลายเดือนก่อน
Clean Coding: Das verstehen alle falsch!
Es geht los... MINT für alle!
มุมมอง 808หลายเดือนก่อน
Es geht los... MINT für alle!

ความคิดเห็น

  • @hrtmtbrng5968
    @hrtmtbrng5968 15 ชั่วโมงที่ผ่านมา

    Die Struktur gefällt mir ehrlich gesagt nicht. Der ComputerBuilder verwendet seine eigenen Kindklasse. Mich wundert, dass das überhaupt compilliert. Ich denke auch, dass Du das Liskovsches Substitutionsprinzip verletzt. Stell Dir mal vor, jemand hat einen Code, der den ComputerBuilder verwendet. Und jetzt ersetzt er diesen durch einen ComputerHardwareBuilder. Das dadurch erzeugte Objekt wird sich anders verhalten. Auch, wenn Du genau das beabsichtigst, soll man es so nicht machen. Man soll Komposition der Vererbung immer vorziehen. Du machst sogar beides gleichzeitig. Man soll Vererbung generell vermeiden. Ich könnte mir vorstellen, dass man mit ein paar simplen globale Funktionen BuildComputer, WithNetwork, WithHardware fast die gleiche Funktionalität erreichen kann. Tritt mal ein Schritt zurück! Sieh es nicht so akademisch überbordend strukturiert. Du gewinnst nichts an diesem abstrakten Puzzle. Niemand zwingt Dich, diese ganzen Design-Patterns in Deinem Code einzubauen. Überleg mal, wie Du es in nacktem C machen würdest und lass Dich nicht von den ganzen OOP-Konzepten blenden. Und dann schaue, ob die einfachste C-Lösung nicht sogar für C# besser und einfacher wöre. Die OOP-Konzepte sollen Dir helfen und nicht deine Bürde sein. Aber dein Code ist unentspannt und kompliziert. Das einzige, was an Deinem Code schön ist ist der Aufruf des Builders. Du hast Recht, das ist das Wichtigste. Aber es ist nicht das einzige, was zählt. Sorry, wenn ich das so sage.

  • @WickedJackThe1
    @WickedJackThe1 4 วันที่ผ่านมา

    Mein Code ist cleaner als mein Zimmer.

  • @75hilmar
    @75hilmar 10 วันที่ผ่านมา

    Hi Daniel, Leute hier 😂

  • @harisimer
    @harisimer 11 วันที่ผ่านมา

    Funktioniert so auch ein StringBuilder?

  • @felixk6814
    @felixk6814 11 วันที่ผ่านมา

    sehr lockere aber dennoch informative Videos!

    • @MemoryLeekDE
      @MemoryLeekDE 11 วันที่ผ่านมา

      Vielen Dank!

  • @g2h5j3
    @g2h5j3 12 วันที่ผ่านมา

    Müsste man nicht auch nach dem Aufruf der Build Funktion das Computer Objekt im Builder zurücksetzen? Sonst würde Ich doch beim erstellen eines zweiten Computers die Einstellungen des alten, die Ich nicht spezifisch ändere, kopieren. Oder man erstellt sich immer wieder ein Builder Objekt, das erscheint mir aber sehr ineffizient

    • @MemoryLeekDE
      @MemoryLeekDE 12 วันที่ผ่านมา

      Guter Punkt! Es stimmt, dass man den Builder nach dem Aufruf der Build-Funktion zurücksetzen sollte, damit die alten Einstellungen nicht übernommen werden. Man könnte den internen Zustand des Builders nach dem Erstellen des Objekts einfach zurücksetzen oder löschen. Alternativ kann man natürlich auch jedes Mal ein neues Builder-Objekt erstellen. Das ist vielleicht nicht super effizient, aber in vielen Fällen völlig in Ordnung. Hoffe, das hilft! Wenn du noch Fragen hast, melde dich gerne.

    • @vornamenachname60
      @vornamenachname60 11 วันที่ผ่านมา

      @@MemoryLeekDE Meiner Meinung nach ist das Problem hier eher, dass bei mehrfachem Aufruf von Build() immer das selbe Objekt zurückgegeben wird. Das automatische Zurücksetzen der Einstellungen des Builders wäre dagegen eher merkwürdig. Einmal eingestellt, sollte der schon immer ein Objekt mit den selben Einstellungen liefern aber nicht das selbe Objekt. Mit anderen Worten: builder.Build().Equals(builder.Build()) => true aber (builder.Build() == builder.Build()) => false

  • @satyayuga0
    @satyayuga0 13 วันที่ผ่านมา

    You don't use NVIM? Talk to the hand.

  • @sadakazu_yoshikawa
    @sadakazu_yoshikawa 15 วันที่ผ่านมา

    Endlich mal jemand, der dinge wirklich gut verständlich erklärt und vorallem mit wirklich einfach zu verstehenden beispielen verdeutlicht wieso warum weshalb so und nicht anders. Danke für eure Videos :) die bringen mich gerade enorm nach vorne :D

  • @harisimer
    @harisimer 15 วันที่ผ่านมา

    18:22 Das sieht doch genauso aus wie Computer computer = New Computer() { CPU = "foo", GPU = "bar" }; Warum also nicht so?

    • @MemoryLeekDE
      @MemoryLeekDE 15 วันที่ผ่านมา

      Gute Frage! Der Builder-Pattern-Ansatz und der Objekt-Initialisierer sehen ähnlich aus, aber der Builder bietet einige Vorteile: Er ermöglicht immutable Objekte, ist ideal für komplexe Konstruktionen, bietet eine lesbare Fluent-Syntax, erlaubt Validierungen und verbessert die Wartbarkeit des Codes. Während der Objekt-Initialisierer für einfache Fälle ausreicht, ist der Builder für komplexere Szenarien besser geeignet. Hoffe, das hilft! 😄

  • @jonaspeters8648
    @jonaspeters8648 16 วันที่ผ่านมา

    Was geanu meinst du mit "Grund sich zu ändern"? (vielen Dank für deine tollen Videos)

    • @MemoryLeekDE
      @MemoryLeekDE 16 วันที่ผ่านมา

      Beim Single-Responsibility-Prinzip geht es darum, dass eine Klasse oder ein Modul nur eine einzige Verantwortlichkeit haben sollte. Das bedeutet, dass es nur einen einzigen Grund geben sollte, warum sich der Code dieser Klasse oder dieses Moduls ändern müsste. Ein "Grund sich zu ändern" bezieht sich auf eine spezifische Anforderung oder Veränderung, die eine Anpassung des Codes notwendig macht. Zum Beispiel, wenn eine Klasse sowohl für die Speicherung von Nutzerdaten als auch für deren Darstellung im Benutzerinterface verantwortlich ist, gibt es zwei mögliche Gründe für Änderungen: Änderungen in der Art und Weise, wie Daten gespeichert werden, und Änderungen im Layout oder der Darstellung der Daten. Wenn diese Verantwortlichkeiten jedoch getrennt werden, gibt es für jede Klasse nur einen spezifischen Grund zur Änderung. Dies macht den Code verständlicher, wartbarer und weniger fehleranfällig. Und vor allem besser testbar.

  • @Krauttrooper
    @Krauttrooper 16 วันที่ผ่านมา

    Schön erklärt, aber das Beispiel ist etwas kantig, Optionale Parameter gibt es seit 2010 'bool hasWifi=false'.

  • @Krauttrooper
    @Krauttrooper 16 วันที่ผ่านมา

    Der Audiomanager ist ein gutes Beispiel dafür was ein ungeeignetes Beispiel ist. Eine property mit privaten setter und dann eine ne Methode die einen Wert über den setter setzt. Das ist Java kein c# .

    • @MemoryLeekDE
      @MemoryLeekDE 16 วันที่ผ่านมา

      Danke für dein Feedback! Du hast recht, dass die Methode ChangeVolume, die eine Property mit einem privaten Setter verwendet, eher an Java erinnert. In C# wäre es idiomatischer, entweder direkt eine Methode zu verwenden, die die Property setzt, oder die Property direkt zugänglich zu machen, wenn keine spezielle Logik erforderlich ist. Das Singleton-Pattern selbst ist korrekt implementiert, aber deine Anmerkung zur Property-Nutzung hilft, den Code klarer und idiomatischer zu gestalten. Vielen Dank dafür!

  • @ManuelNagler
    @ManuelNagler 17 วันที่ผ่านมา

    Ein besseres Beispiel für Liskov ist: Quadrate sind in der OOP keine Rechtecke. Quadrat darf keine Kindklasse von Rechteck sein, denn: Ein Benutzer der Klasse Rechteck kann bei einem Rechteck die Seitenlängen unabhängig voneinander verändern. Bei einem Quadrat müsste das verändern einer Seitenlänge die andere automatisch mit ändern. Für einen Nutzer der Klasse Rechteck ist es unerwartet, dass sich beide Seitenlängen geändert haben.

    • @MemoryLeekDE
      @MemoryLeekDE 17 วันที่ผ่านมา

      Das ist ja das Standardbeispiel für liskov, trifft aber nicht den Punkt. Der häufigste Verstoß gegen Liskov ist wahrscheinlich das unerwartete Aufrufen von exceptions. Zu SOLID kommt auf jedenfall noch zu jedem Buchstaben ein Video. 😀

    • @ManuelNagler
      @ManuelNagler 17 วันที่ผ่านมา

      @@MemoryLeekDE ich fand nur das Hundebeispiel hat den Punkt nicht getroffen

    • @MemoryLeekDE
      @MemoryLeekDE 16 วันที่ผ่านมา

      Verstehe ich, aber die Grundformulierung von Liskov ist: "Φ(x) sei eine beweisbare Eigenschaft für Objekte x vom Typ T. Dann soll Φ(y) wahr sein für Objekte y vom Typ S, wobei S ein Subtyp von T ist." Es besteht also ein Enger Zusammenhang zur Beweisbarkeit von Code/Algorithmen und z.B. dem Hoare-Kalkül. Wollte jetzt nicht abnerden, aber ich habe lange mit dem Kreis/Ellipse oder Quadrat/Rechteck- Beispiel gearbeitet in meiner Vorlesung und die Studierenden haben leider nicht das mitgenommen, was es eigentlich aussagen soll. Liskov ist nicht einfach und mache nochmal ein eigenes großes Video mit vielen Fällen dazu.

  • @hrtmtbrng5968
    @hrtmtbrng5968 17 วันที่ผ่านมา

    Kann man in C# nicht einfach Konstrukturen mit verschiedenen Namen definieren? Dann hätte man einen GamingComputerConstructor und einen OfficeComputerConstructor. Oder hätte man nicht statische Funktionen createGamingComuter und createOfficeComputer ersellen können? Die müssen dann nicht mal in der Computer-Klasse deklariert werden. Vielleicht kann man sogar den gleichen Namen createComuter verwenden und irgendwie auf den Arguementen dispatchen, z.B. auf einem Enum. Und wenn Du dann deine schöne Builder-Funktion für die Main brauchst, machst Du ein Lambda drumherum. Ich kenne mich nicht so gut mit C# aus. Aber von Gefühl her würde ich denken, es geht auch einfacher als mit dem Builder-Pattern. Aber das ist jetzt nicht Thema des Videos. Würde mich freuen, wenn da in zukünftigen Videos etwas zu kommt. Ich finde aber auch sehr gut, dass die kritische Auseinandersetzung mit dem Pattern einen sehr großen Teil des Videos einnimmt. Sehr schön!

    • @MemoryLeekDE
      @MemoryLeekDE 17 วันที่ผ่านมา

      Vielen Dank. Es handelt sich ja um eine Anfängerreihe zu den Design Patterns der Gang of Four. Daher ist es noch etwas puristisch. Wenn ein junger Programmierer hierdurch eine neue Denkweise oder ein neues Konzept versteht ist schon viel gewonnen! Vielleicht machen wir ja nochmal eine Advanced Topics Reihe. Dein Kommentar ist auf jedenfall markiert als mögliches neues Video.

  • @hrtmtbrng5968
    @hrtmtbrng5968 17 วันที่ผ่านมา

    Die ganze Konstruktion kommt mir relativ gestelzt vor. Was Du eigentlich willst, ist eine ganz banale globale Variable. Damit dein Code besser testbar ist, baust Du eine Klasse drumherum. Damit die Klasse gemockt werden kann, baust Du eine Instanz. Damit die Instanz singulär ist, baust Du einen eigenen Konstruktor. Damit der Thread safe ist, baust Du einen Mutex drum herum. Und dann wünschst Du Dir, dass Anwender von den Singleton dieses nicht direkt verwenden. Also baust Du noch ein Interface drumherum. Viel Wirbel um eine simple globale Variable.

    • @MemoryLeekDE
      @MemoryLeekDE 17 วันที่ผ่านมา

      Ein globales Objekt trifft es besser, aber ansonsten ist das eine schöne Zusammenfassung.

  • @pinkeHelga
    @pinkeHelga 17 วันที่ผ่านมา

    So schön Designpatterns im Einzelfall auch sein mögen, nerven sie mich eher in der Praxis. Ständig wird diskutiert, der Code verstößt gegen diese und jene "Richtlinie", es müsse doch jenes Entwurfsmuster zum Einsatz kommen. Code wird abstrahiert der Muster wegen, nicht, weil man objektiv zum Schluß gekommen ist, daß der Einsatz wirklich an der Stelle mal sinnvoll wäre. Wenn man dann nachfragt, wieso man sich hier für das Muster entscheiden sollte, kann die Frage nicht ohne Killerphrasen beantwortet werden - macht man halt so, bessere Wartbarkeit und so. Wartbarkeit bleibt eine unbelegte, pauschale Behauptung. Es sind aber verschiedene Konzepte denkbar, um die Wartbarkeit zu gewährleisten. Viele Entwurfsmuster sind allmählich überholt. Sie wurden hauptsächlich für alte C++ Versionen geschrieben, um Defizite der streng typisierten Sprache auszugleichen. Vieles ist in modernen Sprachen hinfällig, besonders in Skriptsprachen, bei denen komplett andere Ansätze möglich sind. Builder, Factory z.B. bei Skriptsprachen kompletter overhead. Da kann man in der Regel einfach Objekt-Literale als Deskriptor an den Constructor übergeben und viel saubereren Code schreiben. (Siehe z.B. Object.defineProperties in JavaScript) Singleton sollte eher als Anti-Pattern gelten. Das gleicht einem Namespace für globalen Variablen und kann ebenso gut mit rein statischen Klassen erreicht werden, oder eben der Verwendung von Namespaces. Vielleicht kannst du ja mal in einem Video tiefer darauf eingehen, welche Muster heute noch ihre Gültigkeit behalten, und welche durch moderne Sprachkonstrukte obsolet geworden sind.

    • @pinkeHelga
      @pinkeHelga 17 วันที่ผ่านมา

      Es ist gut, die Entwurfsmuster einmal gesehen und verstanden zu haben. Die zwanghafte Störung, sie in Teamprojekten einsetzen zu müssen, sollte dagegen vermieden werden. Viel wichtiger ist die Kenntnis der Anti-Pattern. Viele derer galten einmal als tolle Entwurfsmuster, bis man feststellte, daß sie bei wachsenden Projekten nachteilhafte Nebeneffekte mitbrachten. Die gleichen Fehler sollte man nicht immer wieder wiederholen. Hier kann man Erfahrungen anderer lernen.

  • @RazeVX
    @RazeVX 17 วันที่ผ่านมา

    ich fand besonders gut das es kein mainboard gibt und die teile nur variablen xD spass ist es nun schöner code oder nicht? naja ich verstehe das hier ist es nur ein simples beispiel, und vieleicht, weil ich nur python c++ js erfahrung habe, verstehe ich die paradigmen auch nicht , aber wenn die variablen des computers nun eigene objecte wären die wiederum aus buildern kommen was in einem echten anwendungs kontext warscheinlich ist funktioniert das dann auch noch so? oder wenn die variablen die funktionalität der klasse ändern sollen was sind die edge cases und welche realen anwendungs szenarien gibt es bei dennen c# oder java eine gute wahl sind , wegen den prinzipien srp hört sich für mich stark nach functional programming und klar ein object mit 2000 zeilen code ist bei betrachtung wie es funktioniert komplex aber wenn die funktionen des objects keine äusseren einflüsse haben ausser der eigentlichen anwendung kann man das problemlos machen also erwartete form an argument produzieren immer die erwartete ausgabe und gegebenenfalls führen unerwartete eingaben zu einer anderen erwarteten ausgabe zb. fehlermeldung naja ausserdem hat der builder ja auch nur eine aufgabe classen zu generieren

    • @MemoryLeekDE
      @MemoryLeekDE 17 วันที่ผ่านมา

      Danke für deinen Kommentar! 😄Klar, in einem echten Anwendungsfall würden die Variablen wahrscheinlich eigene Objekte sein, die durch Builder erzeugt werden. Das ist definitiv machbar und kann den Code modularer und wartbarer machen. In Sprachen wie C# oder Java ist das Builder Pattern besonders nützlich für komplexe Objekte mit vielen optionalen Parametern. Es verhindert riesige Konstruktoren und erhöht die Lesbarkeit, besonders im Zusammenhang mit dem Single Responsibility Principle (SRP). Das Prinzip gibt es auch in Python, JS und C++, allerdings mit einigen Unterschieden: In Python nutzt man oft optionale Parameter oder benannte Argumente im Konstruktor, aber das Builder Pattern kann dennoch hilfreich sein. In JavaScript werden Builder meist mit Methoden-Chaining umgesetzt, was elegant und kompakt ist. In C++ funktioniert das Pattern ähnlich wie in Java und kann gut mit anderen Design-Patterns kombiniert werden. Nicht typisierte Sprachen wie Python und JavaScript greifen nicht auf Interfaces (also "Verträge") im eigentlichen Sinne zurück, daher sind die Patterns dort ein klein wenig anders. Aber die Struktur bleibt! Zu Python machen wir aber noch eigene Videos, aber das dauert noch ein wenig, weil wir erstmal alle Design Patterns im Grundsatz durchgehen wollen - bleib dran!

  • @bjornprompeler9424
    @bjornprompeler9424 18 วันที่ผ่านมา

    Hört sich gut an. Ich wünsche euch viel Erfolg 😊

  • @blackcathardware6238
    @blackcathardware6238 18 วันที่ผ่านมา

    Als guten Einstieg in die Grundlagen des Clean Code kann ich zwei Bücher empfehlen: "Code Complete" von Steve McConnell und "Writing Solid Code" von Steve Maguire

  • @hanswurst9397
    @hanswurst9397 18 วันที่ผ่านมา

    "Wartbarkeit" ist bei uns (Kunde von SAP) in Kundenerweiterungen DAS Argument. Wir haben (leider) sehr wenige eigene Entwickler:innen und die sind auch noch sehr heterogen in ihrem Wissenstand. Ich bin bspw. ein aus einem Verwaltungsberuf durch Praxix "migrierter" Programmierer geworden, angereichert durch schwerpunktsetzende Schulungen/Weiterbildungen. Unterstützt werden wir projektseitig oft in hoher zweistelliger Zahl von Externen, die leider alle so ihre eigenen Stile haben und sich nicht immer an unsere Entwicklungsrichtlinien halten. Würden wir das einfachste von "Clean Code" umsetzen, nämlich den Verzicht auf hunderte unterschiedliche Variablen-Präfixbezeichungsregeln (lv_* für "local variable"; ls_* für "local structure", gv_* für "global Variable" usw.), wäre es intern wesentlich schwerer im Debugging, Programme und deren Funktionen zu verstehen. Zumindest wurde mir das mal angetragen, dass wir im Sinne von Clean Code doch bitte auf die ganzen Präfixe verzichten sollten. Nein, Danke. Diese ganzen anderen Punkte, die Sie nennen, sind mir (als jemand, der keine originäre IT-Ausbildung oder Studium absolviert hat) neu gewesen, fand ich interessant - danke!

    • @MemoryLeekDE
      @MemoryLeekDE 16 วันที่ผ่านมา

      Wenn die Anforderung eine so starke Anpassung des Codes an die eigenen Bedürfnisse ist, dann ist das absolut legitim, auch im Bereich Clean Coding. Leute die jede Syntax-Regulierung zugunsten eines global einsetzbaren Coding-Standards streichen wollen und damit die (interne) Lesbarkeit gefährden, fallen genau unter dem was ich im Titel dieses Videos geschrieben habe. Regeln sind für die Menschen da und sollen ihnen helfen und nicht umgekehrt.

  • @sebstianfuhr1559
    @sebstianfuhr1559 18 วันที่ผ่านมา

    Schönes Video, diesem Pattern begegne ich immer wieder in der Android-Entwicklung. Ich würde die letztere Variante vorziehen, einfach anzuwenden und auch gut lesbar. Nun wird mir auch klar warum du in einem vorherigen Video gesagt hast, das es ein wichtiges Skill-Set ist diese Pattern zu kennen und zu verstehen.

  • @ExtroLurkerhaz
    @ExtroLurkerhaz 18 วันที่ผ่านมา

    You could reach 7 billion people. now you restrict yourself to what, 80 million? Can you really claim to be an intelligent content creator, a smart programmer.. if you choose to speak German when the internet is made for and with english.. idk. Do you code in german too? TH-cam channel is memory leek and you speak german.. how did you even come up with this? /No my native language is not english. And idc about typing perfectly unless its in a necessary environment like vsc.

    • @MemoryLeekDE
      @MemoryLeekDE 16 วันที่ผ่านมา

      Easy reply: This is a project that started at a german university and supported by a german university to support our STEM faculty. We do plan to do english content, but we have an obligation to serve our university first. And since the bachelor/master degrees are in german this is our priority. Sorry, ...

  • @pinkeHelga
    @pinkeHelga 18 วันที่ผ่านมา

    4:12 Im Interface ist gar nichts _implementiert,_ lediglich _deklariert._ Das Interface ist ein Vertrag, daß eine Definition/Implementation erfolgen muß.

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Absolut richtig. Ein kleiner Versprecher. Danke für die Korrektur.

  • @martapfahl940
    @martapfahl940 18 วันที่ผ่านมา

    Diesen Regenbogen kann ich langsam echt nicht mehr sehen.

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Mir ist eben erst aufgefallen, dass man das T-Shirt falsch deuten kann. Es ist einfach das Lieblingstshirt meiner Tochter. Das Death Metal Unicorn :) ...

    • @schachsommer12
      @schachsommer12 18 วันที่ผ่านมา

      Man soll sich auf den Inhalt konzentrieren, nicht auf die Präsentation, obwohl ich andauernd Bilder höre, aber nur Texte sehe und lese. 🤣

    • @schachsommer12
      @schachsommer12 18 วันที่ผ่านมา

      @@MemoryLeekDE Man kann alles falsch deuten, sogar physikalische Parameter, selbst wenn die wissenschaftlichen Ergebnisse etwas Klares vorgeben. Die Deutung hängt immer vom Blickwinkel ab.

    • @martapfahl940
      @martapfahl940 17 วันที่ผ่านมา

      @@MemoryLeekDE Es war auch nicht böse gemeint, aber aktuell sieht man das nur noch ^^ Ist doch niedlich, wenn deiner Tochter das gefällt. Liebe Grüße

  • @beatzimmermann2518
    @beatzimmermann2518 18 วันที่ผ่านมา

    cooles video. bitte künftig kapitel einfügen, das bringt übersicht und man kann besser nachschlagen. danke.

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Habe ich gerade hinzugefügt! Danke für den Hinweis.

    • @beatzimmermann2518
      @beatzimmermann2518 18 วันที่ผ่านมา

      @@MemoryLeekDE dankeschön ☺

  • @S3R43o3
    @S3R43o3 18 วันที่ผ่านมา

    Ui schöne Sache vielen Dank, Ich baue grad in WinUI 3 ein Desktoptool. Ist ein Passwort Manager mit AES verschlüsselung, Bildformatierung, Einer Quicklaunchbar und solchen Dingen. Vermutlich kann ich das dort mit anwenden. Habt ihr Erfahrungen mit WinUI?

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Ja, ist auch Teil unsere Vorlesung. Aktuell ist es nicht als Videoreihe geplant, aber wenn hier entsprechendes Feedback kommt sind wir da sehr flexibel.

    • @S3R43o3
      @S3R43o3 18 วันที่ผ่านมา

      @@MemoryLeekDE ich hätte da nur kurz eine generelle Frage. Lohnt sich das WinUI 3 oder ist doch WPF noch die bessere wahl, soll wohl Kompatibelitätsprobleme geben und viele Dinge wie das Window Handling muss man extra nochmal organisiseren mit WinRT. Ich hab das Gefühl das nur Microsoft selbst das nutzt den auch was so tutorials oder allegmein stackoverflow angeht ist das da alles ziemlich mau. Wäre super wenn du/ihr da mal kurz Ja lohnt sich oder nein noch nicht in die Tastatur hämmern könntest bevor ich mich da rein-nerde =P Vielen Dank, Super Videos. Die Erklär und erzählweise herausrangend!

    • @schachsommer12
      @schachsommer12 18 วันที่ผ่านมา

      Ich misstraue den so im Internet herumschwirrenden Passwort-Managern auch, aber gebaut habe ich mir bisher noch nie einen eigenen Passwort-Manager - auch, weil ich WinUI 3 nicht kenne, ein Desktoptool bestenfalls benutzen kann oder könnte, von einer AES- oder anderen Verschlüsselung, Bildformatierung, Quicklaunch-Bar und solchen Dingen keine Ahnung habe. Mir würde es schon reichen, wenn ich die unzähligen Dateien und Verzeichnisse auf meinem Computer endlich mal verstehen würde und nachvollziehen könnte.

    • @S3R43o3
      @S3R43o3 18 วันที่ผ่านมา

      @@schachsommer12 oh und da treibst du dich auf solchen Kanälen Rum? Nun im Grunde ist es wie mit allen Dingen. Step by step sagt der Engländer. Man könnte sagen du hast gleich Mal eine ganze Treppe übersprungen oder versucht zu überspringen wenn du hier bei Codepatterns bist. Also cool das du versuchst dein Wissen zu erweitern aber so wie du das schilderst bist du Recht weit davon entfernt was hier behandelt wird, trotzdem gerne weiter schauen ich halte die Leute hinter dem Kanal für sehr kompetent. Ich glaube du solltest ersteinmal 3-4 Schritte zurück und dir Basics aneignen. Die Architektur des Betriebssystems zu kennen ist essentiell um Programme für selbiges zu schreiben. Windows ist da auch gar nicht so schwer. Du kannst selbst Übungen machen und dir feste Strukturen für deinen PC anlegen. Zum Beispiel nicht die Default intallationspfade nehmen die von Programmen angeboten werden, sondern überlege dir eine gut organisierte Struktur und nutze sie. Ich würde dir da gerne mehr erklären und helfen leider ist die Kommentarspalte wohl nicht die richtige Umgebung. Übrigens, WinUI ist ein .NET Framework (Microsoft) die sich mit C++, C# und weiteren Sprachen verwendet wird, mit der sich für Windows 10-11 native Apps schreiben lassen. Mit hübschen Windows 11 Design. Das neue Windows SDK ist so modular das man quasi alles von .NET mit dem Framework einbinden kann, was natürlich viele Möglichkeiten bietet. Aber auch davon wirst du jetzt nicht viel verstanden haben, daher schau Mal bei Google es gibt viele hilfreiche, kostenlose Informationen. Fremdwerbung ist nicht gestattet denke ich aber du kannst ja Mal nach "alleine lernen" bzw nach der englischen Übersetzung suchen es gibt ein tolles app für mobile die sehr verständlich ist. Liebe Grüße und nicht entmutigen lassen, in der IT rennt man oft vor ne wand 🖖😉

    • @schachsommer12
      @schachsommer12 18 วันที่ผ่านมา

      @@S3R43o3 Der TH-cam-Algorithmus hat mich hierher gebracht. Und, ich habe auch schon mal gehört, dass man sich nicht entmutigen lassen soll und man in der IT oft vor 'ne Wand rennt - ich tippe auf das bzw. wegen den unzähligen und komplexen Urheber- und Nutzungsrechten, z. B. Kopierschutz. Ich kanns auf der einen Seite in einer so wettbewerbs- und konkurrenzorientierten Welt natürlich verstehen, aber unter der Zielsetzung der Vereinten Nationen laut Artikel 1 im Kapitel I der Charta der Vereinten Nationen mit "eine internationale Zusammenarbeit herbeizuführen, um internationale Probleme wirtschaftlicher, sozialer, kultureller und humanitärer Art zu lösen und die Achtung vor den Menschenrechten und Grundfreiheiten für alle ohne Unterschied der Rasse, des Geschlechts, der Sprache oder der Religion zu fördern und zu festigen" verstehe ich eigentlich etwas anderes. Tja, das kommt wohl davon, wenn es dort heißt: "1. den Weltfrieden und die internationale Sicherheit zu wahren und zu diesem Zweck wirksame Kollektivmaßnahmen zu treffen, um Bedrohungen des Friedens zu verhüten und zu beseitigen, Angriffshandlungen und andere Friedensbrüche zu unterdrücken und internationale Streitigkeiten oder Situationen, die zu einem Friedensbruch führen könnten, durch friedliche Mittel nach den Grundsätzen der Gerechtigkeit und des Völkerrechts zu bereinigen oder beizulegen" - Das erinnert mich an die Bruderschaft von Nod bei Command and Conquer, die gerne den Leitspruch bringt: "Frieden durch Macht"

  • @xcoder1122
    @xcoder1122 18 วันที่ผ่านมา

    Zum Thema Performance gilt die Daumenregel: 99% der Zeit wird in 1% des Codes verballert. D.h. ich muss nur 1% des Codes anfassen, um wirklich die Performance zu steigern bzw. ich kann mein Zeit damit verschwenden 99% des Codes zu optimieren und gewinne am Ende doch gar nichts dabei. Code, der so gut wie nie zur Ausführung kommt, muss aber nicht schnell sein oder sparsam mit Speicher umgehen, er muss vor allem gut lesbar, fehlerfrei und leicht wartbar sein. Ich bin z.B. immer wieder erstaunt, wie schnell manchmal Anwendungen sind, die eigentlich in Python geschrieben sind, obwohl Python wirklich keine schnelle Sprache ist. Aber der Grund ist einfach: das eine Prozent, wo es wirklich auf Performance ankommt, das ist gar nicht in Python geschrieben, das ist in C geschrieben und wird nur von Python aus aufgerufen.

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Absolut ... viele Verstehen diese Grundlage nicht!

  • @xcoder1122
    @xcoder1122 18 วันที่ผ่านมา

    Die Regel bei Variablenamen ist bei mir z.B.: Je weiter der Scope einer Variable, desto besser muss ihr Name sein. In einer for-Schleife mit nur einer Zeile Code, darf man durchaus "i" für den Index nutzen. Bei 3 Zeilen Code, wäre vielleicht "idx" schon angebracht. Bei 20 Zeilen Code würde ich auf "index" zurück greifen. Aber bei einer Klassenvariable, reicht index schon nicht mehr aus, weil "Was für ein Index? Wofür ist der Index gut?"

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Ein wahrer Clean-Bro (-Gal) ist unter uns! :)

    • @frankklemm1471
      @frankklemm1471 16 วันที่ผ่านมา

      Warum drei verschiedene Namen für ein und das selbe? Außerdem sollte man Indices ohnehin vermeiden und Iteratoren verwenden. Direkt über die Objekte iterieren statt Indices oder Pointer. Beschreibende Variablennamen sind häufig ein Zeichen fehlender Abstraktion. Wenn ich in eine CustomerListe einen Customer unter der Bedingung, dass er älter als 18 Jahre ist, einfügen will, dieselbe Funktion aber auch Tiere in eine Tierliste einfügen könnte, wenn sie mehr als 1,8 kg wiegen, dann haben Variablennamen wie Customer und CustomerListe nichts in dieser Funktion zu suchen, sondern E wird in L unter C eingefügt.

    • @xcoder1122
      @xcoder1122 16 วันที่ผ่านมา

      @@frankklemm1471 Es sind nicht drei verschiedene, es ist nur genau einer, aber welchen davon ich wählen würde, hängt eben vom Code ab. Warum? Weil mir ein unnötig langer Name in einer oder drei Zeilen Code kein Vorteil bringt (wer sich einen Namen nicht über diese Distanz merken kann, der ist als Programmiere IMHO ungeeignet; gibt auch andere schöne Berufe, wo man sich nichts merken muss), aber mehr Code tippen und mehr Code lesen zu müssen, bringt mir Nachteile, denn meine Tipp- und Lesegeschwindigkeit ist endlich. Und eine Programmiersprache wie C hat gar keine Iteratoren, außerdem wer hat jemals davon gesprochen, dass ich hier etwas iteriere? Wie du z.B. quicksort mit Iteratoren implementierst, das zeigst du mir mal. Oder vielleicht möchte ich in einer Matrix nur ein paar Zeilen lesen und niemand nutzt in Matrix-Code iteratoren. Alleine was du hier also für Annahmen triffst über Code, von dem du nicht mal weißt, was der tut, ist haarsträubend.

  • @g2h5j3
    @g2h5j3 18 วันที่ผ่านมา

    Ich habe so was ähnliches mal in einem Projekt genutzt, jedoch ohne die "Aufgabe der Konstruktion" eine andere Klasse machen zu lassen. Ich habe einfach allen setter Methoden einen return-Typ gegeben (return this) und einen leeren Konstruktor hinzugefügt. So konnte ich auch beim initialisieren alles so setzen wie Ich es haben wollte. Hatte auch den Vorteil das Ich mir später im Code Zeilen sparen konnte wenn Werte neu gesetzt wurden

    • @MemoryLeekDE
      @MemoryLeekDE 18 วันที่ผ่านมา

      Wenn man was nachträglich gespart hat, dann hat man definitiv etwas richtig gemacht :)

  • @GnomeEU
    @GnomeEU 21 วันที่ผ่านมา

    Allein schon das Prinzip ich verändere nie etwas ist der größte quatsch. Jede Software kann mindestens 10x refactored und neu geschrieben werden, bis sie richtig gut ist. Wenn ich nie etwas ändern darf kann ich die Software nach ein paar Jahren einfach nur weg schmeißen. Wird dann immer langsamer, aber immerhin bauen wir keine neuen Fehler ein.

    • @MemoryLeekDE
      @MemoryLeekDE 17 วันที่ผ่านมา

      Danke für deinen Kommentar! Dein Punkt ist absolut verständlich. Das Open-Closed Principle (OCP) bedeutet, dass Klassen offen für Erweiterung, aber geschlossen für Modifikation sein sollten. Das heißt nicht, dass man nie etwas ändern darf, sondern dass man neue Funktionalitäten durch Erweiterungen hinzufügt, um stabile Codebasen zu bewahren und das Risiko neuer Fehler zu minimieren. Refactoring bleibt wichtig, um die Qualität der Software zu verbessern. Es geht darum, den Code sauberer und effizienter zu machen und langfristig unnötige Komplexität zu vermeiden, die die Software langsamer machen könnte. Es ist sinnvoll, sich mit diesen Prinzipien auseinanderzusetzen, weil es immer eine Balance zwischen "technical debt" und sauberer Programmierung geben muss. Clean Coding zu lernen hat viel damit zu tun, das richtige Mindset zu entwickeln. Daher sollte man hier nicht dogmatisch sein. Deine Perspektive zeigt, wie wichtig kontinuierliche Verbesserung im Software-Engineering ist.

  • @MichaelSchuerig
    @MichaelSchuerig 22 วันที่ผ่านมา

    Ein üblicher Fehler ist es, Design Patterns auf das darin möglicherweise enthaltene Klassendiagramm zu reduzieren. Dieses Diagramm repräsentiert selbst im besten Fall nur _eine_ Lösung, die man aber nur verstehen kann, wenn man das Problem versteht. Der echte Wert eines Design Patterns besteht darin, dass es ein übliches Problem beschreibt und die relevanten Einflussfaktoren explizit macht. Diese Faktoren müssen abgewogen werden und je nach Gewichtung können dann durchaus unterschiedliche Lösungen als geeignet heraus kommen. Das kann dann beispielsweise dazu führen, dass man eine Subject-Observer-Beziehung verwendet, um Codeteile zu entkoppeln. Das kann aber ebenso dazu führen, dass man entscheidet, dass diese Kopplung nicht so schlimm ist und der Aufwand für den Observer sich nicht lohnt.

  • @EikeSchwass
    @EikeSchwass 22 วันที่ผ่านมา

    Gilt ja mitlerweile als Anti-Pattern, vor allem da man über IoC-Container mit Singleton-Lifetime alle Vorteile aber eigentlich keine der Nachteile bekommt und somit die bevorzuziehende Variante ist. Singletons machen (Unit-)Tests wirklich absolut fürchterlich zu schreiben und sollten, alleine deshalb, so gut es geht vermieden werden.

    • @MemoryLeekDE
      @MemoryLeekDE 22 วันที่ผ่านมา

      Absolut, in einer Reihe über Design Patterns, kann ich sie dennoch nicht auslassen :-/

  • @dauthdaertya9645
    @dauthdaertya9645 22 วันที่ผ่านมา

    The Clean Coder - Von Uncle Ben ist probably always ein good read

    • @tldw8354
      @tldw8354 21 วันที่ผ่านมา

      Das ist aber kein clean Satz! Da muss ich ja noch nen Translator importieren, bevor man den versteht :D

  • @martapfahl940
    @martapfahl940 22 วันที่ผ่านมา

    Gutes Video! Weißt du zufällig ob die von Intel ja relativ neu eingeführten Performance Cores und Efficiency Cores konkret mit C# angesteuert werden können oder ob das immer automatisch passiert? Beispiel ich will Prozesse die stärkere Rechenpower benötigen auf die P-Cores schicken und Prozesse die schnell gehen auf die Efficiency Cores? Wenn ja weißt du wie das umgesetzt wird? Muss ja vermutlich mit dem Compiler abgestimmt sein. Ich persönlich hab nen Ryzen 5800X3D, da gibts das ja zB gar nicht.

    • @MemoryLeekDE
      @MemoryLeekDE 22 วันที่ผ่านมา

      Die kurze Antwort ist: Weiß ich nicht genau! Aber: Die Verwaltung von P-Cores und E-Cores erfolgt hauptsächlich durch das Betriebssystem und den Thread Director. In C# kannst du aber Prozessaffinität und Thread-Prioritäten einstellen und so Threads auf bestimmte Kerne setzen z.B. process.ProcessorAffinity = (IntPtr)0x000F setzt die Affinität auf die ersten 4 Kerne. Die Priorität von Threads geht über Thread thread = new Thread(MethodName); thread.Priority = ThreadPriority.Highest; Wie sich das exakt auf die P- und E-Cores auswirkt, weiß ich nicht. That said ... ich glaube, dass die Optimierungsregeln des Betriebssystems schon ziemlich stark sind. Ich verstehe aber den Wunsch eingreifen zu wollen. Wenn jemand mehr weiß, freue ich mich auch dazu zu lernen.

    • @martapfahl940
      @martapfahl940 21 วันที่ผ่านมา

      @@MemoryLeekDE Top danke dir für die ausführliche Antwort :)

  • @S3R43o3
    @S3R43o3 23 วันที่ผ่านมา

    Heyey, zufällig über deinen/euren Kanal gestolpert. Wirklich sehr angenehmer Moderator! Ich komme eigentlich aus der cybersecurity und versuche nun etwas mehr im engineering und entwicklungsbereich besser zu werden. .NET und c# mit dem Windows SDK also WinUI 3 hab ich mir rausgesucht (ich weiss noch nicht ob ich das nicht bereue =D) In jedem fall Sehr gute erklärungen und vermutlich sogar für Laien verständlich. Ich jedenfalls hatte keine Probleme zu folgen. Gerne Mehr solcher Pattern wenn du sagst es gibt 21 stück =P Mein erstes Project ist ein Desktop Tool um Texte mit Fancy symbolen und einrückungen zu formatieren um den dann in Facebook oder wo auch immer zu nutzen, sowas z.b: F͕̬̂ͨͨ̇̾̑͜a̸̫͋ͫ̀́n̸̩̰͎̓̋̅̚͜ç̴̡͕̫͈̣̬̳͚ͨ͗́ͅy̱̜͈̺ͦ͜ ̢̟͎ͫͨͯ̍T̨̲̩̝̫̘͖͎͛̎͑e̡̩͙͈̦͊̄͆̓̓̓͝x̸̺͙̮͚̹̥͔̆ͤ͋ͮ̽̂̏̈́t̶̳̪͍͕̩̍̓͐̿̄f̛͖̞̘ͦ̏͌̍̅o̸͓̪ͨ͆̌̋r̳͇͖͕͓ͧͮ̍̏ͦm̴̡̟̜̪ͥã̲͖̣̲ͬ͝͝͡t̨̛̓ͫͨ͏͈ͅ Danke für den Content und die Arbeit und gerne mehr. Ihr seid ja grad aus dem Ei gepellt. =P Happy coding

  • @odopaisen2998
    @odopaisen2998 23 วันที่ผ่านมา

    lotsa acronyms .. lost in oo oblivion .. why OO everywhere ???

  • @mychecker6272
    @mychecker6272 23 วันที่ผ่านมา

    Ich bin nur zufällig auf dein Video gestoßen und muss sagen, dass Clean Code nur da angewandt werden soll, wo er auch Sinn macht. Ich habe es im ABAP-Umfeld erlebt: Die SAP bietet sogenannte Funktionsbausteine an. Hier gibt man ein Parameter rein und bekommt ein Ergebnis zurück. Das ist freigegeben und getestet. Nun kam ein findiger Entwickler auf die Idee, diesen Funktionsbaustein in eine Klasse zu packen, um damit minimale Parameter an den Methoden zu erreichen - also ein einfacher GETTER. Für jeden Import-Parameter des Funktionsbaustein gibt es eine Methode. Hier wurde ca. 10 Methoden ausgeprägt, weil genau diese gebraucht werden. Der Funktionsbaustein kann aber mit ca. 250 Ausprägungen von Importparametern gerufen werden. Die Klasse müsste also 250 Methoden haben. Im Ergebnis wird also VIEL, sehr VIEL Quellcode erzeugt, nur um bestehendes Coding auf neue Herangehensweise zu hiefen.

    • @MemoryLeekDE
      @MemoryLeekDE 22 วันที่ผ่านมา

      Ein sehr interessantes Beispiel, da muss ich mal intensiv drüber nachdenken ...

  • @NachtmahrNebenan
    @NachtmahrNebenan 23 วันที่ผ่านมา

    Sieben Einrückungen und Zeilen mit über 340 Zeichen. Das ist kein Clean Code und zugleich Körperverletzung.

  • @satyayuga0
    @satyayuga0 23 วันที่ผ่านมา

    builder.Services.AddSingleton<AudioManager>() existiert und ist ganz traurig wieso der so missachtet wird. Aber... dann habe ich nochmal überlegt und es geschnallt... da gab es ja noch ein UML Diagramm... das kann nur einer aus der Wissenschaft sein. @Studenten: Keine sorge, diesen Quatsch werdet ihr nie wieder brauchen :*) PS: Typo --> sollte "Implementation" heissen.

  • @heinrichschiller4673
    @heinrichschiller4673 24 วันที่ผ่านมา

    Das Enten-Beispiel ist meiner Meinung nach richtig schlecht. Zunächst ist eine Gummiente, weder ein Tier noch eine Ente. Der Programmierer sollte gar nicht erst auf die Idee kommen zu versuchen das zu implementieren. Aber ja, Fehler sind menschlich und schon viel Unsinn hier gesehen.

    • @MemoryLeekDE
      @MemoryLeekDE 23 วันที่ผ่านมา

      Kritik angenommen, vielleicht werden wir nochmal an dem Thema vorbeikommen und dann bemühen wir uns um ein besseres Beispiel.

  • @user-to6vd2gu6u
    @user-to6vd2gu6u 24 วันที่ผ่านมา

    Kannte die Prinzipien schon, fand das Video aber gut als Refresher (ich habe oft ein Problem, die Begriffe mit ihren Bedeutungen zu matchen) und auch sehr gut erklärt.

  • @schachsommer12
    @schachsommer12 24 วันที่ผ่านมา

    Was ist der Unterschied zwischen nur einer fest definierten Aufgabe im Vergleich zum Prinzip der eindeutigen Verantwortlichkeit? Die konsequente Anwendung des Single-Responsibility-Prinzips ist in großen Projekten nicht empfehlenswert, weil es sich dabei um Code mit sehr vielen kleinen Klassen und kleinen Methoden handelt? #Raviolicode Ich mag eine saubere Strukturierung für mehr Übersichtlichkeit, wenn ich doch nur die Module, Namespaces und Fassaden lesen und verstehen könnte und würde.

    • @MemoryLeekDE
      @MemoryLeekDE 24 วันที่ผ่านมา

      Danke für deinen Kommentar! Der Unterschied liegt darin, dass das Single Responsibility Principle (SRP) sicherstellt, dass eine Klasse nur eine einzige Verantwortlichkeit hat und somit nur einen Grund für Änderungen. Das führt zwar oft zu vielen kleinen Klassen, macht den Code aber auch modularer und leichter testbar. In großen Projekten kann das herausfordernd sein, aber mit einer guten Strukturierung durch Module und Namespaces bleibt die Übersichtlichkeit erhalten. Es geht um die richtige Balance. Hier auf dem Channel sind wir keine Theorie-Puristen und wollen Programmierparadigmen nicht als Gesetze auslegen. Danke für deine Gedanken und Herzlich willkommen in der Community!

  • @MikeDerUnwissende2
    @MikeDerUnwissende2 24 วันที่ผ่านมา

    Ein paar schöne Tipps, danke für Dein Video!

  • @matthias_lang
    @matthias_lang 24 วันที่ผ่านมา

    Dachte der Kanal hat sicher über 100 Tsd. Abos

    • @MemoryLeekDE
      @MemoryLeekDE 24 วันที่ผ่านมา

      Wir sind vor 2 Wochen gestartet. Schau in 2 Wochen nochmal ;)

  • @nunofigueira8691
    @nunofigueira8691 25 วันที่ผ่านมา

    I would like work for a tech company in German, I love the culture and I expected learning the dutch😊

    • @MemoryLeekDE
      @MemoryLeekDE 25 วันที่ผ่านมา

      We are welcome to have you

    • @nunofigueira8691
      @nunofigueira8691 25 วันที่ผ่านมา

      @@MemoryLeekDE Thank you ver much.

  • @RonnieTreibholz
    @RonnieTreibholz 25 วันที่ผ่านมา

    Gut erklärt aufjedenfall! :D Wobei ich mir auch gleich wieder dachte, Ja … Parallelität war ein Fehler, macht alles nur komplexer :P Aber neja, benötigt man nun mal auch heutzutage :) Ich glaube, das Singleton war das erste Pattern, was wir damals programmieren mussten, damals noch in Java. War auf jeden Fall interessant zu sehen, wie C# das löst, bei Java war es glaube ich mit synchronized, ist aber schon 'ne weile her. Wenn ich mich recht entsinne, wurde damit eine Methode markiert als, "hey, hier darf nur ein Thread dran arbeiten." Interessant wäre es in C gewesen, weil ich denke … da hätte man seine eigenes "lockobject" schreiben müssen. Wobei sicher den Rahmen des Videos gesprengt hätte :D

  • @g2h5j3
    @g2h5j3 25 วันที่ผ่านมา

    Warum überprüft man jetzt bei 9:09 noch mal ob die Instanz null ist? So wie ich das jetzt verstanden habe kommt der Thread doch nicht in den Programmblock rein wenn ein anderer Thread schon dabei ist ein neues Objekt zu erstellen. Oder kann zwischen der ersten If-Abfrage und dem lock-Block ein anderer Thread die Zuweisung so schnell durchführen?

    • @MemoryLeekDE
      @MemoryLeekDE 25 วันที่ผ่านมา

      Danke für die Frage! Genauer werden wir in unserer Multithreading Videoreihe darauf eingehen, aber hier schonmal die Antwort: Zuerst führt ein Thread die erste Überprüfung if (instance == null) durch, um festzustellen, ob die Instanz bereits erstellt wurde. Wenn die Instanz null ist, versucht der Thread, die Sperre zu erwerben. In diesem Moment kann es jedoch passieren, dass der Thread unterbrochen wird und ein anderer Thread ebenfalls die erste Überprüfung durchführt. Da die Instanz immer noch null ist, wird der zweite Thread die Sperre erwerben und die Instanz erstellen. Wenn der erste Thread seine Ausführung fortsetzt und die Sperre erwirbt, würde er ohne die zweite Überprüfung ebenfalls versuchen, eine neue Instanz zu erstellen. Dies würde das Singleton-Prinzip verletzen, welches sicherstellen soll, dass nur eine einzige Instanz der Klasse existiert. Die doppelte Überprüfung dient also dazu, sicherzustellen, dass die Instanz nicht mehrfach erstellt wird. Sobald der erste Thread die Sperre erworben hat, überprüft er nochmals, ob die Instanz bereits von einem anderen Thread erstellt wurde. Wenn die Instanz inzwischen erstellt wurde, überspringt der erste Thread die Erstellung einer neuen Instanz und gibt die bereits existierende Instanz zurück. Dies garantiert, dass nur eine einzige Instanz der Klasse erstellt wird, auch in einer multithreaded Umgebung.

    • @g2h5j3
      @g2h5j3 25 วันที่ผ่านมา

      @@MemoryLeekDE Ah okay, danke mir war nicht bewusst das Threads so unterbrochen/pausiert werden können. Aber das werd ich ja dann bald hier sehen ;)

    • @EikeSchwass
      @EikeSchwass 22 วันที่ผ่านมา

      @@g2h5j3 Der erste Check ist vor allem eine Performanceoptimierung. Am Verhalten würde sich nichts grundsätzlich ändern, wenn man den ersten Check nicht hätte, aber das würde in Multithreading-Szenarien zu übermäßigem Locking führen, weil dann potenziell jeder Aufruf von GetInstance in einen Lock rennen kann.

    • @pinkeHelga
      @pinkeHelga 18 วันที่ผ่านมา

      @@g2h5j3 Ja, ein Lock wartet - bestenfalls mit einem Timeout, je nach System/Sprache - bis andere Threads ihren Lock wieder freigeben. Das ist der Sinn des Konstrukts. Multithreading beherrbergt Race Conditions. Mit einem Lock ist es auch nicht unbedingt getan. Schnell läuft man in einen Dead-Lock. Dann sperren sich 2 Threads gegenseitig, und nichts geht mehr. Es gibt viele Konzepte, wie man den Teufel mit dem Belzebub austreibt. Eines der besten Konzepte ist, einen dedizierten Prozeß/Thread für solche kritischen Aufgaben bereitzustellen, der bei Bedarf benachrichtigt wird. Btw.: Vom Singleton-Muster bin ich eh kein Freund. Es ist imgrunde nur eine neue Form von globaler Variablen und bringt damit ähnliche Probleme mit sich. Und in den meisten Umgebungen sind auch statische Klassenmethoden und Eigenschaften verfügbar, die quasi das selbe ermöglichen. Keine Notwendigkeit, eine Instanz zu erstellen. Und statische Klassen sind imgrunde auch nur wieder ein Mißbrauch als Namespace. Die meisten Sprachen bieten inzwischen das Konzept von Namespaces an. Besser man hat eine verantwortliche Kontrolleinheit, die eine Instanz erzeugt, und die wird dann herumgereicht.