Zum Fußzeileninhalt springen
Iron Academy Logo
C#-Anwendung
C#-Anwendung

Andere Kategorien

C# Schnittstellen für lose Kopplung — Erklärt durch Tim Coreys Lektion 16

Tim Corey
44m 47s

In Lektion 16 des Kurses "C# App Start to Finish" baut Tim Corey weiter am Formular "Turnier erstellen", aber das eigentliche Lernziel geht weit über das Verkabeln von Buttons und Listenboxen hinaus. Wenn Tim die Verbindung von Formularen herstellt, stellt er ein grundlegendes Software-Design-Konzept in C# vor: Schnittstellen, die für lose Kopplung verwendet werden. Diese Lektion zeigt Schnittstellen nicht als abstraktes akademisches Konzept, sondern als praktisches Werkzeug zur Lösung realer Probleme in einer WinForms-Anwendung.

In diesem Artikel werfen wir einen genaueren Blick darauf, wie Tim Corey Schnittstellen erklärt, warum er sie verwendet und wie sie helfen, enge Kopplungen zu vermeiden. Alle Erklärungen, Begründungen und Schlussfolgerungen kommen direkt aus Tims Durchgang, indem seine Abläufe, Terminologie und Beispiele aus dem Transkript verwendet werden.

Formulare Verkabeln ist einfach – sie richtig Verkabeln nicht

Um 1:18 beginnt Tim mit dem Verkabeln der UI-Elemente "Preis erstellen" und "Team erstellen". Er weist sofort darauf hin, dass dieser Schritt einschüchternd wirken kann, nicht weil es schwer ist, ein anderes Formular aufzurufen, sondern weil Menschen beim korrekten Zurückgeben von Daten normalerweise Fehler machen.

Tim erklärt, dass die Herausforderung nicht darin besteht, ein weiteres Formular zu öffnen – das ist der einfache Teil. Die Herausforderung besteht darin, wie ein Formular ohne langfristige Designprobleme mit einem anderen kommuniziert. Hier beginnt die Idee, Verträge anstelle von Abhängigkeiten zu definieren, von Bedeutung zu sein.

Die Versuchung enger Kopplung

Um 1:34 spricht Tim explizit einen häufigen Fehler an: das direkte Koppeln des Formulars "Turnier erstellen" mit dem Formular "Preis erstellen". Bei diesem Ansatz weiß eine Klasse genau, mit welcher anderen Klasse sie spricht.

Tim erklärt, dass dies enge Kopplung verursacht, was bedeutet, dass die Formulare direkt voneinander abhängig sind. Wenn ein Formular sich ändert, wird das andere beeinflusst. Wenn ein anderer Teil des Programms später dieselbe Funktionalität benötigt, kann sie nicht erneut verwendet werden.

Er betont, dass, obwohl dies kompilieren und funktionieren mag, es keine gute langfristige Designentscheidung ist, insbesondere in größeren Systemen oder professionellen Umgebungen.

Denken in Schritten, bevor Sie Code schreiben

Um 2:02 hält Tim inne und schreibt die Schritte auf, anstatt sofort mit dem Code zu beginnen. Er listet auf:

  1. Formular "Preis erstellen" aufrufen

  2. Einen PrizeModel zurückbekommen

  3. Es zur Liste der ausgewählten Preise hinzufügen

Tim erklärt, dass das Schreiben von Schritten zuerst hilft, Logikfehler zu vermeiden und die Absicht des Codes klar zu machen. Dieses strukturierte Denken wird besonders wichtig, sobald Schnittstellen eingeführt werden, weil Schnittstellen definieren, was geschehen muss, nicht wie es geschieht.

Referenztypen und warum Rückgabewerte nicht immer benötigt werden

Um 4:56 erklärt Tim ein wichtiges Detail über Modelle, die herumgereicht werden. Er erinnert die Zuschauer daran, dass sie Adressen herumreichen, keine Kopien von Objekten.

Wenn der Preis über den Daten-Connector gespeichert wird, hat das Modell bereits seine ID ausgefüllt. Tim weist darauf hin, dass es oft unnötig ist, das Modell erneut zurückzugeben, da die Instanz bereits geändert wurde.

Dies verstärkt, warum Schnittstellen nicht existieren, um Daten blind zu übertragen – sie existieren, um Fertigstellung und Verantwortung zu signalisieren, nicht Duplikation.

Warum das Modell zuerst zu übergeben eine schlechte Idee ist

Um 6:42 diskutiert Tim die Idee, ein PrizeModel in den Formularkonstruktor zu übergeben, sodass beide Formulare dieselbe Instanz teilen.

Er erklärt, warum dies in einem realen Anwendungsfall scheitert: Wenn der Benutzer das Formular abbricht, hat man am Ende einen leeren oder ungültigen Preis in seiner Liste. Tim zeigt, dass nur weil zwei Klassen Instanzdaten teilen können, nicht bedeutet, dass sie es sollten.

Dieser Moment verstärkt die Idee, dass Schnittstellen das Verhalten definieren, nicht die Datenspeicherung.

Direktes Übergeben des aufrufenden Formulars ist noch schlimmer

Um 7:46 spricht Tim einen anderen gängigen Ansatz an: das gesamte Formular "Turnier erstellen" in das Formular "Preis erstellen" zu übergeben und eine öffentliche Methode wie SavePrize aufzurufen.

Tim erklärt, warum dies noch schlechter ist:

  • Das Preisformular weiß nun genau, welche Klasse es aufruft

  • Keine andere, nicht verwandte Klasse kann das Preisformular wiederverwenden

  • Die Klasse ist in einen einzigen Anwendungsfall eingesperrt

Er benennt dies explizit als enge Kopplung, die wir zu vermeiden versuchen.

Einführung von Schnittstellen als Verträge

Um 9:01 führt Tim die Lösung ein: eine Schnittstelle.

Er erstellt eine neue Schnittstelle mit dem Schlüsselwort "interface" und nennt sie IPrizeRequester. Tim erinnert die Zuschauer daran, dass eine Schnittstelle:

  • Keine Klasse ist

  • Keine konkreten Methoden enthält

  • Existiert, um einen Vertrag zu definieren

Die Schnittstelle enthält eine einzige Methode:

  • PrizeComplete(PrizeModel model)

Tim erklärt, dass diese Methode definiert, was geschehen muss, nicht wie es geschieht.

Schnittstellenmitglieder und Verantwortlichkeiten

Um 9:40 erklärt Tim, dass jeder, der diese Schnittstelle implementiert, sich verpflichtet, diese Methode zu unterstützen. Die Schnittstelle hat standardmäßig öffentliche Mitglieder und erklärt keine Instanzdaten.

Hier macht Tim klar, dass Schnittstellen Fähigkeit, nicht Speicher definieren. Die implementierende Klasse entscheidet, was zu tun ist, wenn die Methode aufgerufen wird.

Eine Schnittstelle statt einer Klasse übergeben

Um 10:19 ändert Tim den Formular-Konstruktor "Preis erstellen", um einen IPrizeRequester anstelle eines konkreten Formulars zu akzeptieren.

Er erklärt, dass dies bedeutet:

  • Jemand wird das Formular aufrufen

  • Das Formular weiß nicht, wer das ist

  • Die einzige Anforderung ist, dass der Anrufer die Schnittstelle implementiert

Dies ist lose Kopplung in der Praxis. Das Preisformular hängt von einem Schnittstellentyp ab, nicht von einer spezifischen Klasse.

Speichern der Schnittstelleninstanz zur späteren Verwendung

Um 11:06 speichert Tim die Schnittstelleninstanz auf Klassenebene. Er erklärt, dass Konstruktorparameter nur innerhalb des Konstruktors existieren, es sei denn, sie werden gespeichert.

Dies ermöglicht es dem Preisformular, später PrizeComplete aus dem Button-Klick-Ereignis aufzurufen.

Rückruf der implementierenden Klasse

Um 11:49 demonstriert Tim den entscheidenden Moment:

callingForm.PrizeComplete(model);

Er erklärt, dass das Preisformular nun an den zurückruft, der die Schnittstelle implementiert hat, und sagt:

"Ich bin fertig, und hier ist das fertiggestellte Modell."

Erst nach diesem Anruf schließt sich das Formular. Dies garantiert, dass der Preis nur hinzugefügt wird, wenn die Erstellung erfolgreich war.

Die Implementierung der Schnittstelle im Turnierformular

Um 13:29 wechselt Tim zum Formular "Turnier erstellen" und implementiert die Schnittstelle.

Er erklärt das Schlüsselwort this um 13:58 und beschreibt es als die aktuelle Instanz – das tatsächliche Objekt im Speicher. Indem er this übergibt, übergibt das Formular seine Adresse, jedoch nur durch den Schnittstellenvertrag.

Mehrere Schnittstellen, eine Klasse

Um 18:41 führt Tim eine zweite Schnittstelle ein: ITeamRequester.

Er erklärt, dass eine Klasse zwar nur von einer Basisklasse erben kann (wie Form), aber mehrere Schnittstellen implementieren kann. Dies ermöglicht es einer einzelnen Klasse, mehrere unabhängige Verhaltensweisen ohne Mehrfachvererbung zu unterstützen.

Tim betont, dass Schnittstellen keinen Code importieren – sie definieren nur erforderliche Methoden.

Mustern, Konsistenz und Fehlererkennung

Gegen 42:08 reflektiert Tim darüber, warum die Verwendung von Mustern wichtig ist. Durch Wiederholen derselben schnittstellenbasierten Struktur werden fehlende Schritte offensichtlich und das Debuggen erleichtert.

Tim ermutigt dazu, Dinge aufzuschreiben, konsistente Muster zu verwenden und nicht zu versuchen, alles im Kopf zu behalten. Seiner Meinung nach geht es bei gutem Design nicht um Perfektion – es geht um Klarheit, Struktur und die Erleichterung zukünftiger Änderungen.

Abschluss

In Lektion 16 verwendet Tim Corey einen realen WinForms-Anwendungsfall, um zu demonstrieren, wie Schnittstellen lose Kopplung ermöglichen. Anstatt sich auf abstrakte Beispiele zu verlassen, zeigt er, wie Schnittstellen:

  • Verträge definieren

  • Klassen entkoppeln

  • Mehrere Schnittstellen in einer einzigen Klasse unterstützen

  • Enge Kopplung verhindern

  • Die langfristige Flexibilität verbessern

Am Ende der Lektion funktioniert die Anwendung nicht nur – sie ist so strukturiert, dass sie Wachstum, Wiederverwendung und Klarheit unterstützt. Tims Ansatz lässt Schnittstellen praktisch, zweckmäßig und unerlässlich in der realen C#-Entwicklung erscheinen.

Für eine vollständige, durchgängige Anwendung dieser Schnittstellen- und losen-Kopplungskonzepte, schauen Sie sich die vollständige Lektion 16 Video an, in dem jeder Schritt innerhalb der funktionierenden C#-Anwendung implementiert, getestet und verfeinert wird.

Hero Worlddot related to C# Schnittstellen für lose Kopplung — Erklärt durch Tim Coreys Lektion 16
Hero Affiliate related to C# Schnittstellen für lose Kopplung — Erklärt durch Tim Coreys Lektion 16

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an