Software-Architektur: Meta- und SOLID-Grundlagen für C#-Entwickler | Elias Spock | Skillshare

Playback-Geschwindigkeit


  • 0.5x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 2x

Software-Architektur: Meta- und SOLID-Grundlagen für C#-Entwickler

teacher avatar Elias Spock, Chance favors the prepared mind.

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Eine Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Eine Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

61 Einheiten (4 Std. 53 Min.)
    • 1. 00 Promo

      5:51
    • 2. 01 Umriss

      2:17
    • 3. 02 SOLIDE Intro

      8:53
    • 4. 03 Problem

      8:07
    • 5. 04 Demo des Problems

      5:48
    • 6. 05 Refactoring auf ein besseres Design

      2:19
    • 7. 06 weitere Beispiele von of

      4:21
    • 8. 07 SRP Verwandte Muster

      5:19
    • 9. 08 Schlussfolgerungen

      2:20
    • 10. 01 Umriss

      2:17
    • 11. 02 OCP Definition

      8:06
    • 12. 03 Demo des Problems

      6:50
    • 13. 04 Refactor: Eine Verbesserung von einem besseren Design

      2:59
    • 14. 05 OCP Verwandte Muster

      10:43
    • 15. 06 häufige Smells von OCP Verstoß

      1:30
    • 16. 07 Schlussfolgerungen

      1:55
    • 17. 01 Umriss

      2:17
    • 18. 02 LSP Definition

      3:52
    • 19. 03 Verträge

      6:59
    • 20. 04 Demo des Problems

      5:48
    • 21. 05 Refactoring auf ein besseres Design

      2:19
    • 22. 06 weitere Beispiele von of

      6:10
    • 23. 07 häufige Geräte der of

      2:06
    • 24. 08 Schlussfolgerungen

      2:20
    • 25. 01 Umriss

      2:17
    • 26. 02 ISP Definition

      4:51
    • 27. 03 Demo des Problems

      6:50
    • 28. 04 Refactor: Eine Verbesserung von einem besseren Design

      2:59
    • 29. 05 Demo des Problems

      5:50
    • 30. 06 Refactor: ich habe ein besseres Design

      1:51
    • 31. 07 gängige Gerüche, Korrekturen und verwandte Muster

      7:38
    • 32. 08 Schlussfolgerungen

      2:20
    • 33. 01 Umriss

      2:17
    • 34. 02 DIP Definition

      3:30
    • 35. 03 Dependencies 01

      4:12
    • 36. 04 Volatile und stabile Dependencies

      2:53
    • 37. 05 IoC und Definitions

      3:18
    • 38. 06 DIP Violation

      2:25
    • 39. 07 Refactor: eines besseren Designs mit der a

      8:12
    • 40. 08 DI

      5:54
    • 41. 09 architektonische Implikationen

      5:24
    • 42. 10 reinen DI und IoC

      4:31
    • 43. 11 Erstellung eines einfachen a

      3:55
    • 44. 12 Demo einer echten World App wurde mit einem a erstellt

      10:27
    • 45. 13 häufige Geräte von Smells

      2:11
    • 46. 14 Schlussfolgerungen

      2:15
    • 47. 01 Umriss

      2:17
    • 48. 02 DRY

      9:50
    • 49. 03 KISS

      7:37
    • 50. 04 YAGNI

      11:42
    • 51. 05 SoC

      4:28
    • 52. 06 CQS

      2:14
    • 53. 07 Gesetz der Demeter

      7:01
    • 54. 08 PoLA

      3:03
    • 55. 09 Einkapselung

      5:58
    • 56. 10 API

      14:28
    • 57. 11 SOLID VS YAGNI

      2:58
    • 58. 12 OCP VS YAGNI

      2:48
    • 59. 13 SRP und ISP

      1:47
    • 60. 14 Architektur und Design

      4:56
    • 61. 15 Schlussfolgerungen

      4:23
  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Alle Niveaus

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

279

Teilnehmer:innen

--

Projekte

Über diesen Kurs

Der Kurs nach dem Kurs

Keine Flecken, keine Überarbeitung und keine Luft Ich freue mich auf deine Zeit. Das Kursmaterial ist erfolg, doch auch sehr umfangreich. Alle wichtigen Konzepte werden behandelt. Besonders wichtige Themen werden im Bereich der Tiefe behandelt. Für absolute Anfänger:innen biete ich dir die Hilfe auf Skype absolut kostenlos, wenn du dich anforderst.

Nimm dir diesen Kurs und du wirst das will

SOLID ist ein Akronym, das für SRP, OCP, LSP, ISP und die DIP steht. Diese fünf Akronyms in ihrer Reihe stehen für:

  • Ein einziges Prinzip zur Verantwortung
  • Offene und geschlossene Prinzipien
  • Liskov Substitutionsprinzip
  • Interface Prinzipien
  • Die Dependency Inversion Prinzipien

In diesem Kurs lernst du, wie du die Meta- und SOLID-Prinzipien anwendest, damit deine Anwendung ein langweiliges Leben wird Das bedeutet, du wirst den Code der hohen Qualität schreiben: lesbar, verständlich und zuverlässig

Verbessere dein Wissen in der objektorientierten Programmierung

  • Die meta auf den anderen Entwicklungsprinzipien basieren
  • Die Symptome von symptoms verstehen
  • Die Grundlagen der SOLID-Prinzipien lernen
  • Lerne, wie du die Verrückungen von SOLID-Prinzipien erkennst und wie du die Probleme beheben kannst.
  • Lerne, wie die meta und SOLID-Prinzipien zueinander zusammenhängen und wie du die Balance zwischen ihnen findest.

Grundlagen des Schreibens objektorientierter Code

Obwohl C# ein sehr reiches Thema Sprachgebrauch ist, ist es sehr häufig zu viele Anwendungen in einer echten Welt zu sehen. Sprache selbst garantiert nicht, dass die Architektur einer Anwendung großartig ist. Um die Entwicklung von maintainable Software zu entwerfen und zu entwickeln, müssen wir die Prinzipien der Softwareentwicklung verstehen. In diesem video geht es genau darum, wie du eine saubere und maintainable Software erzielen kannst.

Du hast wahrscheinlich schon die folgende bekannte Anweisung: die meisten well-known In diesem Kurs geht es darum, wie du Code herstellst, die du nicht st.

Die Fähigkeiten zur Erstellung von gut gestalteten und eingesetzten Typen ist die Grundlage, um dich als anständiges professionelles professionelle Anwender zu behandeln.

Inhalte und Übersicht

Dieser Kurs richtet sich an die Mitte und die hochrangigen Entwickler:innen. Mach dir solide Erfahrungen in C# erforderlich.

Es gibt viele Codebeispiele in diesem Kurs und du lernst sowohl sowohl eine theoretische als auch praktische Materialien.

Mit den SOLID-Prinzipien gehen wir noch die principles durch. Die SOLID-Prinzipien lernst du auch die verwandten Muster kennen. Dann werden wir das Problem von Widersprüchen zwischen verschiedenen Prinzipien eingehen. Du lernst die Beziehungen zwischen SOLID-Prinzipien und principles kennen.

Im Allgemeinen lernst du in diesem Kurs Folgendes mit:

  • SRP
  • OCP
  • LSP
  • ISP
  • T-P

Das sind die SOLID-Prinzipien. Du lernst die background die du durch ein besonderes Prinzip lösen kannst, die Vorführungen im Code zu sehen, du lernst die verwandten Muster zu jedem Prinzip.

DIP lernst du außerdem das Thema Dependency Injection, Invertierende der Injection, die IoC-Containers und was die architektonischen Auswirkungen von DI.

Hier sind andere Themen, die du im Kurs lernst:

  • TROCKNE – Wiederhole dich nicht in der Hand
  • KISS – halte dich einfach stupid
  • YAGNI – Du brauchst es nicht
  • SoC – Trennung von Bedenken
  • CQS – die Trennung von Befehlen von Abfragen
  • Gesetz der Law
  • Prinzip von kleinsten Erstaunen
  • Informationen ausgehenden und Einkapselung
  • Prinzipien der API-Entwicklung
  • Contradiction zwischen SOLID und YAGNI
  • Kontradiktion zwischen OCP und YAGNI
  • Was ist Architektur und Design

Wie lange dauert: Der Kurs ist etwa 4,5 Stunden. Alle Video-Vorlesungen. Du kannst alle im Kurs verwendeten Folien und slides herunterladen können.

------------------------------------------------------------

Keywords, die mit dem Kurs zusammengeht:

  • Software-Architektur
  • Software-Design
  • SOLIde Prinzipien
  • SRP, OCP, LSP, ISP, DIP

Triff deine:n Kursleiter:in

Teacher Profile Image

Elias Spock

Chance favors the prepared mind.

Kursleiter:in

I'm thankful enough for that I love what I do.
I began my career as a postgraduate student participating in Microsoft ImagineCup contest.
I've been working with .NET platform since 2003. I've been professionally architecting and implementing software for nearly 7 years, primarily based on the .NET platform. I'm passionate about building rich and powerful applications using modern technologies. 
I'm a certified specialist in Windows Applications and Service Communication Applications by Microsoft.
I'm one of the coordinators of the MSK.NET User Group in Moscow.

"If it's work, we try to do less. If it's art, we try to do more." - Seth Godin.

What I can say is that software is my art.

Vollständiges Profil ansehen

Kursbewertungen

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%
Bewertungsarchiv

Im Oktober 2018 haben wir unser Bewertungssystem aktualisiert, um das Verfahren unserer Feedback-Erhebung zu verbessern. Nachfolgend die Bewertungen, die vor diesem Update verfasst wurden.

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen bei Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. 00 Promo: Hi. Willkommen bei der Kurssoftware, Architekturen, Materie und soliden Prinzipien. Ich bin Lass uns einen K Verletzungsfunken von Verletzungen Park Dot com setzen, und sie lassen dich für den Kurs. Ich begann meine Karriere. Eine angeblich abgestufte Studenten, die an Microsoft Imagine Cop Wettbewerb teilnehmen. Ich arbeite seit 2003 mit Dr. Left. Ich bin seit fast sieben Jahren ein professioneller Architekt für die Implementierung von Software, hauptsächlich basierend auf der DOT-Netzplattform. Ich bin leidenschaftlich für den Aufbau von Reichweite und leistungsstarken Anwendungen mit modernen Technologien. Ich bin ein zertifizierter Spezialist für Windows-Anwendungen auf Dienstkommunikationsanwendungen von Microsoft. Und hier ist mein Lehransatz. Kein Grundstück, kein Schimpfen, kein Schlagen des Luft-Eis-Teams deine Zeit. Das Kursmaterial ist 16 aber umfassend. Volle wichtige Konstanten werden abgedeckt. Besonders wichtig. Themen werden für absolute Anfänger ausführlich behandelt. Ich habe meine Hilfe auf Skype absolut kostenlos angeboten, wenn gewünscht. Nehmen Sie diesen Kurs und Sie werden seine fünf gesetzt. Solar ist eine Abkürzung, die für S R. P o c p, L S P und D E F e. Weitere fünf Konitz Diese fünf Verbrechen wiederum stehen für das Prinzip der Einzelverantwortung . Offene geschlossene Principal Lisk des Substitutionsprinzips im Schlepptau. Face-Segregationsprinzip und Abhängigkeit. Inferenz invertieren. In diesen Gerichten lernen Sie, wie man solide und Meta-Prinzipien fliegt, so dass Ihre Anwendung wird ein langes, gesundes Leben leben . Es bedeutet, dass Sie lernen werden, wie man Code von hoher Qualität zu schreiben, lesbar auf dem Standard und zuverlässig. Verbessern Sie Ihr Wissen in objektorientierten Programmen. Verstehen Sie sie an den Prinzipien, auf denen, auf der anderen Entwicklung Hauptbeginn basiert. Ich verstehe die Symptome von Goldfehlern. Gelernte Grundlagen solider Prinzipien. Erfahren Sie, wie Sie Verstöße gegen solide Prinzipien erkennen und wie Sie die Probleme beheben können. Erfahren Sie, wie Metaprinzipien und Sony-Prinzipien miteinander in Beziehung stehen und wie Sie die Balance zwischen finden . Trotz der Tatsache, dass See Shop ist eine sehr Region verfügt über Sprache, es ist sehr üblich, schlecht gestaltete und implementierte Anwendungen in der realen Welt zu sehen. Programmiersprache selbst garantiert nicht, dass die architektonischen Anwendungen großartig sein werden . Um wartbare Software zu entwerfen und zu erstellen, müssen wir die Prinzipien der Softwareentwicklung verstehen. Das Video natürlich genau darüber, ist natürlich genau darüber,wie man saubere und wartbare Software erreichen kann, die Sie wahrscheinlich bereits mit folgenden weltbekannten Aussagen verletzt haben. Die meisten gehen Sox gut, sein Kurs ist alles darüber, wie man Code produziert , der nicht saugt. Wahl Entschuldigung der Produktion und gut gestaltete und gut umgesetzte Zeiten ist die Voraussetzung für die anderen Entwickler, um Sie als einen anständigen Profi zu behandeln. Dieser Kurs richtet sich an Middle und Senior Entwickler. - Natürlich. Etwas Erfahrung. Siehe Shop ist erforderlich. Wenn Sie ein Junior-Programmierer sind, dann würde ich sagen, dass Sie eine geringste Gesundheit des Jahres der realen Welt Erfahrung in der Unternehmensentwicklung haben müssen . Wenn Sie nicht wissen, wie Sie in Visual Studio arbeiten, ist dieser Kurs nicht für Sie. Noch. Es gibt viele gute Beispiele während des gesamten Diskurses, so dass Sie sowohl radikales Praxismaterial lernen . Beginnend mit einem soliden Geschäft. Wir werden weiter auf die Angelegenheit gehen. Prinz geht durch die solide bringt. Außerdem erfahren Sie mehr über die damit zusammenhängenden Themen. Dann werden wir auf das Problem von Widersprüchen zwischen verschiedenen Prinzipien kommen. Sie lernen, über die Beziehungen zwischen Sonnenabdrücken auf Metalldrucke im Allgemeinen, Sie lernen diesen Kurs fünf solide Prinzip srp Klatsch L S P. Ich spreche Tag. Dies sind die soliden Prinzipien. Sie lernen die Hintergrundprobleme, die nach einem bestimmten Prinzip gelöst werden können. Sie werden die Demonstrationen im Code sehen, Sie lernen, dass sie Präsenz auf jedes Prinzip beziehen lernen, dass Sie darüber hinaus gelernt haben, was Abhängigkeitsinjektion Inversion der Kontrolle ist. Ich sehe Container, wie man einen einfachen RC-Container baut. Und was sind die architektonischen Implikationen der Abhängigkeitsinjektion? Hier sind die anderen Themen, die Sie in diesem Kurs Trocken gelernt haben. Wiederholen Sie sich nicht. Der Rektor hält Rektor. Halten Sie es einfach. Dumme Hof New Principal U N 'll benötigt Socke Haupt Trennung von Anliegen Sick U. S. Befehl Abfrage Trennung Prinzipien das Gesetz aus dem Zähler und für das Prinzip der Liste Erstaunen, Informationen verstecken und Kapselung AP I Entwicklung Bring annehmen Widersprüche zwischen soliden und Yarden Widersprüche zwischen OCP und jungen Was ist Architektur und Design erhalten Sie Töne sind sehr wichtig, um Informationen in der Rolle zu kennen und beginnen, die solide und Metall zu lernen Prinzipien des Aufbaus von Softwaresystemen. 2. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 3. 02 SOLIDE Intro: Hallo, das ist Ingenieur Spark, und ich werde Sie durch den Kurs führen, bevor Sie untersuchen, was die soliden Prinzipien sind und wie man sie richtig anwenden kann. Wir müssen verstehen, warum wir sie überhaupt brauchen? Also, dass es bei den Prinzipalen darum geht, Software zu entwerfen, aber was ist entworfen? Wie definiert man die Design off-Software? Robert C. Martin, in seinem Buch A Child Principles, Patterns and Practices in C Shop, erklärte, dass das Design off Software Quellcode selbst ist. Modern Folder schrieb in seinem Blawg, dass Architektur die Form ist, die gehen nimmt. Warum ist das so, dass Ingenieure Dokumente erstellen, Blaupausen, die angeben, wie ein Produkt erstellt werden soll. Das einzige, was wirklich spezifiziert, wie Software funktioniert, ist der Quellcode. Sie können sagen, dass der Quellcode das Produkt ist, aber das Produkt ist das laufende Programm, nicht der Quellcode selbst. Sehen Sie sich das aus der folgenden Perspektive an. Was ist der Eingang für werkseitig ausgelagerte Leiterplatten? Spezielle Elektronik-Diagramme im Fall aus Software-Entwicklung für Have a Factory, das ist Gold Compiler, wir füttern es durch den Quellcode. Ein Compiler baut Software mit dem Quellcode, und dies führt zu interessanten Gedanken über Kosten, Modellierung von Bausoftware und, sagen wir Häuser. Wenn wir ein Haus bauen, ist es viel billiger, im Voraus ein gutes Design zu erstellen, anstatt ein ganzes Haus neu zu bauen. Wenn wir das Ergebnis nicht mögen, ist es einfach nicht möglich, jedes Mal ein Haus wieder aufzubauen. Ergebnis gefällt uns nicht. Das Gegenteil können wir über die Softwareentwicklung sagen. Wir können Bine Widder in einer Minute bauen. Grob gesagt ist das große Vorabdesign für den Fall, dass die Softwareentwicklung viel teurer ist, als eine Skizze zu zeichnen , die Software zu erstellen und sie dann auf dem Weg zu optimieren. Der Softwareentwicklungsprozess ist etwas einzigartig ,weil wir bei der Durchführung eines großen Vorabentwurfs , tatsächlich nicht garantieren können, dass wir alle möglichen Anforderungen berücksichtigen. Die Software ist die flüssige Substanz, und Anforderungen neigen dazu, sehr schnell zu ändern, weil von einer solchen flüssigen , unsicheren Natur von Software-Anforderungen, müssen wir ständig halten das Design so sauber wie möglich, sagen sauber. Ich meine, diese wartbar, wie wir können, um zu bestimmen, wo der Quellcode ist sauber oder nicht, wir müssen aus der Wissenschaft der Designer verrotten Entwickler markieren beziehen sich auf solche Wissenschaft. Das ist Design-Gerüche. Wir können fünf große Design markieren, Gerüche, Steifigkeit, Französisch il ity, Immobilität, Viskosität und unnötige Komplexität. Definieren wir sie eins nach dem anderen. Die Software ist Region. Wenn die Kosten für eine einzelne Änderung ist sehr hoch, wenn etwas sehr einfaches dauert viele Stunden zu implementieren, als die Software Region. Um dieses Problem zu beheben, müssen Sie die Software möglicherweise neu entwerfen. Die primäre Quelle der Steifigkeit ist die hohe Kopplung zwischen den Modulen. Wenn Module eng gekoppelt sind, ist es sehr schwierig, Änderungen mit Leichtigkeit einzuführen. Der weichere ist zerbrechlich, wenn kleine Änderungen in einem Modul Box-Aussehen in anderen, manchmal sogar nicht verwandten Modulen verursachen . Der Geruch wird auch oft durch schlecht gestaltete Beziehungen zwischen Modulen verursacht, Zehe überwinden Zerbrechlichkeit. Sie benötigen Toe Isolate Abhängigkeiten. Die Software ist im Modell, wenn ihre Komponenten nicht in anderen Systemen wiederverwendet werden können. Die meiste Zeit sollten wir in der Lage sein, eine Komponente ohne zu viel Aufwand zu extrahieren und sich für die Verwendung in einem anderen System anzupassen und was ist überrascht? Der Geruch wird höchstwahrscheinlich durch eine enge Kopplung zwischen den Komponenten verursacht. Um diesen Geruch zu überwinden, müssen Sie Komponenten gut entkoppeln. Je weicher ist viskos, wenn ein einzelnes Feature hinzugefügt wird, der Umgang mit Tonnen von Aspekten hervorruft, einschließlich Transport , Schicht, Sicherheitsmarshalling und dergleichen. In der Praxis können Sie auch den Geruch erkennen, indem Sie Herz beobachten, um Hühner, Checkouts und Zusammenführungen durchzuführen . Und höchstwahrscheinlich ist der Hauptgrund für den Geruch eine enge Kopplung zwischen Komponenten. Je weicher ist unnötig komplex, wenn Entwickler ständig versuchen, die Zukunft zu prognostizieren . Im Vorgriff auf bevorstehende Änderungen, die Einführung übermäßiger Punkte von Erweiterungsentwicklern sollten sich auf die aktuellen Anforderungen konzentrieren . Sie sollten die geschmeidige Architektur konstruieren, die Band kann, um neuen Anforderungen gerecht zu werden . Überschrift nicht erforderlich. Punkte aus der Erweiterung noch ist eine schlechte Praxis, die zu einer dieser Komplexität führt. Haben Sie bemerkt, dass fast alle Gerüche im Zusammenhang mit Bettenabhängigkeiten Management stehen. Der Hauptunterschied zwischen objektorientierten und nicht objektorientierten Sprachen besteht darin, dass andere Sprachen die Abschaltung dynamischer Dispatch nutzen können Durch die Verwendung virtueller Funktionen und Schnittstellen können wir die Abhängigkeiten invertieren in o Sprachen. Wenn wir einen Anruf tätigen, wissen wir nicht, welches Objekt diesen Aufruf verarbeiten wird. Dies liegt an Polymorphismus oder dynamischem Dispatch. Der Schlüssel zum Erreichen einer guten Architektur besteht also darin, die Abhängigkeiten gut zu verwalten. Und hier erreichen wir den Punkt, an dem wir bereit sind, über solide Prinzipien zu sprechen. Solide Prinzipien sind fünf Prinzipien, die als Abhängigkeitsmanagement-Prinzipien bezeichnet werden können . Es gibt alles über Beziehungen und Operationen zwischen Objekten. In diesem Band werden wir tief in die soliden Prinzipien eintauchen. Die solide Akronym wurde zuerst von Robert Martin eingeführt. Ein k Onkel gekauft Solid impliziert fünf Prinzipien von Software-Entwicklung, SRP Single Responsibility Prinzip. Sei auch offen. Geschlossenes Prinzip ist das Risiko des Substitutionsprinzips. Ich spreche ins Gesicht Segregationsprinzip und das i p Abhängigkeitsinversionsprinzip. Menü dieser Prinzipien basieren auf der klassischen Arbeit von Bertrand Meyer. Wir werden alle Prinzipien eins nach dem anderen diskutieren, Beispiele aus schlechtem Design betrachten und wie man es beheben kann. Anwendung eines geeigneten Prinzips. Wir werden auch den Unterschied zwischen Myers und Martins Definitionen von einigen Prinzipien bemerken. Was ist auch wichtig für ein tiefes Verständnis? Was ich auch betonen möchte, ist, dass solide Prinzipien an keine Technologie gebunden sind. Sie können sie in jeder Programmiersprache in Job zum Beispiel anwenden. Ein weiterer Punkt ist, dass solide kein Ziel für sich ist. Die Sache ist, dass voll solider Code ein Oxymoron ist. Es ist unmöglich, Software zu schreiben, die solide in jeder einzelnen Zeile bestätigt. Es ist unmöglich, das solide Nous von der Codebasis zu messen. Solide sind die fünf Prinzipien, die uns helfen, bessere Software zu schaffen. Sie beinhalten viel Philosophie, und man könnte denken, dass das schlecht ist. Nun, man kann es als Boden behandeln, aber eigentlich ist es nicht. Es ist sehr wichtig, diese Philosophie des Designs weicher zu fühlen, um ein besserer Entwickler zu werden . Und in diesem Kurs werden Sie sehen, dass alle Kompromisse Entwickler mit soliden Prinzipien konfrontiert . Sie werden die Philosophie des Entwurfs von Software spüren. Okay, Sie haben die üblichen Designgerüche gelernt und dass wir solide Prinzipien anwenden, um diese Gerüche zu entfernen . In der nächsten Vorlesung werden wir in solide Prinzipien eintauchen, beginnend mit dem Umriss aus dem Abschnitt SRP. 4. 03 Problem: das Prinzip der einheitlichen Verantwortung oder ein Sarpy kurz besagt, dass jedes Objekteine einzige Verantwortung habensollte eine einzige Verantwortung haben und dass die Verantwortung vollständig von der Klasse gekapselt werden sollte. Diese Definition stammt aus Wikipedia. Es ist sehr schwer zu verstehen. Was bedeutet das? Zum Beispiel sind die ersten 2 Fragen, die mir in den Sinn kommen, wie man diese Verantwortlichkeiten definiert und wie man die Anzahl der Verantwortlichkeiten aus einer bestimmten Klasse berechnet. Solche Definitionen sind aus praktischer Sicht nicht sehr hilfreich. Robert Martin, ein wichtiger Onkel Bob, verdeutlichte diese Definition, indem er sagte, dass es nie mehr als einen Grund geben sollte, eine Klasse zu ändern. Klingt viel klarer, obwohl es auch bedarf weiterer Klärung. Die Verantwortlichkeiten einer Klasse können als Zugriff aus Änderung behandelt werden. Es könnte einfacher sein, es als Zugriff auf sich ändernde Anforderungen zu verstehen, zum Beispiel in der Klasse implementiert, Protokollierung und Einlösung selbst. Dann hat es mindestens zwei Verantwortlichkeiten. Wir können auch die Verantwortlichkeiten einer Klasse aus der Perspektive von seinen Benutzern sehen, die ein p I seine Benutzer hat. Diese Benutzer sind die Quelle von Änderungen und verstehen, dass wir berechnen können, wie viele Überschusswechsel ein Glas hat. Zum Beispiel, wenn die Klasse sich mit einer Datenbank befasst, dann haben wir eine x von Änderungen, da DB Architects diejenigen Benutzer sind, die Änderungen anfordern können . Wenn das Glas auch Sellerie Berichte behandelt, dann müssen Sie überschüssige Szenen. Buchhalter sind diejenigen, die Änderungen an Berichten anfordern können. Je mehr Verantwortlichkeiten eine Klasse hat, desto wahrscheinlicher wird es geändert werden. also den SRB anwenden, wollen wir verschiedene Bedenken trennen. Eine Klasse sollte eine Sache tun und es gut machen. Übrigens kann das gleiche Prinzip auf der Ebene der Module angewendet werden. Module sollten nur eine logische Verantwortung haben, so dass der SRP auf verschiedenen Ebenen auf Funktionsebene, Objektebene und Modulebene angewendet werden kann . Manchmal stellen wir fest, dass SRP-Verstöße auf Funktionsebene ein Faktor aus verschiedenen Verantwortlichkeiten gegenüber Brillen waren , und dann trennen wir Brillen durch ihre Verantwortlichkeiten in verschiedene Module oder einen Anschein. Wenn Sie möchten, haben wir den SRP besprochen, aber Sie fragen sich vielleicht, wie das konkrete Problem im wirklichen Leben durch die SRP-Verletzung aussieht . Stellen Sie sich die Probleme vor, die durch die SRP-Verletzung verursacht werden. Hier haben wir eine Klasse. Sieh dir an, wie viele Verantwortlichkeiten es hat? Ich sehe mindestens vier Abhängigkeiten. Lasst uns sie zählen. Die allererste Methode, Charge genannt wird, ist für die Interaktion mit dem Bankterminal verantwortlich. Es sollte wissen, wie man ein Gerät richtig initialisiert und einen entsprechenden Befehl an es sendet. Die nächste Methode gold Bericht erstellen weiß, wie ein Bericht über die Zahlungstransaktion gerastet wird. Es weiß, wie man den ganzen Tag richtig formatiert. Berichte sind in der Regel so komplex, dass es zwei Verantwortlichkeiten verborgen werden können. Ein gesondertes Anliegen könnte der Prozess der Schaffung eines Flughafens sein, und das zweite ist die Formatierung selbst. Wenn der Prozess der Erstellung eines Objekts zu komplex ist, dann sehr oft behandelt wir als separate Sorge und wir drehten Zehe isolieren solche Verantwortlichkeiten durch Extrahieren beeinflussen er Klasse, die alle Details über die Erstellung von Berichten kennt. Die dritte Methode, genannt Bringt Report, weiß, wie man mit Druckertreiber umgeht und wie man Befehle an ihn sendet. Und schließlich ist die sichere Zahlungsmethode für die Interaktion mit einer Datenbank verantwortlich. Um alle Daten über eine Zahlungstransaktion zu speichern, haben wir oft eine versteckte Verantwortung. In solchen Fällen können wir diese Verantwortung Orchestrierung nennen. Wir brauchen oft ein High-Level-Objekt, das weiß, wie alle Verantwortlichkeiten miteinander zu integrieren. Stellen Sie sich nun vor, dass wir die Zahlung, Verarbeitung und Speicherung in einer Datenbank gleichzeitig ändern müssen . Zwei verschiedene Programmierer sind für diese beiden verschiedenen Teile des Systems verantwortlich. Leider rezitieren diese beiden verschiedenen Teile in der gleichen Klasse. Infolgedessen müssen diese beiden Programmierer dieselbe Klasse ändern, und dann müssen sie ihre Änderungen zusammenführen, um ein Einchecken abzuschließen. Abgesehen von diesem Problem, solche Gläser, die ein Kamel? Acht viele Verantwortlichkeiten sind schwer zu verstehen. Solche Gläser werden zu einem großen Schlammball. Eines Tages wird niemand verstehen, was zur Hölle auf dem Glas vor sich geht. Ein weiteres Problem ist, dass wir manchmal Änderungen in nur einer Verantwortung einführen müssen . Nehmen wir an, wir müssen die Zahlungsverarbeitung ändern, da mehrere Verantwortlichkeiten re Seite in den einzelnen Objektklassen, die sie darstellen, auch sehr kompiliert und neu bereitgestellt werden. Heutzutage scheint dieses Problem in den meisten Fällen überhaupt kein Problem zu sein. Aber zum Beispiel, wenn wir in C plus plus entwickeln, dann kann es einige Probleme verursachen. Am Ende. Die Sache ist, dass eine solche unvorsichtige Einstellung zum Abhängigkeitsmanagement zu einer langen Kompilierung führt Time C plus plus ist viel schwieriger zu kompilieren, so dass dieses Problem in solchen Fällen sehr wichtig ist. Wenn wir diese Abhängigkeiten in verschiedenen Modulen isoliert hätten, hätten wir nur ein Modul neu kompilieren müssen, das Modul, das geändert wurde, so ging als Harpien Verantwortlichkeiten verletzt. Beginnen Sie mit KAL acht miteinander. Was bedeutet, dass sie gekoppelt werden? Wir müssen uns bemühen, die gleichen Verantwortlichkeiten zusammenzubringen und voneinander zu trennen, die anderen. Wenn wir die gleichen Verantwortlichkeiten sammeln, versuchen wir, den so genannten hohen Zusammenhalt zu erreichen. Wenn wir verschiedene Verantwortlichkeiten trennen, versuchen wir, eine geringe Kopplung auf der Ebene der Funktionen zu erreichen. Kohäsion bedeutet, dass die folgenden eine Reihe von Funktionen und in Gesicht wird als zusammenhängend betrachtet. Wenn jede Funktion eng mit einer anderen verwandt ist, zeigt die Kopplung an, wie abhängige Module von den inneren Abläufen voneinander sind. Eng gekoppelte Module verlassen sich weitgehend auf den spezifischen Zustand voneinander, teilen Variablen und viele Typen. Lose gekoppelte Module sind ziemlich unabhängig. Sie haben ein paar gut benannte AP Augen und teilen eine begrenzte Menge aus oder gar keine Daten. Okay, schauen wir uns das Problem einer Sarpy-Verletzung in Visual Studio an einem anderen Beispiel an. 5. 04 Demo des Problems: Dieser Vortrag trägt den Titel Ellis Be Violation Demo. Betrachten wir ein klassisches Beispiel für Phyllis P. Verletzung. Ich liebe dieses Beispiel aus zwei Gründen. Die 1. 1 ist, dass es tatsächlich die L S P Verletzung demonstriert, und dieser Grund ist offensichtlich. Und der zweite Grund ist, dass es zeigt, dass objektorientierte Programmierung oft direkt die Beziehungen zwischen Objekten in der realen Welt in demselben Modell abbildenkann die Beziehungen zwischen Objekten in der realen Welt in demselben Modell abbilden . Eine große Anzahl von Entwicklern denken, dass das Schreiben von Code in Hopi Sprache, sie modellieren Luftwelt-Domain-Probleme. Und zum Teil ist das wahr. Aber die realen Beziehungen zwischen Objekten können manchmal direkt in Opie Sprache motil sein. Hier ist eine der naiven Hoffnungsaussagen Kinderbrille. Implementieren ist eine Beziehung mit basierenden Klassen. Zum Beispiel, Hund ist eine Tierkatze ist ein Tier, so können wir drei Klassen erstellen. Tier ist die Basisklasse, und die anderen beiden sind Erben. Leider funktioniert diese Art von Design manchmal nicht wie erwartet, und Sie werden dies in einer Minute sehen. Lassen Sie uns also die Beziehungen zwischen zwei riel Welt Vorstellungen im Code reflektieren. Wir wollen ein Rechteck und Quadrat in der Lage, ihre Flächen zu berechnen implementieren. Ich bin sicher, Sie werden mir zustimmen, dass auf dem echten Weltplatz ein Sonderfall aus Rechteck ist . Es ist andere, weil Quadrat ein Rechteck mit gleichen Seiten ist. Okay, wechseln wir zum Visual Studio. Lassen Sie uns ein Rechteck und Quadrat erstellen. Ich habe die Rechteck-Klasse erstellt, die zwei Eigenschaften mit und Höhe hat, und das Quadrat, das von ihrer Tangle Klasse erbt. Getrennt erstelle ich die Klasse, die für die Berechnung der Bereiche dieser Shapes verantwortlich ist. Sieht gut aus. Von der ersten Seite. Ich werde so tun, als wäre ich ein Kunde und ich möchte zwei Formen erstellen und ihre Flächen berechnen. Dafür werde ich die Hauptmethode implementieren, bei der alle Dinge passieren, die zuerst passieren werden, ich werde nur ein Rechteck mit gleich zwei erstellen und gleich fünf verstecken. Danach rufe ich die ST IC Cal korrekte Winkelmethode auf und erhalte das Ergebnis, und ich sende das Ergebnis auch an die Konsole. Jetzt möchte ich ein Quadrat erstellen. Warten Sie eine Minute. Was zur Hölle ist das? Wie ein Quadrat Seiten unterschiedlicher Länge enthalten kann. Ich werde das Programm nicht einmal ausführen, da es offensichtlich ist, dass etwas hier mit einem Stapel quadratischer Quadrat nicht stimmt, erlaubt es, unterschiedliche Länge auf Breite und Höhe einzustellen . Dieses Design verstößt eindeutig gegen die Liste der Substitution. Hauptquadrat ist nicht ersetzen Hable für Rechteck Rechteck implementiert die in Variante , die besagt, dass Breite und Höhe ausgeschaltet sein könnten. Different Land Square muss eine andere in Variante implementieren, die besagt, dass Breite und Höhe gleich sein müssen. Das habe ich absichtlich weggelassen. Eigentlich müssen sie auch größer oder gleich Null sein. Es gibt ein anderes Problem, das sich hier versteckt. Höchstwahrscheinlich müssten Sie Methoden erstellen, die Rechteck als Parameter verwenden und einige Geschäftslogik implementieren . Im Falle der Berechnung der Ära könnte eine solche Methode so aussehen. Diese Methode überprüft den Typ des akzeptierten Parameters und führt den entsprechenden Berechnungsalgorithmus aus. Was meinst du? Ist es eine gute Möglichkeit, Methoden auf der gesamten Codebasis zu definieren, die mit Rechtecken arbeiten müssen ? Ähnelt es dir nicht etwas, das wir vorher gesehen haben? Ja, das ist in der Tat ein Verstoß gegen das Prinzip der offenen Schließung. Diese Methode ist für Änderungen offen. Was passiert, wenn wir eine neue Form einführen? Richtig. Wir müssen das ändern. Das ist, welche Aussage dieses Beispiel der Gillespie-Verletzung ist eine versteckte Verletzung von OCP. In der nächsten Vorlesung werden wir uns ansehen, wie dieses Problem behoben 6. 05 Refactoring auf ein besseres Design: Offensichtlich müssen wir unmöglich machen, verschiedene Längen abseits für ein Quadrat zu setzen, um das Problem zu beheben . Moment sind die Erwartungen der Quadrate Clients gebrochen. Die Luft, eine Rechnerklasse zeigen nun, dass es ein Problem aus getrennten Daten und Verhalten . Die Berechnungsalgorithmen sind von den rechteckigen und quadratischen Gläsern getrennt, die die für Berechnungen erforderlichen Daten besitzen. Der Flächenrechner kann ohne Rechteck und Quadrat nicht existieren. Also, warum das Verhalten wurde weg von Rechteck und quadratischen Rechteck und Quadrat für jetzt verschoben, offensichtlich fehlt Kohäsion, um die Krankheit zu heilen, wo immer sollten richtige Abstraktionen konstruieren. Was wir verhindern wollen, ist die Geschäftslogik der Berechnung der Fläche. Jede Form verfügt über einen eigenen Algorithmus aus der Berechnung. Das Gebiet. Es ist viel besser, das Verhalten gemeinsam zu machen als Daten. Lassen Sie uns die Berechnungsflächenmethode durch die Einführung der I-förmigen Schnittstelle behindern. Ich möchte, dass das Rechteck und das Quadrat von der Augenform erben. Durch die Implementierung eigener Algorithmen definiert Square jetzt seine eigene Eigenschaft mit dem Namen side length. Jetzt kann ein Klient nicht missbrauchen. Es ist ein P I. Hier ist ein Beispiel für einen Client im Falle eines Rechtecks aufruft, um Fläche zu berechnen, Ein Client gibt den Bereich aus einem Rechteck, während im Falle eines Quadrats ein Client die Fläche eines Quadrats erhält. Der Kunde kann unterschiedliche Länge, Breite und Höhe auf ein Quadrat einstellen . Großartig. In der nächsten Vorlesung werden wir andere Wege aus ls Verletzung betrachten. 7. 06 weitere Beispiele von of: hier haben wir eine Methode namens Get Reppert im Körper. Wir können sehen, dass es einige statistische Daten sammelt, dann formatierte Strings erstellt und sie zusammengesetzt. Wie denkst du? Verstößt diese Methode gegen SRP? Mit dieser Methode verstößt eindeutig gegen die SRP. Es hat zwei Verantwortlichkeiten. Die erste 1, die die statistischen Daten sammelt und die zweite 1 ist die Formatierung. Junior-Programmierer machen die Formatierungsverantwortung mit Geschäftslogik sehr oft vom Kurs. Manchmal, wenn wir für 99% sicher sind, dass die Formatierung nie geändert wird und die andere Kälte nicht beeinträchtigt. Wir können solche Code-Städte verlassen, aber wahrscheinlicher wäre es besser, zumindest die Formatierung in eine separate Methode zu extrahieren. Schauen wir uns einen anderen Fall an. Hier haben wir die Fund-Alarmanlage. Es scannt durch serielle Ports und versucht, das Gerät zu finden. Und wenn es findet, setzt es einen globalen Zustand, indem der Alarm Eigenschaft verwendet werden kann. Wie denkst du? Verstößt diese Methode gegen den SRP? Aber diese Methode verstößt eindeutig gegen den SRP. Es macht ist, dass die Politik oder Geschäftslogik mit Mechanik erinnern, dass die Politik auf hohem Niveau von den niedrigen Details entkoppelt werden sollte, die wir es durch die Einführung einer speziellen Klasse, die für die Interaktion mit dem globalen Staat verantwortlich ist, wieder faktorieren könnte . Dieses Glas könnte Benachrichtigungen von Ereignissen oder auf andere geeignete Weise erhalten. Schauen wir uns den nächsten Fall an. Hier haben wir die Methode mit dem Namen zeichnen Rechteck. Es berechnet, wo ein Rechteck zu zeichnen ist, wählt dann einen Kühler aus und zeichnet das Rechteck, das es mit dieser Farbe fühlt. Wie denkst du? Verstößt diese Methode gegen den SRP? Dieser Fall ist schwieriger als frühere. Die vorherigen Beispiele zeigen sehr populäre Gerüche nach Verletzung des SRP. Hier ist es schwieriger, ihre Verantwortlichkeiten zu bestimmen. Die Anzahl der faktischen Verantwortlichkeiten hängt immer von den Benutzern, anderen Akteuren oder Benutzern ab, die an der Verwaltung der Farbe interessiert sein könnten. Wenn es solche Benutzer gibt, ist es vielleicht besser, die Verantwortung von der Auswahl eines Anrufers zu trennen. Eine separate interessante Frage ist, ob die Schöpfung oft Objekt selbst eine Verantwortung ist oder nicht. Wir werden diese Frage in diesem Abschnitt nicht beantworten. Wir werden es für den Abschnitt über D. I. P.behalten I. P. P. Am Ende möchte ich auch zumindest einige häufige SRP-Verstöße zuerst, indem Logik und Infrastruktur gemischt werden, wenn Geschäftslogik mit Ansichten oder einem Beharrlichkeit. Schichten Sie ein Glas oder ein Modul, dient verschiedenen Schichten, berechnet Einkommen und sendet E-Mails, Bar sagt XML und analysieren die Ergebnisse, bevor Sie weiter gehen. Ich möchte nur eine Funktion durchlaufen, mit der ich in der Praxis konfrontiert bin. Diese Funktion ist etwa 5000 Zeilen lang. Es besteht aus off switch case, und wenn Anweisungen, es stützt sich auf sie massiv. Dies ist ein wirklich höllisches und ein extremes Beispiel. Nicht-SRP-Verstoß. Ich wollte Ihnen dieses Beispiel nur zum Spaß zeigen. Die meisten Entwickler glauben mir nicht, wenn ich sage, dass ich eine solche Funktion gesehen habe. Solche Funktionen existieren nicht, und Entwickler, die solche Funktionen schreiben, existieren ebenfalls. Wie Sie sich vorstellen können, in der nächsten Vorlesung möchte ich in der nächsten Vorlesungein paar Worte zu entworfenen Mustern im Zusammenhang mit dem SRP sagen. 8. 07 SRP Verwandte Muster: Manchmal wenden wir den SRP auf Reflektor auseinander von einem System an, und wir haben am Ende viele kleine Klassen. Klienten von einem solchen A p. Ich kann mit dem Verständnis des ganzen Teils des Systems zu kämpfen, weil sie ihre Beziehungen zwischen all den Rauchgläsern verstehen müssen . Es ist nicht so schlimm, wie es sich anhört. Wie ich bereits gesagt habe, gibt es in solchen Fällen immer einen Kompromiss zwischen verschiedenen Lösungen. Daher kann Sockenmuster zur Rettung kommen. Es umhüllt all diese kleinen Brillen delegiert ihnen alle Verantwortlichkeiten. Es macht die Fassade nicht zu einem Übertreter aus der SRP. Die einzige Verantwortung aus einer solchen Fassade besteht darin, die vom Kunden geforderte Funktionalität zusammenzubringen . Es scheint, als würde es gegen dieses R P verstoßen, da wir die Verantwortung aus verschiedenen Schichten sehen, die sich im FBI vor der Fassade widerspiegeln . Aber wie gesagt, ist die Aggregierung der Funktionalität, die es ermöglicht, ein einzelnes Client-Problem zu lösen, nicht schlecht. Es vereinfacht den Interaktionsprozess mit dem System aus der Sicht des Kunden, und das ist alles. Nichts mehr so. Es gibt zwei Millionen Gründe für die Verwendung der Fassade. Bessere Bereitstellung für einen Client, ein einfaches A p I für die Interaktion mit einer Reihe von komplexen Objekten und für einen Kunden ein sauberes FBI für die Interaktion mit schlecht gestalteten A P I. Manchmal ist es viel einfacher, wenn Assad, anstatt einen schlecht entworfenen Teil von einem System neu zu schreiben. Und das ist, was der zweite Punkt von der SRP ist Perspektive. Wir interessieren uns für das Beispiel, das den ersten Grund für die bessere Nutzung der Fassade demonstriert. Hier sehen Sie ein Diagramm, das ein Beispiel für die Fassade zeigt. Besser. Sie können hier sehen, dass die Kauffassade Klasse von allen anderen Klassen abhängt, die sie enthält, oder, anderen Worten, alle diese Klassen umschließt. Die umschlossenen Entitäten müssen keine Klassen sein. Sie könnten auch Schnittstellen sein. Stellen Sie sich also vor, dass zunächst ein Kunde von all diesen Gläsern abhängig war. Wir haben die Fassade eingeführt, um den Umleitungsprozess mit dem System zu vereinfachen. Wenn ein Kunde von der Fassade abhängt, muss er nicht direkt mit vielen Klassen interagieren. Lassen Sie uns zu Visual Studio wechseln, wo ich dieses Beispiel im Code zeigen werde. Hier ist ein Beispiel. Nehmen wir an, wir haben einen Kunden, der unser System verwendet, um Waren aus dem Laden online zu verkaufen, so dass der Kundencode so aussieht. Es erstellt ein Kundenobjekt mit der ST-Ick-Methode. Finden Sie Kundenübergabe bedeuten, dass der Kunde i d. Danach erzeugt es eine Last durch den Zustand IQ. Finden Sie Methode aus der Aktienklasse, vorbei in der guten i D. Dann bekommt es die Informationen über die Kreditkarte des Kunden, erstellt das Bankgateway und ruft die Ladekarte Übergabe der erforderlichen Parameter. Ich wette, ein solcher Umleitungsprozess sieht in der Tat wie ein Spott aus. Es ist unsere Pflicht, einfach Leben von unseren Kunden abzulegen, damit wir eine Fassade erstellen können, die all diese Details vor der Bearbeitung eines Kaufs verbirgt , den ich hier erstellt habe. Die Fassadenklasse Kauf, die eine einzige Methode verfügbar macht. Diese Methode erfordert zwei ganzzahlige Parameter und verbirgt alle Details in ihrem Körper. Jetzt muss ein Kunde nicht über die ganze Brille wissen und wie er mit ihnen interagieren kann, welche Methoden er aufrufen soll. Das einzige, was der Kunde wissen sollte, ist, dass es einfach toll, wenn Assad und rief eine Methode, um das Ziel zu erreichen. Das ist alles. Es gibt viele Muster, die mit einem Sarpy Dekorateur verbunden sind und zusammengesetzte Schlafzimmer sind auch sehr eng mit ihren Sarpy verwandt, nach der Definition aus der Bande of Four Buch Composite-Muster erlaubt Objekte in Baumstrukturen, um Teile ganze Hierarchien darzustellen. Komposit-Schutzpatron. Lassen Sie uns einen Blick. Behandeln Sie einzelne Objekte und Kompositionen gleichmäßig von Objekten. Nach dem gleichen Buch. Das Decorator-Muster ermöglicht das Hinzufügen des Verhaltens zu einem einzelnen Objekt, entweder statisch oder dynamisch, ohne das Verhalten von anderen Objekten derselben Klasse zu beeinflussen. Das Decorator-Muster ist oft nützlich für die Einhaltung des einheitlichen Verantwortlichkeitsprinzips da es ermöglicht, Funktionalität zwischen Klassen mit einzigartigen Bereichen von Bedeutung zu teilen. Wir werden die Designpräsenz in diesem Kurs nicht tief diskutieren, daher kann ich Ihnen nur einige Quellen empfehlen, um es zu betrachten, um ein tieferes Verständnis der Designveteranen und ihrer Beziehung zu soliden Prinzipien zu erhalten . 9. 08 Schlussfolgerungen: Diese Vorlesung trägt den Titel Fazit. Das Prinzip, das wir in diesem Abschnitt diskutiert wurde, war die Schnittstelle Segregation Prinz oder ich spreche im Hemd, es s P hat eine einfache Definition. Clients sollten nicht gezwungen werden, sich von Methoden abhängig zu machen, die sie nicht verwenden. Diese Definition impliziert also, dass man große, kleine, zusammenhängende und fokussierte Schnittstellen anstreben kleine, muss. Natürlich können verschiedene Kunden nur eine Teilmenge von FBI-Mitgliedern verwenden, auf die sie angewiesen sind. Es sei denn, dass AP, Ich beginne zu wachsen Transformation in eine sehr fette Schnittstelle mit unabhängigen Mitgliedern zueinander , wo, wenn ähnliche, aber verschiedene Methoden scheinen, um die Anforderungen der verschiedenen Kunden zu erfüllen . Eine typische Art der Verletzung, die Sie gesehen haben, war, als eine Schnittstelle zu breit war. Was dazu geführt hat, dass einige Gerüche wie Implementierer nicht implementierte Ausnahme werfen oder Clients die ganze Masse in der Intelligenz sehen müssen , was sie tatsächlich verwenden müssen, wie wir besprochen haben , gibt es mehrere Möglichkeiten, mit mir umzugehen Verstöße. Manchmal reicht es gerade aus, eine separate Schnittstelle von einer fetten zu extrahieren und sie gegebenenfalls zu verwenden . Manchmal muss man mit einer Fassade herauskommen, die irrelevant verbirgt. Ap I Mitglieder. Manchmal müssen Sie ein Adaptermuster anwenden, besonders wenn Sie die fat-Schnittstelle nicht besitzen und daher den Quellcode nicht ändern können. Die intelligente Einhaltung des Schnittstellen-Segregationsprinzips macht eine Anwendung leichter zu pflegen, was besonders langfristig wertvoll ist . Wenn ich missbräuchlich spreche, können Sie mit Tönen enden. Off to small interface ist, was sie schwieriger macht, von alten Clients zu verwenden. Dies ist ein Geruch, der als Anti Ice bekannt ist. Sei so, dass wir das Ende dieses Abschnitts erreicht haben. Das war eine interessante Untersuchung. Aber es gibt ein anderes Prinzip, das auf uns wartet, das Abhängigkeitsinversionsprinzip. Der nächste Abschnitt ist dem D. I. P.gewidmet I. P. . 10. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 11. 02 OCP Definition: Diese Vorlesung trägt den Titel Problem Statement. Das zweite Prinzip, über das wir sprechen werden, ist das offene Close-Prinzip. Wenn wir uns Wikipedia ansehen, werden wir die folgende Definition sehen. Das Open-Close-Prinzip besagt, dass Software-Entitäten Brillen , Brillen, Module, , Brillen, Module, Funktionen usw. zur Erweiterung geöffnet, aber für Änderungen geschlossen sein sollten. Was es im Wesentlichen bedeutet, ist, dass wir, wenn wir eine Änderung einführen müssen, nicht tief in das System eingraben und sein Verhalten ändern sollten. Indem wir diese Enden von Klassen ändern, sollten wir in der Lage sein, eine Änderung einzuführen, indem wir Ihnen Code hinzufügen, nicht indem Sie die vorhandene Software ändern , was Änderungen durch die Einführung neuer Klassen ermöglicht, anstatt durch Ändern der vorhandenen Quelle -Code ist für die Erweiterung geöffnet und zur Änderung geschlossen. Wie man das Verhalten ändert, ohne die Codebasis zu ändern. Die Antwort ist einfach. Dynamischer Versand oder Pollen Mehr Gebühren können wir sehr geschmeidig erreichen, entworfen durch die Nutzung der Power Off objektorientierte Programmierung. In der Praxis bedeutet es, dass wir uns auf Abstraktionen anstatt auf konkrete oder direkte Implementierungen verlassen müssen , sogar Shop sehen. Wir würden uns auf Gesichter und abstrakte Gläser verlassen. OK, aber was ist das Problem mit dem Ändern des vorhandenen Codes? Warum müssen wir uns überhaupt an das offene, enge Prinzip halten ? Der erste Grund ist, dass es eine hohe Chance aus der Einführung Box während des Änderungsprozesses . Es ist viel einfacher zu betreten. Verwenden Sie einen Fehler, etwas ändern, das komplex ist und bereits vorhanden ist. Planen Sie, einen Fehler einzuführen, der neuen Code überträgt. Der zweite Grund ist irrelevant, und es ist fast immer relevant, wenn Sie versuchen, das Verhalten eines FBI zu ändern, das bereits von vielen Kunden verwendet wird. Die erste Gefahr hier verwendet, um das Verhalten von Clients erwartet zu ändern. Stellen Sie sich vor, dass es 1000 Clients einer Methode gibt, die im Falle eines Fehlers 100 zurückgibt und dass Kunden eine Vergütungslogik für diesen Fall haben. Stellen Sie sich vor, Sie haben dann das Verhalten der Methode geändert, von der dieser 1000 Clients abhängen. Die Konsequenzen sind dramatisch. Ich würde für den Entwickler beten, der sich entschieden hat, eine solche Änderung einzuführen, die den Code von 1000 Kunden bricht. Die zweite Gefahr besteht darin, die FBI-Signaturen zu ändern. Solche Modifikationen brechen sofort alle abhängigen Clients. Glauben Sie mir, Kunden werden sich nicht für solche Änderungen bedanken. übrigens auch Rippleeffekte verursachen, Unterbrechende Änderungen könnenübrigens auch Rippleeffekte verursachen,da Hunderte von Clients existieren können , die von anderen Clients abhängen, die von Ihrem Code abhängen. Das Ändern des Verhaltens durch Verzehr von Code entspricht tatsächlich dem, was Kunden denken, wenn sie nach neuen Funktionen fragen. Wenn Kunden nach einer neuen Funktion fragen, denken sie, dass Features hinzugefügt werden. Sie denken nicht, dass Entwickler etwas ändern werden. Die Idee mag auf den ersten Blick lächerlich erscheinen. In der Tat. Ist das möglich, Go zu schreiben, das nie wieder geändert wird? - Natürlich. Dies ist in der Praxis nicht möglich. Nun, theoretisch ist es möglich, den ganzen Code auf diese Weise zu schreiben, aber es ist nicht praktisch in der Programmierung. Wir setzen oft ideale Ziele, die jemals erreicht werden können, zum Beispiel, die versuchen, richtig Golden zu schreiben. Theoretisch können wir Code schreiben, dass Korrektheit abgeschaltet wird, der statisch verifiziert werden kann. Leider in 99% der Fälle, solcher Entwicklungsprozess ist so teuer, dass ich will, ist abgekappt Bull off investieren so viel Geld, ein weiterer Punkt, was offensichtlich ist. Aber ich muss erwähnen, dass wir den vorhandenen Code unbedingt ändern müssen, wenn er einen Fehler enthält . So ist die Rückfixierung aus der Sicht des offenen Close-Prinzips in Ordnung. Lassen Sie uns einen Schritt zurück und schauen in 1988 1988 ist das Jahr, in dem Bertrand Meyer OCP zum ersten Mal beschrieb , Meyer behandelt OCP ein wenig anders als Onkel Bob. OCP aus Marius Point of View, war wesentlich, ein Äquivalent zum geschützten Variationsmuster. Das schützende Variationsmuster bedeutet, dass die folgenden Punkte von vorhergesagter Streuung identifizieren und eine stabile Schnittstelle um sie herum erzeugen. hier über eine Schnittstelle sprechen, brauchen wir den C-Shop nicht in Face-Konstrukt. Ending to Face impliziert jede P. I. Eine Klasse hat eine eigene Schnittstelle, die durch ihre Öffentlichkeit dargestellt wird. A P I. Wir können hier einen subtilen Unterschied zwischen den Definitionen des Mars und Martins bemerken. Myers Definition ist mehr über die Abwärtskompatibilität auf der A-P-R-Ebene. Wenn Änderungen die Abwärtskompatibilität jedoch nicht unterbrechen , ist sippy Matt. Wann genau können wir das Verhalten der Änderung der Schnittstelle ändern müssen. zum Beispiel ein neuer Client erscheint, Wennzum Beispiel ein neuer Client erscheint,der ein sehr ähnliches , aber ein wenig anderes Verhalten erfordert, ist der letzte Punkt, den ich ansprechen möchte, das Single-Choice-Prinzip, das eng mit dem Open-Close-Prinzip verwandt ist . Ich ziehe es vor, dieses Prinzip das Single-Source-Prinzip zu nennen und Sie verstehen , warum in Kürze , Lassen Sie uns den Fall vorstellen, wenn wir entscheiden müssen, welcher Implementierer erstellt werden soll. Abhängig von einem Argument zur Lösung solcher Probleme verlassen wir uns oft besser auf die Fabrik. Hier ist ein Beispiel. Wie Sie hier sehen, haben wir eine Faktor-Methode, die einen Parameter aus Geplänkel nimmt. Nall Modell in Bewunderung. Abhängig von diesem Parameter erzeugt die Faktormethode eine entsprechende Implementierung aus der I ban Terminalschnittstelle. Verstößt diese Faktormethode gegen das offene Close-Prinzip? Natürlich tut es das. Wenn wir eine neue Implementierung von der Eye Bank Terminal-Schnittstelle ausrollen, werden wir dieses Gold ändern, indem wir in britischer Erklärung hinzufügen, Wie können wir das Problem lösen? Unter Einhaltung des offenen Close-Prinzips können wir eine Fabrik der Bankterminalfabrik schaffen, die aber diesen Faktor dieser Fabrik irgendwo schaffen. Am Ende müssen wir die entsprechende Implementierung auswählen und die Instanz erstellen. Wir können das Problem teilweise lösen, indem wir einen eisigen Behälter einführen, aber das wird nur das Problem bewegen. Es löst das Problem nicht vollständig, wenn Sie mit dem Begriff der Abhängigkeitsinjektion nicht vertraut sind und ich Container als Nebennotiz gesehen habe, würde ich Ihnen Bücher empfehlen. Die 1. 1 ist aus der Back Bob Library, die als Mastering Inject for Dependency Injection und eine andere, die ein absoluter Bestseller von Mark Semen Dependency Injection in dot net geschrieben ist. Also klingt der Principal off single choice so. Wann immer Softwaresystem einen Satz von Alternativen unterstützen muss, ein und nur ein Modul im System sollte ihre erschöpfende Liste kennen. Ja, wir verletzen diese Sippy, indem wir eine solche Implementierung der Faktormethode haben. Aber es gibt keinen Sinn zu versuchen, den Klatsch mit irgendwelchen Mitteln weiter zu treiben. Wir sollten verstehen, dass in solchen Fällen alles, was wir brauchen, eine solche Verantwortung in einem einzigen Modul zu isolieren, und nur dieses Modul sollte im Falle der Einführung neuer Implementierungen geändert werden. Okay, schauen wir uns das Problem der Klatschverletzung an und wie man es in unserem geliebten Visual Studio repariert . 12. 03 Demo des Problems: Dieser Vortrag trägt den Titel Ice Be Verletzung Dama eins. Ich möchte Ihnen Ariel Fall aus meiner Praxis zeigen, die mit dem Problem aus in Gesicht Segregation verwandt war. Ich habe viel mit Geräten gearbeitet, und sobald ich den folgenden Fall vor der Gewährung konfrontiert, möchte ich sagen, dass ich Studenten gerne Beispiele geben möchte, die das ganze Bild der Luftwelt Fall widerspiegeln . Also werde ich alle Details im Zusammenhang mit dem Problem beschreiben, weil ich denke, dass dies hilft, das Material viel besser zu verstehen. Auf der obersten Ebene haben wir also eine monolithische WBF-Anwendung, die an Point-Off-Service-Terminals funktioniert. Diese Terminals ermöglichen es den Menschen, Fahrkarten in S-Bahnen zu kaufen. Diese Anwendung ermöglicht es Benutzern, Tickets über Kreditkarten zu kaufen. So muss die Anwendung mit Bankterminals arbeiten. Irgendwie aus geschäftlichen Gründen mehrere Bank-Terminal-Modelle, gab esaus geschäftlichen Gründen mehrere Bank-Terminal-Modelle,die in das Passieren von Terminals integriert wurden, so dass sie alle unterstützt werden mussten. Die Interpretation mit Bankterminals ist nicht direkt. Ban Terminal-Hersteller stellen ihre eigenen Anwendungen zur Verfügung, über die unsere Anwendung mit ihren Bankterminals arbeiten kann . Ihre Anwendungen werden wie kommen Server implementiert. Wenn Sie nicht wissen, was ein COM-Server ist, denken Sie es einfach als eigenständigen ausführbaren Dienst an. Das Diagramm spiegelt den Ablauf der Vorgänge wider. Schauen wir uns den Code an. Es gibt das bloße Minimum Off-Operationen, die von jedem möglichen Bankterminal unterstützt werden. Deshalb habe ich die Eye Bank Terminal-Schnittstelle definiert, die die B I von Diensten widerspiegelt, die Inter direkt mit Bankterminals arbeiten . Jetzt habe ich drei Implementierungen von der Eye Bank Terminal Schnittstelle, Zap Terminal, sein eigenes Terminal und PDQ-Terminal. Ich bin in die Rial-Implementierung eingetragen, da es das Beispiel zu sehr erschweren würde. Und es gibt keine Bedeutung, Ihnen die Eingeweide und Low-Level-Details zu zeigen. Und jetzt werde ich das Problem beschreiben, das entstanden ist. Die Sache ist, dass Bankterminals anders sind. Das einige Terminal ist eine Black-Box-Lösung, die physisch eine Box ist, die alleine mit Kreditkartenrückständen arbeitet . Großartige Ausweis-Lesegeräte sind jene Geräte, die Ihre Karte akzeptieren , die billige oder einen Magnetstreifen lesen und die Rückkarte an Sie zurückgeben. Also sein eigenes Terminal nicht belichtet Kerl für Inter Betrieb mit Kartenlesern, weil die Service-Anwendung automatisch alte und Zubehör Dinge aufstellt Zur gleichen Zeit, die anderen beiden Bankterminals, PDQ Terminal und Zap Terminal nicht die Verantwortung für Inter Parade mit Kartenlesern automatisch übernehmen. Im Gegenteil, sie übertragen diese Verantwortung an einen Kunden, indem sie ein P I für die Interparade mit Kartenlesern aussetzen. Im ersten Fall muss unsere Anwendung überhaupt nichts tun. Während in den anderen beiden Fällen sind Anwendung hat ein Fenster zu zeigen Terminal-Wartungstechniker , um die Möglichkeit, die Bank-Terminal-Geräte richtig einzurichten. Sehen wir uns die Ansichtsmodellklasse an, die ein Moderator für dieses Fenster ist, dem Wartungstechniker die Geräte der Bankterminals einrichten können. Das Fenster verfügt über vier Tasten, denen getestet werden kann, ob sich der Kontakt oder der Kontakt mit den Lesern in einem bestimmten Port befinden. Und um sie zu finden, indem Sie alle verfügbaren Ports im System scannen, müssen wir die Kartenleser Communicator Ihrer Modelle, Constructor Independence übergeben, Constructor Independence übergeben, die in der Lage ist, zu testen und nach Kartenlesern auf Ports zu suchen. Fragen Sie sich jetzt, was würden Sie tun, um das Problem zu lösen? Die einfachen Möglichkeiten, Methodensignaturen direkt in das Eye Bank Terminal hinzuzufügen? Lassen Sie uns das tun und schauen, was passieren wird. Okay, da wir drei Implementierer Z haben, wenn Sie die nur ein Prime-Mitglied bearbeiten, - huh ? Was wir hier tun werden Zone Terminal Service bietet nicht in einem Schrei für Kommunikation mit Kartenlesern scheinbar, wir müssen werfen, nicht unterstützte Ausnahmen von den implementierten Mitgliedern. Erinnert dich dieser Fall nicht an etwas? Etwas, das wir im vorherigen Abschnitt gesehen haben? - Natürlich. Dies ist ein Verstoß aus der Liste des Substitutionsprinzips. Aber worüber wir reden, ist der Interface-Segregation-Prinzipal, nicht wahr? Ja, das sind wir. Die Sache ist, dass, wie ich Ihnen vorhin gesagt habe, alle Prinzipien miteinander verbunden sind. Manchmal haben sie versteckte Beziehungen. In diesem speziellen Fall enden wir mit ihrer wispy Verletzung als Folge, off ice Verstoß sein, wenn wir bei der aktuellen Lösung bleiben und wir die ibon Terminal Schnittstelle als Parameter vom Kartenleser Communicator von Ihren Modellkonstruktor. Eines Tages wird jemand das Zonen-Terminal in den Konstruktor übergeben, und dann erhält der Benutzer eine Ausnahme, nachdem er auf die Schaltfläche „Testing“ oder „Suchen“ im Fenster geklickt hat. Wenn wir also solche unglücklichen Ereignisse vermeiden wollen, müssen wir die Tatsache anerkennen, dass die Schnittstelle der Augenbank zu fett ist. Es enthält übermäßige AP I-Mitglieder. OK, in der nächsten Vorlesung werden wir das Problem schnell reflektieren. 13. 04 Refactor: Eine Verbesserung von einem besseren Design: in der vorherigen Vorlesung wurden geschlossen, dass das Auge Bank Oberst Schnittstelle zu fett ist, die Krippe und Doppel-Sir. Factoring-Technik, die normalerweise für die Einhaltung der SP gelten wird, besteht darin, dass wir kleine, isolierte Schnittstellen schaffen, die genau definierte konkrete Verantwortlichkeiten darstellen. In diesem speziellen Fall müssen wir die Verantwortung für die Inter, die mit Kartenlesern arbeitet, trennen . Also werde ich das tun. Jetzt. Wir sollten diese neue Schnittstelle unserer beiden Modelle außerhalb des Bank-Terminals implementieren, die tatsächlich mit Kartenlesern arbeiten können. PDQ-Terminal implementiert bereits dieses Interface und Zip-Terminal. Großartig. Jetzt können wir die i Kartenleser Community-Kabel in Gesicht in den Ansichtsmodellen benötigen. Konstruktor. Großartig. Es besteht keine Chance mehr, dass jemand eine unangemessene Instanz passieren wird, die nicht mit Kartenlesern arbeiten kann . Und übrigens, jetzt ist es viel verständlicher, was ein Hauptmitglied hier zu verwenden. Da wir hier eine Einzweck-Schnittstelle haben, sollte diese Ansicht als Client außerhalb der Schnittstelle nicht durch übermäßige AP I-Mitglieder des Eye Bank-Terminals gestört werden , die ihre Rolle ausdenken. Jetzt steht alles in seinen Regalen. Durch das Spielen des SP erreichen wir die geringe Kopplung zwischen Methoden, die durch ihre Bedeutung unterschiedlich sind, und so erreichen wir einen hohen Zusammenhalt zwischen ihnen in getrennten Schnittstellen. In der nächsten Vorlesung werden wir uns einen weiteren Fall einer feisty Verletzung ansehen. 14. 05 OCP Verwandte Muster: Dieser Vortrag trägt den Titel O. C. B. Verwandte Muster. Die beiden häufig verwendeten Muster entworfen, um die O. C. P.R. Vorlage, Methode und Strategie zu halten C. P.R . Vorlage, . Verdammte Plett Methode und Strategie sind die sogenannten Verhaltensmuster. Die Template-Methode ist ein Veteran, den wir noch nicht besprochen haben. Das Template-Methodenmuster ist in solchen Szenarien nützlich, wenn es einen Algorithmus gibt, und ein kleiner Teil dieses Algorithmus kann sehr wieder vorher. Definiert Template-Methode Muster s definieren dieses Skelett oft Algorithmus in einer Operation verzögert einige Schritte auf Sub-Brille. Template-Methode. Lassen Sie uns Unterklassen bestimmte Schritte neu definieren, oft Algorithmen, ohne die Algorithmenstruktur zu ändern. Schauen wir uns das einfache Beispiel im Code an. Hier haben Sie eine abstrakte basierte Klasse, die den Algorithmus der Verarbeitung von Transaktionen definiert . Der Algorithmus besteht aus drei Schritten. Geld abheben, Bonus berechnen und Grüße senden. Danach müssen wir Erben, die diesen Algorithmus implementieren. Dieses Muster ermöglicht es, einen Algorithmus in der Basisklasse zu deklarieren undeinen Erweiterungspunkt zu erstellen, einen Erweiterungspunkt zu erstellen, da wir so viele Implementierungen von diesem Algorithmus implementieren können, wie wir wollen. Die Vorlage besser und kann mit einer Standardimplementierung aus algorithmischen Schritten in der Elternklasse implementiert werden , indem das abstrakte G Wort aus der Klassendeklaration entfernt und Methoden virtuell statt abstrakt gemacht werden. Eigentlich können wir eine Standardimplementierung codieren, indem wir die Elternklasse abstrakt halten, indem wir algorithmische Methoden intra virtuell anstelle von abstrakt drehen . Wir sind nicht verpflichtet, die AB gesichert aus der Klassendeklaration zu entfernen, um eine Standardimplementierung zu haben . Das Template-Methodenmuster erstellt einen Erweiterungspunkt für die Implementierung verschiedener Algorithmen. So können Sie sich an den Klatsch halten. In solchen Fällen. Schauen wir uns das Diagramm des Strategiemusters an. Dieses Diagramm zeigt, wie wir einen Sorter mit einem Strategiemuster implementieren können. Der Sortierer nimmt die Strategie eine Schnittstelle, die die Sortiermethode definiert. Es gibt drei Implementierungen von dieser Schnittstelle. Die 1. 1 implementiert Bubble Sortierung, die zweite schnelle Sortierung und die letzte Auswahlsortierung. Der Client-Code verwendet die Sortierung und sollte entscheiden, welche Strategien zum Sortieren verwendet werden sollen . Wir werden keine Ting-Beispiele im Code suchen, da wir bereits gesehen haben, wie wir das Strategiemuster verwenden könnten, um Implementierungen auszuschalten , ich kann mit Bargeld arbeiten oder ich kann mit einer Kreditkarte in Gesichter in diesem R bezahlen P-Abschnitt. Hier ist also die Definition des Strategiemusters. Das Strategiemuster ermöglicht die Auswahl des Verhaltens in Algorithmen zur Laufzeit. Das Strategiemuster definiert eine Familie aus Algorithmen, kapselt jeden Algorithmus und macht die Algorithmen austauschbar innerhalb dieser Familie. Daher haben wir oft zwei Möglichkeiten, Hindernisse zu definieren. In Si Shop können wir uns entweder auf absurde Klassen oder auf Schnittstellen verlassen, wie zwischen ihnen zu wählen. Die Schnittstellen sind aus Stein. Sie können leicht geändert werden, ohne vorhandene Clients gleichzeitig in Gesichter zu zerbrechen. Ein Grund, der von Cline A-Client erweiterbar ist, kann einen Link zu Gesicht durch Erweiterungsmethoden erweitern. Und übrigens, wenn ein Client eine Schnittstelle für eine Klasse implementieren möchte, die bereits von einer anderen Klasse erbt , kann der Client das leicht tun. Ein Client konnte das nicht mit einer abstrakten Klasse tun. Stattdessen, oft Schnittstelle. Da die Mehrfachvererbung im C-Shop abgeschrieben wird, kann jede Klasse ihre vielen Schnittstellen implementieren, wie sie will, so dass erfinden und Schnittstelle aus der Sicht des Kunden geschmeidiger ist. Leider ist eine Schnittstelle regent. Aus der Sicht der Entwickler kann es leicht geändert werden, und es unterstützt keine Art von Wiederverwendbarkeit. Abstrakte Klassen unterstützen Wiederverwendbarkeit. Sie unterstützen die Kapselung und können problemlos erweitert werden, ohne bestehende Clients zu brechen. Infolgedessen ist eine abstrakte Klasse aus der Entwicklerperspektive geschmeidig und gleichzeitig mehr Region aus der Sicht des Kunden, da Mehrfachvererbung abgeschrieben wird. Mit all dem, was gesagt, können wir die interessante Regel der Daumen verwendet abstrakte Gläser für den Aufbau von internen AP Augen schließen und verwenden Schnittstellen für die Bereitstellung externer Punkte der Erweiterung. Denken Sie daran, das ist kein Dogma. Dies ist eine Faustregel Rückruf, zum Beispiel, dass Basile bietet I Sammlung. Ich wenigstens benachrichtige ich Eigenschaft geändert und schaltet andere Schnittstellen aus. Dies geschieht, weil sie erweitert Fähigkeit aus der Sicht des Kunden, ist wichtiger in diesen Fällen. In der Vorlesung, in der wir ihr Factoring durchgeführt haben, sagte ich, dass eine Napster-Klasse mit mehreren Implementierungen zu einer Situation führt, in der es schwierig ist , neue Operationen hinzuzufügen, da Sie sie in jeder Klasse implementieren müssen. Es gibt ein anderes Problem. Was ist, wenn wir unseren Kunden die Möglichkeit bieten wollen, Operationen auf eigene Faust zu definieren ? In einem solchen Fall können Sie daran interessiert sein, das von Besuchern entworfene Muster anzuwenden. Schau dir das Diagramm an. Das Besuchermuster ist ziemlich schwer zu verstehen, besonders wenn man sich ein Diagramm anschaut. Kurz gesagt, das Besuchermuster erlaubt es, eine Operation zu definieren, die für jede Klasse außerhalb einer bestimmten Hierarchie ausgeführt werden kann , ohne Klassen außerhalb dieser Hierarchie zu ändern. Schauen wir uns ein Beispiel in Visual Studio an. letzte Mal, als wir mit dem folgenden Design herauskamen, haben wir die I-Geräteschnittstelle extrahiert, um die Art und Weise zu abstrahieren, wie Geräte Hier haben wir die feine Methode. Danach haben wir für den Implementierer Going Dispenser Cube für und Bill Dispenser E C D. M. Angenommen, wir wollen Operationen auf der Client-Seite hinzufügen, und der Client hat keinen Zugriff auf die Eye Device Interface. Dafür werden wir das Besuchermuster anwenden, bevor wir das besser implementieren. Lassen Sie uns hier eine Hafeneigenschaft erstellen und dasselbe im Münzspenderstall. Moment können wir die Visa oder Muster umsetzen. Nun, das ist toll, dass ich Gerät Besucherschnittstelle, die Besuchsmethoden für alle Gerätemodelle enthüllt. Jetzt können wir die Basisklasse für Geräte implementieren, um ihre Instanzen an den Besucher zu übergeben. Jetzt möchte ich dafür einen neuen Befehl hinzufügen. Zuerst hatte ich die Close-Kommando-Besucherklasse, die die neue Funktion implementiert, um diesen Besucher nicht zu verwenden. Ich würde auch eine Erweiterungsmethode für die Geräteklasse erstellen. Jetzt können die Kunden Mantel leicht den neuen Kleidungsbefehl auf allen Geräten verwenden, - und jetzt funktioniert alles gut. Dies ist ein sehr starkes Muster, mit dem Sie ein geschmeidiges Design entwickeln können. Wenn Sie die Erweiterung von Typen erwarten als wahrscheinlich, wäre es besser, bei einer klassischen Hierarchie zu bleiben. Wir haben uns mit der Durchführung der ersten oder Fabrik ausgedacht. Im Gegenteil, wenn Sie erwarten, dass die Hierarchie nicht volatil ist und die Operationen von Clients implementiert werden , dann ist das Besuchermuster der richtige Weg. Das Hinzufügen neuer Typen zum Besucher kann in der nächsten Vorlesung problematisch sein. Lassen Sie uns zusammenfassen, was wir über die OCP gelernt haben und versuchen, kurz die üblichen Gerüche von OCP-Verletzungzu beschreiben OCP-Verletzung 15. 06 häufige Smells von OCP Verstoß: der häufigste Geruch von Klatschverletzung ist das Auftreten von vielen bedingten Zweigen , entweder mit if else oder mit switch case-Anweisungen. Im Allgemeinen haben Sie drei gemeinsame Ansätze, um die S a p Building Handling Sequenzen mit Delegaten einzuhalten , die natürlich die Implementierungen außerhalb der Kette des Verantwortungsmusters sind. Suchen Sie nach der Kette der Verantwortung Schlafzimmer. Das Spektrum ist fast mit Ereignissen in die Punkt-Net-Plattform integriert, daher verwenden wir es, wenn wir eine Nachricht übergeben und von mehreren Handlern behandeln müssen. Die Verantwortungskette bietet den Weg, dies locker gekoppelt umzusetzen . Andernfalls können Sie mit gekoppelten Objekten enden. Eine andere Möglichkeit besteht darin, sich auf eine klassische Vererbung mit einem Template-Methodenmuster zu verlassen oder ein Besuchermuster zu implementieren. Wenn Sie einem Client die Möglichkeit bieten müssen, Operationen zu definieren, der letzte Weg darin, sich auf eine Komposition anstatt auf Vererbung zu verlassen. Höchstwahrscheinlich werden Sie sich besser auf die Strategie verlassen, um eine Zusammensetzung zu implementieren. Denken Sie daran, dass die Komposition im Allgemeinen eher bevorzugt ist als die klassische Vererbung. Okay, in der nächsten Vorlesung werden wir zusammenfassen, was wir in diesem Abschnitt gelernt haben 16. 07 Schlussfolgerungen: Diese Vorlesung trägt den Titel Fazit. Beim Open-Close-Prinzip geht es um Veränderungen. Nach OCP können Sie jedes geschmeidige Design erreichen, das bereit ist, neue Funktionen ohne Schmerzen einzuführen . Um das geschmeidige Design zu erreichen, sollte es für eine Erweiterung offen und für eine Modifikation geschlossen sein, so dass die am häufigsten wechselnden Teile des Systems isoliert werden müssen. Eine sehr wichtige Sache ist, dass wir eine Verantwortung für das Erstellen von Objekten in einem einzigen Modul isolieren müssen , und Onley sollte dieses Modul im Falle der Einführung neuer Implementierungen geändert werden . Dieses Prinzip wird als Single Choice Prinzip bezeichnet. Sie haben gelernt, dass Sie sich an das OCP halten können, indem Sie die Abschaltung abstrakter Klassen für Schnittstellen nutzen . Die häufigsten entworfenen Muster, die wir anwenden, um die LCP einzuhalten, sind die Vorlage, Methode und die Strategie. Sie haben gelernt, dass eine Schnittstelle aus Sicht des Kunden geschmeidiger ist. Während eine abstrakte Suche ist geschmeidiger von den Entwicklern zeigen Sie ab. Wir haben auch gelernt, dass wir keine magischen Werkzeuge zur Verfügung haben, die es uns erlauben, uns vollständig vor allen möglichen Änderungen zu schützen, und es bedeutet nicht, dass wir anfangen sollten, Tonnen von Erweiterungen, Punkte zu erstellen die Entwicklung von Änderungen in der Zukunft auf der gesamten Codebasis. Um das Problem zu überwinden, versuchen wir, das sogenannte Gile Design zu verwenden. Herzlichen Glückwunsch. Sie haben das Ende des OCP-Abschnitts im nächsten Abschnitt erreicht. Wir werden uns die Liste des Substitutionsprinzips ansehen, scheinbar der am schwersten zu verstehende Prinz unter soliden Prinzipien. 17. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 18. 02 LSP Definition: Diese Vorlesung trägt den Titel Problem Statement. Die offizielle Definition von Barbara Liska aus der Liste des Substitutionsprinzips klingt so, wenn s ein Subtyp aus Team ist, als Objekte vom Typ T durch Objekte aus dem Typ s ersetzt werden können , ohne das Programm zu brechen. Es ist nicht sehr schwer zu verstehen, was diese Definition bedeutet, aber ich zitiere die Definition von L S P aus dem Buch von Onkel Bob. Agile Prinzipien, Muster und Praktiken in C scharf Nur für den Fall, dass wir dort die folgende Definition aus der Liste des Substitutionsprinzips finden , besagt die Liste des Substitutionsprinzips, dass Subtypen ble für ihre Basis ersetzt werden müssen -Typen. Übrigens ist Barbara Lisk off eine Wissenschaftlerin, die dieses Prinzip 1988 beschrieben hat. Das Originalpapier wurde in Griechenland geschrieben und es war sehr schwer, die objektorientierte Programmierung in der Praxis zu verstehen und anzuwenden . Lassen Sie uns versuchen zu klären, was er für Entwickler in der Praxis bedeutet. Was bedeutet es, durch eine Klasse ersetzt zu werden? wir so, als hätten wir einen Klienten, der das FBI Off-Interface benutzt, wenn es zwei gibt. Es wird von den Klassen A implementiert und C Klasse C kann als Ersatz für Klasse A betrachtet werden wenn der Client keinen Unterschied mit der Klasse C anstelle von A beobachtet. Aus der Sicht des Clients sollte ein Client anderes Verhalten unter Verwendung verschiedener Erben derselben Basisklasse oder einer Schnittstelle. Eigentlich ist das L S P stark mit ihren objektorientierten Sprachen verwandt. Erlauben Sie uns, Vererbung zu verwenden. Wenn Glenn's von einem erbt werden, dann können wir B S A benutzen aber wir können einen SB benutzen. So können Clients von a sowohl A als auch B verwenden, auch wenn sie nichts über sein wissen. Das sind Grundlagen des Polymorphismus. Trotzdem ist Basics Entwickler die ganze Zeit. Ich verletze die Logik einer solchen Beziehung übrigens, übrigens, als Bemerkung möchte ich Sie daran erinnern, dass es nicht notwendig ist, einen solchen Mechanismus wie die Vererbung zu haben, um solche Beziehungen zwischen Objekten zu modellieren. In dynamisch typisierten Sprachen verwenden wir die sogenannte „Dark Typing“. Wenn ein Vogel wie eine Ente schwimmt, quackt er wie eine Ente. Dann nannte ich Werbung eine Ente. Deshalb erschien der Begriff Ententypisierung dynamisch. Typisierte Sprachen wissen nicht, ob wir eine bestimmte Methode aufrufen dürfen oder nicht. Die Laufzeit-Prüfungen. Wenn ein Objekt auf eine Nachricht antworten kann, indem er eine Nachricht sagt, meine ich einen Aufruf der Methode, da es in dynamisch typisierten Sprachen besser ist, eine Nachricht senden zu sagen, anstatt eine Methode aufzurufen. Kommen wir zurück zum Hauptthema. Es gibt zwei Möglichkeiten, die Ersatzfähigkeit zu brechen. Vertragsverletzung und Verstoß gegen Co-Varianz- oder Kontrollvarianten. Für eine beträchtliche Anzahl von Entwicklern ist es unklar, was es bedeutet? Es erfordert also die weitere Klärung. Ohne Verständnis werden diese grundlegenden Konzepte nicht in der Lage sein, Typen zu entwerfen, die ihre Sprache nicht verletzen . Früher oder später wirst du in die schrecklichen Probleme stoßen, die durch, oh Geschwindigkeitsverletzung verursacht werden. Halten Sie also Patienten und fangen wir mit Verträgen in der nächsten Vorlesung an. 19. 03 Verträge: Diese Vorlesung trägt den Titel Verträge. Programming to Contracts wurde von Burton Meyer in seinem klassischen Buch „ Object Oriented Software Construction“ ausgearbeitet . Er beschrieb die Vorteile aus der Programmierung zu Verträgen. Er kam sogar mit der ganz neuen Sprache namens Eiffel heraus, die mit der Programmierung für Verträge im Auge gebaut wurde. Also, was ist der Vertrag? Viele Entwickler macht die Begriffe aus einer Schnittstelle und dem Vertrag. Die Aussage wird dadurch überzeugender, dass im WC, wenn wir Schnittstellen und Verträge in W. C. F.gleich behandeln C. F. kann ein Dienstleistungsvertrag nur durch eine Schnittstelle in der realen Welt dargestellt werden, einschließlich der realen Welt. Außerhalb der Programmierung haben Verträge eine semantische Nutzlast. Normalerweise bestimmen sie eine Art von Beziehungen zwischen Menschen, schreibt Objekte und so weiter in Gesichter haben keine semantische Nutzlast. Sie bestimmen nichts außer Signaturen, aber Signaturen tragen keine signifikante semantische Nutzlast. Eine Schnittstelle stellt nur eine Form dar. also Interfaces sindalsokeine Verträge. Hier ist ein Beispiel für einen Vertrag von Christophe Kulina. Dieser Vertrag besagt, dass, wenn ein Element zur Sammlung hinzugefügt wird, die Count-Eigenschaften von einem belastet werden. Darüber hinaus ist dieser Vertrag für alle Subtypes gesperrt. Ein Vertrag von einer Methode bildet also die folgenden Teile aus. Akzeptable und inakzeptable Eingabewerte oder -typen und ihre Bedeutungen. Gibt Werte oder Typen und ihre Bedeutungen zurück. Fehler- und Ausnahmebedingung, Werte oder Typen, die eine Heilung und ihre Bedeutungen können, Nebenwirkungen, Voraussetzungen, post-Bedingungen. Und in Abweichung von der Lernperspektive sind wir vor allem an Vorbedingungen, Postbedingungen und an der Varianz von Bedingungen interessiert . Aus einer Funktion sind die festgelegten Anforderungen. Eine Funktion gilt für die Eingabeparameter und manchmal für den Zustand des Objekts, zu dem diese Funktion gehört. Ich habe ein einfaches Beispiel aus meiner eigenen Praxis. Erleichtert sich natürlich, vereinfacht und in einer Form aus einem Skelett aus Gründen der Einfachheit präsentiert. Hier haben zwei verschiedene Bank-Terminal-Modelle. Beide Modelle leiten sich von der eye bank Terminal-Schnittstelle ab, die den Prozess Zahlungsvorgang definiert. Diese Terminals teilen erhebliche Menge an Geschäftslogik, und sie haben sehr ähnliche Schnittstellen, so Entwickler beschlossen, ihnen durch die Einführung, dass ich Bank Terminal-Schnittstelle beitreten. Leider verfügen beide Terminals über eigene Payment Gateways mit unterschiedlichen Schnittstellen. Eine erfordert ein eindeutiges i d, um vom Client generiert zu werden, während ein anderer nicht die A P. I. Universal-Entwickler nur eine einzige Methode mit zwei Parametern ausführte. Die Implementierung vom ersten Terminal ignoriert nur den zweiten Parameter, während der zweite das eindeutige I D. überprüft und wenn es jetzt oder das richtige Leerzeichen ist, löst es die Argumentausnahme aus. Ein Client, der mit dem ersten Terminal arbeitete, erwartet kein solches Verhalten, das mit der 2. 1 arbeitet. Dies geschieht, weil der zweite Erbe die Voraussetzungen stärkt. Das erste Terminal akzeptiert das eindeutige I D, das einem beliebigen Wert entsprechen kann. wurden keine Beschränkungen angewendet. Die Konsequenz ist, dass ein Kunde sich des unterschiedlichen Verhaltens dieser Ben-Terminals bewusst sein muss . Diejenigen Kunden, die mit dem ersten Terminal gearbeitet haben, würden keine Ausnahmen erwarten. Die Hierarchie verletzt nicht nur ihre WasPy Stärkung der Voraussetzungen, sondern auch es verletzt sie eine Geschwindigkeit, indem sie die Post-Bedingungen schwächt, die das erste Terminal zurückgibt Das Ergebnis Code aus Typ Sie beenden, was bedeutet, dass der Antwortcode gleich oder größer als Null ist? Im zweiten Fall kann der Ergebniscode kleiner als Null sein. Im zweiten Fall, die interne Logik des Zahlungs-Gateways, meine Garantie, dass es nur Codes zurückgibt, die gleich oder größer als Null sind, aber vorgeben , dass es solche Garantien nicht bietet. Entwickler wollten die universelle Schnittstelle ausrollen, so dass sie die Prozesszahlung definiert. Es ist eine Methode, die eine ganze Zahl zurückgibt. Hier sehen wir, dass das erste Terminal ein Sie Ende zurückgibt, aber es muss es bis Ende werfen, um die Schnittstelle zu befriedigen Sehr oft. In solchen Fällen sind die Kunden sich der Garantien bewusst, die von einem der Implementierer bereitgestellt werden. beispielsweise In diesem Fall sagt die Methodebeispielsweiseexplizit in Befehlen, dass die zurückgegebene Antwort immer positiv ist. Das zweite Terminal schwächt die Post-Bedingungen im Vergleich zum ersten Terminal. Deshalb mussten Entwickler die Prozesszahlungsmethode mit Integer-Assay-Rückgabetyp definieren . Sie versuchen, eine universelle Schnittstelle fehlschlägt, weil Clients die internen Details kennen müssen . Am Ende wissen sie, dass das erste Modell tatsächlich garantiert, dass es zurückkehrt. Positive Codes, trotz der Unterschrift, spiegeln sie nicht wider. Die Gesamtidee ist, dass durch die Schwächung der Postbedingungen Erben das mögliche Ergebnis einer Funktion erweitern. Als Ergebnis Kunden unerwartete Situationen oder sie müssen am Ende verschiedene Fälle verstehen und sie auf eine bestimmte Weise behandeln, können Sie Verträge auf der dot net Plattform in C Shop mit einer speziellen Bibliothek namens Code schreiben Verträge. Es überrascht nicht, dass mit Codeverträgen Sie mit Codeverträgendie ausgeschaltete Codeüberprüfung auf Korrektheit aufgrund einiger praktischer Probleme und Probleme im Zusammenhang mit der schlechten Implementierung aus der Codevertragsbibliothek nutzen können . Es ist kein sehr beliebter Ansatz. Heutzutage, zum Beispiel, so genannte Verträge arbeiten sehr langsam auf großen Lösungen. Und das ist nur einer der Gründe, warum diese Bibliothek außerhalb des Geltungsbereichs der Partituren ist. Also, wenn Sie an Code-Verträgen interessiert sind, können Sie einfach Google dafür. Ein weiteres Problem, das ich demonstrieren möchte, ist mit dem Verstoß in der Varianz an einem klassischen Beispiel in der nächsten Vorlesung zusammenhängen . 20. 04 Demo des Problems: Dieser Vortrag trägt den Titel Ellis Be Violation Demo. Betrachten wir ein klassisches Beispiel für Phyllis P. Verletzung. Ich liebe dieses Beispiel aus zwei Gründen. Die 1. 1 ist, dass es tatsächlich die L S P Verletzung demonstriert, und dieser Grund ist offensichtlich. Und der zweite Grund ist, dass es zeigt, dass objektorientierte Programmierung oft direkt die Beziehungen zwischen Objekten in der realen Welt in demselben Modell abbildenkann die Beziehungen zwischen Objekten in der realen Welt in demselben Modell abbilden . Eine große Anzahl von Entwicklern denken, dass das Schreiben von Code in Hopi Sprache, sie modellieren Luftwelt-Domain-Probleme. Und zum Teil ist das wahr. Aber die realen Beziehungen zwischen Objekten können manchmal direkt in Opie Sprache motil sein. Hier ist eine der naiven Hoffnungsaussagen Kinderbrille. Implementieren ist eine Beziehung mit basierenden Klassen. Zum Beispiel, Hund ist eine Tierkatze ist ein Tier, so können wir drei Klassen erstellen. Tier ist die Basisklasse, und die anderen beiden sind Erben. Leider funktioniert diese Art von Design manchmal nicht wie erwartet, und Sie werden dies in einer Minute sehen. Lassen Sie uns also die Beziehungen zwischen zwei riel Welt Vorstellungen im Code reflektieren. Wir wollen ein Rechteck und Quadrat in der Lage, ihre Flächen zu berechnen implementieren. Ich bin sicher, Sie werden mir zustimmen, dass auf dem echten Weltplatz ein Sonderfall aus Rechteck ist . Es ist andere, weil Quadrat ein Rechteck mit gleichen Seiten ist. Okay, wechseln wir zum Visual Studio. Lassen Sie uns ein Rechteck und Quadrat erstellen. Ich habe die Rechteck-Klasse erstellt, die zwei Eigenschaften mit und Höhe hat, und das Quadrat, das von ihrer Tangle Klasse erbt. Getrennt erstelle ich die Klasse, die für die Berechnung der Bereiche dieser Shapes verantwortlich ist. Sieht gut aus. Von der ersten Seite. Ich werde so tun, als wäre ich ein Kunde und ich möchte zwei Formen erstellen und ihre Flächen berechnen. Dafür werde ich die Hauptmethode implementieren, bei der alle Dinge passieren, die zuerst passieren werden, ich werde nur ein Rechteck mit gleich zwei erstellen und gleich fünf verstecken. Danach rufe ich die ST IC Cal korrekte Winkelmethode auf und erhalte das Ergebnis, und ich sende das Ergebnis auch an die Konsole. Jetzt möchte ich ein Quadrat erstellen. Warten Sie eine Minute. Was zur Hölle ist das? Wie ein Quadrat Seiten unterschiedlicher Länge enthalten kann. Ich werde das Programm nicht einmal ausführen, da es offensichtlich ist, dass etwas hier mit einem Stapel quadratischer Quadrat nicht stimmt, erlaubt es, unterschiedliche Länge auf Breite und Höhe einzustellen . Dieses Design verstößt eindeutig gegen die Liste der Substitution. Hauptquadrat ist nicht ersetzen Hable für Rechteck Rechteck implementiert die in Variante , die besagt, dass Breite und Höhe ausgeschaltet sein könnten. Different Land Square muss eine andere in Variante implementieren, die besagt, dass Breite und Höhe gleich sein müssen. Das habe ich absichtlich weggelassen. Eigentlich müssen sie auch größer oder gleich Null sein. Es gibt ein anderes Problem, das sich hier versteckt. Höchstwahrscheinlich müssten Sie Methoden erstellen, die Rechteck als Parameter verwenden und einige Geschäftslogik implementieren . Im Falle der Berechnung der Ära könnte eine solche Methode so aussehen. Diese Methode überprüft den Typ des akzeptierten Parameters und führt den entsprechenden Berechnungsalgorithmus aus. Was meinst du? Ist es eine gute Möglichkeit, Methoden auf der gesamten Codebasis zu definieren, die mit Rechtecken arbeiten müssen ? Ähnelt es dir nicht etwas, das wir vorher gesehen haben? Ja, das ist in der Tat ein Verstoß gegen das Prinzip der offenen Schließung. Diese Methode ist für Änderungen offen. Was passiert, wenn wir eine neue Form einführen? Richtig. Wir müssen das ändern. Das ist, welche Aussage dieses Beispiel der Gillespie-Verletzung ist eine versteckte Verletzung von OCP. In der nächsten Vorlesung werden wir uns ansehen, wie dieses Problem behoben 21. 05 Refactoring auf ein besseres Design: Offensichtlich müssen wir unmöglich machen, verschiedene Längen abseits für ein Quadrat zu setzen, um das Problem zu beheben . Moment sind die Erwartungen der Quadrate Clients gebrochen. Die Luft, eine Rechnerklasse zeigen nun, dass es ein Problem aus getrennten Daten und Verhalten . Die Berechnungsalgorithmen sind von den rechteckigen und quadratischen Gläsern getrennt, die die für Berechnungen erforderlichen Daten besitzen. Der Flächenrechner kann ohne Rechteck und Quadrat nicht existieren. Also, warum das Verhalten wurde weg von Rechteck und quadratischen Rechteck und Quadrat für jetzt verschoben, offensichtlich fehlt Kohäsion, um die Krankheit zu heilen, wo immer sollten richtige Abstraktionen konstruieren. Was wir verhindern wollen, ist die Geschäftslogik der Berechnung der Fläche. Jede Form verfügt über einen eigenen Algorithmus aus der Berechnung. Das Gebiet. Es ist viel besser, das Verhalten gemeinsam zu machen als Daten. Lassen Sie uns die Berechnungsflächenmethode durch die Einführung der I-förmigen Schnittstelle behindern. Ich möchte, dass das Rechteck und das Quadrat von der Augenform erben. Durch die Implementierung eigener Algorithmen definiert Square jetzt seine eigene Eigenschaft mit dem Namen side length. Jetzt kann ein Klient nicht missbrauchen. Es ist ein P I. Hier ist ein Beispiel für einen Client im Falle eines Rechtecks aufruft, um Fläche zu berechnen, Ein Client gibt den Bereich aus einem Rechteck, während im Falle eines Quadrats ein Client die Fläche eines Quadrats erhält. Der Kunde kann unterschiedliche Länge, Breite und Höhe auf ein Quadrat einstellen . Großartig. In der nächsten Vorlesung werden wir andere Wege aus ls Verletzung betrachten. 22. 06 weitere Beispiele von of: Diese Vorlesung trägt den Titel Mehr Beispiele Off L S P Verletzung. Wir werden die Diskussion von einem sehr wichtigen Thema abgesehen. Varianz Varianz ist ein sehr kompliziertes Konzept. Also werden wir nur dieses Thema berühren. Trotzdem ist es im Zusammenhang mit der L S P Varianz ist der Begriff, der die Typen Compliance beschreibt . Es verzweigt sich auf zwei Begriffe, Kohärenz und Kontravarianz. der Annahme, dass der Typ A in Dosen der Cast Typ B Typ X ist co Variante, wenn X aus einer Dose die Cast zwei x off b, zum Beispiel. Ich leihe Stream kann, weil zu meiner Bar aus Objekt dieses Gold-Snippet zeigt, dass s Aaron auch genannt wird . Oh, hier ist ein einfaches Beispiel, das das Problem vom Gießen demonstriert hat, da der Mensch die folgende Klassenhierarchie das Basisglastier und die Erben Hund und Katze und eine generische Nave-Implementierungaus Stapel haben würde folgende Klassenhierarchie das Basisglastier und die Erben Hund und Katze und eine generische Nave-Implementierung . Der folgende Code wird nicht in C shop c scharf d proc 8 kompilieren dies, um die Möglichkeit zu verhindern , den folgenden Code zu schreiben, den wir hier versuchen, Katzen zu Hunden hinzuzufügen A Raise in C Shop sind co-Variante aus historischen Gründen. So wird der folgende Code kompiliert und der Verstoß aus dem L S P wird Onley in der Laufzeit erkannt . Es wird eine Ausnahme geben. Ausgehend von C-Shop für generische Schnittstellen. Erlauben Sie Varianten durch spezielle Schlüsselwörter in und aus generischen Klassen. Zur gleichen Zeit, erlauben Sie keine Varianten. Das Schlüsselwort out garantiert, dass innerhalb der Implementierung von dieser Schnittstelle ein generischer Parameter nur in den return-Anweisungen verwendet werden kann. Es löst das Problem, das wir mit dem Hinzufügen einer Katze zu einem Stapel von Hunden gesehen haben. Dies kann wie im folgenden Snippet ausgedrückt werden. Sogar die Stack-Klasse aus dem vorherigen Beispiel implementiert diese Schnittstelle als der folgende Code kompiliert und absolut korrekt ist. Im Gegenteil, wir können das Schlüsselwort in verwenden, um sicherzustellen, dass der generische Parameter nur als Eingabe verwendet wird. Hier ist das Code-Snippet, das die Idee demonstriert, wenn das Stack-Glas diese Schnittstelle implementiert, als der folgende Code kompiliert und absolut korrekt ist. Ein anderes Beispiel, das ich Ihnen zeigen möchte, stammt aus dem Basile off the dot net Framework. Es ist auch ein bekanntes Beispiel für die SP-Verletzung. Es gibt eine generische Schnittstelle namens I Collection, oft in der BCL definiert ist. Der Stopp leitet sich von den unzähligen Tee ab, und es definiert die folgenden Methoden. Fügen Sie klar hinzu. Enthält auch Kopie . Entfernen Sie. Es gibt einen alten Chirurgen Air Class namens Read Only Collection off team, die aus der I Sammlung von Team ableitet. Ja, Sie können von dem Namen aus der Lese-Only-Sammlung von T erraten. Es implementiert eine Sammlung, die nicht nach der Initialisierung zur gleichen Zeit geändert werden kann, lesen Sie nur Sammlung Off T stammt aus der I Sammlung von Tee. Was bedeutet, dass es alle Operationen unterstützen sollte, die in diesem übergeordneten Element definiert sind, eine generische Schnittstelle. Eine zweite Sequenz, die Lese-Only-Sammlung muss implementieren, klare und entfernen Methoden irgendwie, aber wie es soll sie implementieren, unter Berücksichtigung, dass diese Operationen sind Dip befindet, um auf einem schreibgeschützten Sammlung natürlich, gibt es keinen sinnvollen Weg, um dieses Problem zu lösen. So gibt es nur Sammlung wirft nur. Sie werden nicht unterstützt. Ausnahme von diesen Änderungsmethoden. Es verstößt eindeutig gegen die Liste des Substitutionsprinzips, da Kunden, die mit meiner Teesammlung arbeiten, kein solches Verhalten erwarten. Und das ist logisch, weil andere Implementierungen von I Sammlung von Tee, wie eine Liste von Tee nicht werfen wird nicht unterstützt Ausnahme. Sie arbeiten nur von einer Klasse erwartet, die Änderungsmethoden verfügbar macht. Werfen, nicht unterstützte Ausnahme ist ein starker Geruch von l S P Verletzung. Ein anderer Geruch, der auf die L S P-Verletzung hinweist, zeigt sich, indem er zu viele Downcasts in der Codebasis auftaucht . Wenn ein Client ständig die tatsächlichen Typen basierter Klassen oder Schnittstellen überprüft, bedeutet dies automatisch, dass ein Client über verschiedene Implementierer besorgt ist. Zobaie. irgendeinem Grund bedeutet dies, dass ein Clan einige interne Details über die Objekthierarchiekonstruktion kennt . Der Geruch ist eine Folge der SP-Verletzung Ein Beispiel für einen solchen Geruch, den Sie in der Vorlesung gesehen haben , wo wir die Beziehungen zwischen Quadrat und Rechteck besprochen haben. Das Code-Snippet auf der Folie veranschaulicht dieses Problem ebenfalls. SP-Verstöße sind nicht immer ein Hinweis auf SP-Verstöße. Es ist erlaubt, einen Typ herunterzuwerfen. Wenn Sie sich über den Typ absolut sicher sind, müssen Sie Downcast, um das folgende Beispiel zu betrachten. Zum Beispiel, wenn wir absolut sicher sind, dass diese Funktion nur mit einem I d off einem privilegierten Kunden aufgerufen wird , dann können wir das aus dem Repository zurückgegebene Objekt frei herunterwerfen und eine Operation dieser Art von Downcast, nur sozusagen, erinnert den Compiler daran, dass der Rial-Typ privilegierter Kunde ist. In der nächsten Vorlesung werden wir einige häufige Gerüche markieren, die darauf hinweisen, dass Analysten eine Verletzung sind. 23. 07 häufige Geräte der of: Diese Vorlesung trägt den Titel Common Smells Off LS Be Verletzung. Lassen Sie uns zusammenfassen, welche gemeinsamen Gerüche wir mit denen zeigen, dass Bayliss Verletzung sein kann. Zunächst einmal, wenn eine Methode wirft dann nicht unterstützte Ausnahme von seinem Körper und anderen Begriff, die diesen Fall beschreibt, ist der Begriff aus so genannte verweigerte Vermächtnis. Die Bedeutung ist, dass die untergeordnete Quest etwas erbt, aber sie weiß nicht, was mit dem geerbten Vermächtnis zu tun ist, und lehnt es ab, indem sie als nicht unterstützte Ausnahmen wirft . Eine andere Form des gleichen verweigerten Vermächtnisses ist, wenn eine Methode eine inter-Implementierung hat. Das ist der gleiche Fall. Der einzige Unterschied ist, dass eine Methode Vermächtnis nicht so vehement ablehnt, und andere Geruch betrifft nach unten wirft wirft wirft bedeuten, dass ein Kunde interne Details der Behinderung kennen muss . Es hängt davon ab. Hier sind einige Tipps, die mit l S B übereinstimmen. Versuchen Sie, das Tell Don't ask Prinzip im Kopf zu behalten, was im Wesentlichen bedeutet, dass der Client-Code in der Lage sein sollte, Nachrichten einfach zu übergeben, ohne sich zu überdenken interne Details des Mitarbeiters. Idealerweise sollten die Kunden nicht durch Überprüfung von Bedingungen belästigt werden. Denken Sie daran, dass l S P Verletzung ist oft econ Sequenz OCP oder SP Verletzung. Wir werden im nächsten Abschnitt über das Prinzip der Interface-Segregation sprechen, also nehmen Sie nur in Betracht, um jetzt zu berücksichtigen, dass Tatsache In solchen Fällen führt die Behebung der Ursache zu einer automatischen Behebung der L S P-Verletzung. Wenn Sie zwei Klassen haben, die eine Logik teilen und Hable nicht ersetzen, dann denken Sie daran, eine neue Basisklasse für diese zwei Gläser zu erstellen. Erben Sie dann diese beiden Klassen von einer Basisklasse und stellen Sie sicher, dass ihre Ersetzung Hable der neuen Basisklasse. In der nächsten Vorlesung werden wir eine Schlussfolgerung ziehen. 24. 08 Schlussfolgerungen: Diese Vorlesung trägt den Titel Fazit. Das Prinzip, das wir in diesem Abschnitt diskutiert wurde, war die Schnittstelle Segregation Prinz oder ich spreche im Hemd, es s P hat eine einfache Definition. Clients sollten nicht gezwungen werden, sich von Methoden abhängig zu machen, die sie nicht verwenden. Diese Definition impliziert also, dass man große, kleine, zusammenhängende und fokussierte Schnittstellen anstreben kleine, muss. Natürlich können verschiedene Kunden nur eine Teilmenge von FBI-Mitgliedern verwenden, auf die sie angewiesen sind. Es sei denn, dass AP, Ich beginne zu wachsen Transformation in eine sehr fette Schnittstelle mit unabhängigen Mitgliedern zueinander , wo, wenn ähnliche, aber verschiedene Methoden scheinen, um die Anforderungen der verschiedenen Kunden zu erfüllen . Eine typische Art der Verletzung, die Sie gesehen haben, war, als eine Schnittstelle zu breit war. Was dazu geführt hat, dass einige Gerüche wie Implementierer nicht implementierte Ausnahme werfen oder Clients die ganze Masse in der Intelligenz sehen müssen , was sie tatsächlich verwenden müssen, wie wir besprochen haben , gibt es mehrere Möglichkeiten, mit mir umzugehen Verstöße. Manchmal reicht es gerade aus, eine separate Schnittstelle von einer fetten zu extrahieren und sie gegebenenfalls zu verwenden . Manchmal muss man mit einer Fassade herauskommen, die irrelevant verbirgt. Ap I Mitglieder. Manchmal müssen Sie ein Adaptermuster anwenden, besonders wenn Sie die fat-Schnittstelle nicht besitzen und daher den Quellcode nicht ändern können. Die intelligente Einhaltung des Schnittstellen-Segregationsprinzips macht eine Anwendung leichter zu pflegen, was besonders langfristig wertvoll ist . Wenn ich missbräuchlich spreche, können Sie mit Tönen enden. Off to small interface ist, was sie schwieriger macht, von alten Clients zu verwenden. Dies ist ein Geruch, der als Anti Ice bekannt ist. Sei so, dass wir das Ende dieses Abschnitts erreicht haben. Das war eine interessante Untersuchung. Aber es gibt ein anderes Prinzip, das auf uns wartet, das Abhängigkeitsinversionsprinzip. Der nächste Abschnitt ist dem D. I. P.gewidmet I. P. . 25. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 26. 02 ISP Definition: Diese Vorlesung trägt den Titel Problem Statement. Bevor ich eine Definition gebe, möchte ich ein paar Kriege darüber sagen, was wir hier meinen. Durch das Wort Interface. - Natürlich. Into Face ist ein reserviertes Schlüsselwort im C-Shop, das es erlaubt, ein nicht zu deklarieren. Eine solche Konstruktion definiert ein FBI als Form, die von Erben dieser Schnittstelle implementiert werden muss. Gleichzeitig ist es nicht notwendig, eine Schnittstelle zu implementieren, um eine Schnittstelle verfügbar zu machen. Was ich meine ist, dass Brillen, die keine Schnittstelle implementieren, ihre eigene Schnittstelle haben, aus öffentlich sichtbaren Mitgliedern besteht . Die Gruppe der öffentlichen Mitglieder eines Glases stellt die Schnittstelle dieser Klasse dar. Also einfach gesagt, und Schnittstelle ist, was Clients sehen und verwenden eine große einfache Definition aus. Das Schnittstellen-Segregationsprinzip wurde im Buch angegeben. Sie haben bereits in Gefängnisprinzipien, Muster und Praktiken in C Shop gehört . Die Definition ist also die Schnittstelle. Das Prinzip der Segregation besagt, dass Clients nicht gezwungen werden sollten, sich von Methoden abhängig zu machen, die sie nicht verwenden. Eine einfache Schlussfolgerung, die wir aus dieser Definition ziehen können, ist, dass Sie kleine, zusammenhängende Schnittstellen zu fetten Schnittstellen bevorzugen sollten , nur für den Fall. Ich werde Sie daran erinnern, dass Kohäsion bedeutet, dass nur ein P I Mitglieder logisch miteinander verwandt sind . Es ist immer nützlich, ein Bild zu betrachten, das das Problem veranschaulicht. Und natürlich ist dies auch eine Chance, etwas Spaß zu machen. Sehen Sie sich diese Illustration an. Dieses findende Monster will essen. Und das ist, warum es sagt, dass, wenn ich Essen brauche, dann bedeutet es, dass ich etwas essen möchte, nicht Licht Kandelaber oder Layout Besteck. Dies impliziert offensichtlich, dass, wenn Sie eine öffentliche Schnittstelle namens haben, ich brauche Essen, es albern wäre, Methoden wie Mittagessen Flugzeuge oder töten Charakter von der Schnittstelle ausgesetzt zu haben . Hier ist eine interessante historische Notiz über die Ich spreche. Ich bin mir ziemlich sicher, dass ich Speed wurde zum ersten Mal vor Robert Martin verwendet, aber die erste öffentliche Formulierung gehört Toa Robert C. Martin, ein k Onkel Bob. Er hat sich dort beworben , zum ersten Mal sprechen, gut beraten für Xerox. Xerox hatte ein neues Druckersystem entwickelt, das eine Vielzahl von Aufgaben wie Heften und Faxen ausführen konnte . Die Software für dieses System wurde von Grund auf erstellt. Als die Software wuchs, Modifikationen zu machen wurde immer schwieriger, so dass selbst die kleinste Änderung würde einen Re-Deployment-Zyklus, oft unsere, die Entwicklung fast unmöglich gemacht. Der Wiederbereitungszyklus dauerte so viel Zeit, da zu dieser Zeit kein Shopper Job war . Diese Sprachen haben sehr schnell zusammengestellt, was wir nicht über C plus sagen können, zum Beispiel kann ein schlechtes Design aus einem C plus plus Programm zu signifikanter Kompilierungszeit führen. Die Konsequenzen sind dramatisch. Kommen wir zurück zu der Geschichte. Das Designproblem bestand darin, dass eine einzelne Jobklasse von fast allen Aufgaben verwendet wurde. Immer wenn ein Bring-Job oder ein Heftauftrag ausgeführt werden musste, wurde ein Anruf an die Jobklasse gemacht. Dies führte zu der Tatsache Glas, mit Multitudes off Methode spezifisch für eine Vielzahl von verschiedenen Kunden. Aufgrund dieses Designs würde ein Hauptauftrag über alle Methoden außerhalb des Druckauftrags wissen, obwohl es für sie keinen Nutzen gab, um das Problem zu lösen. Onkel Bob kam mit einer Idee, die ins Gesicht Segregationsprinzip genannt wird. Heute, Onkel Bo erstellt und müssen Schicht zwischen dem Job Glas und seinen Kunden Gesicht, mit dem Abhängigkeit Inversionsprinzip, über das wir im nächsten Abschnitt sprechen werden, anstatt ein großes Job Glas zu haben, eine Heftauftragsschnittstelle oder eine Druckauftragsschnittstelle erstellt wurde, die von den Staple- bzw. Druckklassen verwendet werden würde. Anrufen von Methoden aus dem Jobglas. Daher wurde für jeden Job-Typ ein ins Gesicht erstellt, die alle von der Job-Klasse so in Face-Segregation implementiert wurden. Hauptverletzungen führen zu Klassen, die von Dingen abhängen, die sie nicht brauchen, was Kopplung erhöht und die Flexibilität verringert und die Fähigkeit aufrechterhalten. In der nächsten Vorlesung schauen wir uns das Problem aus Eis P-Verletzung genauer an. 27. 03 Demo des Problems: Dieser Vortrag trägt den Titel Ice Be Verletzung Dama eins. Ich möchte Ihnen Ariel Fall aus meiner Praxis zeigen, die mit dem Problem aus in Gesicht Segregation verwandt war. Ich habe viel mit Geräten gearbeitet, und sobald ich den folgenden Fall vor der Gewährung konfrontiert, möchte ich sagen, dass ich Studenten gerne Beispiele geben möchte, die das ganze Bild der Luftwelt Fall widerspiegeln . Also werde ich alle Details im Zusammenhang mit dem Problem beschreiben, weil ich denke, dass dies hilft, das Material viel besser zu verstehen. Auf der obersten Ebene haben wir also eine monolithische WBF-Anwendung, die an Point-Off-Service-Terminals funktioniert. Diese Terminals ermöglichen es den Menschen, Fahrkarten in S-Bahnen zu kaufen. Diese Anwendung ermöglicht es Benutzern, Tickets über Kreditkarten zu kaufen. So muss die Anwendung mit Bankterminals arbeiten. Irgendwie aus geschäftlichen Gründen mehrere Bank-Terminal-Modelle, gab esaus geschäftlichen Gründen mehrere Bank-Terminal-Modelle,die in das Passieren von Terminals integriert wurden, so dass sie alle unterstützt werden mussten. Die Interpretation mit Bankterminals ist nicht direkt. Ban Terminal-Hersteller stellen ihre eigenen Anwendungen zur Verfügung, über die unsere Anwendung mit ihren Bankterminals arbeiten kann . Ihre Anwendungen werden wie kommen Server implementiert. Wenn Sie nicht wissen, was ein COM-Server ist, denken Sie es einfach als eigenständigen ausführbaren Dienst an. Das Diagramm spiegelt den Ablauf der Vorgänge wider. Schauen wir uns den Code an. Es gibt das bloße Minimum Off-Operationen, die von jedem möglichen Bankterminal unterstützt werden. Deshalb habe ich die Eye Bank Terminal-Schnittstelle definiert, die die B I von Diensten widerspiegelt, die Inter direkt mit Bankterminals arbeiten . Jetzt habe ich drei Implementierungen von der Eye Bank Terminal Schnittstelle, Zap Terminal, sein eigenes Terminal und PDQ-Terminal. Ich bin in die Rial-Implementierung eingetragen, da es das Beispiel zu sehr erschweren würde. Und es gibt keine Bedeutung, Ihnen die Eingeweide und Low-Level-Details zu zeigen. Und jetzt werde ich das Problem beschreiben, das entstanden ist. Die Sache ist, dass Bankterminals anders sind. Das einige Terminal ist eine Black-Box-Lösung, die physisch eine Box ist, die alleine mit Kreditkartenrückständen arbeitet . Großartige Ausweis-Lesegeräte sind jene Geräte, die Ihre Karte akzeptieren , die billige oder einen Magnetstreifen lesen und die Rückkarte an Sie zurückgeben. Also sein eigenes Terminal nicht belichtet Kerl für Inter Betrieb mit Kartenlesern, weil die Service-Anwendung automatisch alte und Zubehör Dinge aufstellt Zur gleichen Zeit, die anderen beiden Bankterminals, PDQ Terminal und Zap Terminal nicht die Verantwortung für Inter Parade mit Kartenlesern automatisch übernehmen. Im Gegenteil, sie übertragen diese Verantwortung an einen Kunden, indem sie ein P I für die Interparade mit Kartenlesern aussetzen. Im ersten Fall muss unsere Anwendung überhaupt nichts tun. Während in den anderen beiden Fällen sind Anwendung hat ein Fenster zu zeigen Terminal-Wartungstechniker , um die Möglichkeit, die Bank-Terminal-Geräte richtig einzurichten. Sehen wir uns die Ansichtsmodellklasse an, die ein Moderator für dieses Fenster ist, dem Wartungstechniker die Geräte der Bankterminals einrichten können. Das Fenster verfügt über vier Tasten, denen getestet werden kann, ob sich der Kontakt oder der Kontakt mit den Lesern in einem bestimmten Port befinden. Und um sie zu finden, indem Sie alle verfügbaren Ports im System scannen, müssen wir die Kartenleser Communicator Ihrer Modelle, Constructor Independence übergeben, Constructor Independence übergeben, die in der Lage ist, zu testen und nach Kartenlesern auf Ports zu suchen. Fragen Sie sich jetzt, was würden Sie tun, um das Problem zu lösen? Die einfachen Möglichkeiten, Methodensignaturen direkt in das Eye Bank Terminal hinzuzufügen? Lassen Sie uns das tun und schauen, was passieren wird. Okay, da wir drei Implementierer Z haben, wenn Sie die nur ein Prime-Mitglied bearbeiten, - huh ? Was wir hier tun werden Zone Terminal Service bietet nicht in einem Schrei für Kommunikation mit Kartenlesern scheinbar, wir müssen werfen, nicht unterstützte Ausnahmen von den implementierten Mitgliedern. Erinnert dich dieser Fall nicht an etwas? Etwas, das wir im vorherigen Abschnitt gesehen haben? - Natürlich. Dies ist ein Verstoß aus der Liste des Substitutionsprinzips. Aber worüber wir reden, ist der Interface-Segregation-Prinzipal, nicht wahr? Ja, das sind wir. Die Sache ist, dass, wie ich Ihnen vorhin gesagt habe, alle Prinzipien miteinander verbunden sind. Manchmal haben sie versteckte Beziehungen. In diesem speziellen Fall enden wir mit ihrer wispy Verletzung als Folge, off ice Verstoß sein, wenn wir bei der aktuellen Lösung bleiben und wir die ibon Terminal Schnittstelle als Parameter vom Kartenleser Communicator von Ihren Modellkonstruktor. Eines Tages wird jemand das Zonen-Terminal in den Konstruktor übergeben, und dann erhält der Benutzer eine Ausnahme, nachdem er auf die Schaltfläche „Testing“ oder „Suchen“ im Fenster geklickt hat. Wenn wir also solche unglücklichen Ereignisse vermeiden wollen, müssen wir die Tatsache anerkennen, dass die Schnittstelle der Augenbank zu fett ist. Es enthält übermäßige AP I-Mitglieder. OK, in der nächsten Vorlesung werden wir das Problem schnell reflektieren. 28. 04 Refactor: Eine Verbesserung von einem besseren Design: in der vorherigen Vorlesung wurden geschlossen, dass das Auge Bank Oberst Schnittstelle zu fett ist, die Krippe und Doppel-Sir. Factoring-Technik, die normalerweise für die Einhaltung der SP gelten wird, besteht darin, dass wir kleine, isolierte Schnittstellen schaffen, die genau definierte konkrete Verantwortlichkeiten darstellen. In diesem speziellen Fall müssen wir die Verantwortung für die Inter, die mit Kartenlesern arbeitet, trennen . Also werde ich das tun. Jetzt. Wir sollten diese neue Schnittstelle unserer beiden Modelle außerhalb des Bank-Terminals implementieren, die tatsächlich mit Kartenlesern arbeiten können. PDQ-Terminal implementiert bereits dieses Interface und Zip-Terminal. Großartig. Jetzt können wir die i Kartenleser Community-Kabel in Gesicht in den Ansichtsmodellen benötigen. Konstruktor. Großartig. Es besteht keine Chance mehr, dass jemand eine unangemessene Instanz passieren wird, die nicht mit Kartenlesern arbeiten kann . Und übrigens, jetzt ist es viel verständlicher, was ein Hauptmitglied hier zu verwenden. Da wir hier eine Einzweck-Schnittstelle haben, sollte diese Ansicht als Client außerhalb der Schnittstelle nicht durch übermäßige AP I-Mitglieder des Eye Bank-Terminals gestört werden , die ihre Rolle ausdenken. Jetzt steht alles in seinen Regalen. Durch das Spielen des SP erreichen wir die geringe Kopplung zwischen Methoden, die durch ihre Bedeutung unterschiedlich sind, und so erreichen wir einen hohen Zusammenhalt zwischen ihnen in getrennten Schnittstellen. In der nächsten Vorlesung werden wir uns einen weiteren Fall einer feisty Verletzung ansehen. 29. 05 Demo des Problems: Im vorherigen Fall Schnittstelle sich der Implementierer oft zu viel von Ihnen. Es hat etwas benutzt, was es nicht wissen sollte. Deshalb konnte es einige Mitglieder nicht richtig implementieren. Also die Existenz eines Problems hat Lloreda auf der Ebene ab in Face-Implementierer offensichtlich gewesen . Sehr oft geht das Problem tiefer. Wenn sich das Problem auf Lee auf der Clientebene des Implementierers zeigt, betrachten Sie das folgende Beispiel. Ich habe hier eine Konfigurationsklasse, die implementiert ist, um ein Singleton zu sortieren. Der Konstruktor ist geschlossen und kann nur von der initialisierten Methode erstellt werden. Wird zum Serialisieren verwendet, ist eine XML-Konfigurationsdatei. Es ist nicht überraschend, würde eine Klasse haben, die diese App-Konfiguration verwendet. Hier haben wir das Berichtsglas, das einige Geschäftslogik aus Berichten Generierung implementiert. Derzeit hängt es direkt vom Konfliktglas ab. diesem Grund können wir nicht einfach einen Komponententest für die Berichtsklasse schreiben. Was nur tun kann, ist, einen Integrationstest zu schreiben, der sich mit XML-Konfigurationsdatei befasst es richtig einrichtet. Was wir tun können, ist, die Konfigurationsklasse zu behindern, aber eine Schnittstelle einzuführen, lasst uns eine Schnittstelle extrahieren und ich werde alle öffentlichen Mitglieder extrahieren. Jetzt können wir diese Schnittstelle anfordern, um im Konstruktor aus dem Bericht Klasse Klasse übergeben zu werden. Jetzt können wir einen Unionstest schreiben. Was stimmt mit diesem Test nicht? Ich sitze alle Eigenschaften, auch diejenigen, die nicht von der internen Logik des Berichts verlangt werden. - Glas Du könntest mich fragen, warum. Ich habe in der Tat gesagt, alle Eigenschaften, die ich nur diejenigen setzen konnte, die erforderlich sind, teilweise Ihr Recht. Dies würde das Problem von übermäßigem Gold lösen. Aber stellen Sie sich vor, dass es Tonnen von Eigenschaften wie in der realen World-Konfigurationsdatei gibt. Einige von ihnen haben sogar ähnliche Namen, die eine Einheit am besten schreiben. Wären Sie so sicher, dass Sie alle Eigenschaften festlegen, die für die zu testende Quest erforderlich sind? Nein, würdest du nicht. Sie werden ständig die ganze Masse in der Intelligenz sehen und sich fragen, ob diese Klasse diese oder eine andere Eigenschaft erfordert. Die einzige Möglichkeit, die Masse loszuwerden und den Code klar und sauberer zu machen, besteht darin, das Schnittstellen-Segregationsprinzip anzuwenden , um das Problem zu lösen. Wir werden das Ich spreche in der nächsten Vorlesung anwenden 30. 06 Refactor: ich habe ein besseres Design: , um die Krankheit zu heilen. sollten wir. Zigarette gab die Konfigurationsschnittstelle. Der Bericht. Glass sollte nur den Teil der Konfiguration kennen, der mit der Erstellung von Berichten zusammenhängt. Lassen Sie uns diesen Teil in eine separate Schnittstelle extrahieren und wir forderten diese Schnittstelle in die Vergangenheit in den Berichten Glaskonstruktor. Jetzt ist die Berichtsklasse nur die Dinge bewusst, die für die Berichte relevant sind. Geschäftslogik. Lassen Sie uns den Komponententest jetzt implementieren. Großartig. Jetzt müssen wir nicht an Forell denken und daran denken, dass dieser Test einfach, sauber und verständlich ist . In der nächsten Vorlesung werden wir den gemeinsamen Geruch erlernen Genügend P Verstöße. Welche Korrekturen können wir anwenden und was die Design-Gönner im Zusammenhang mit der Ich spreche Haben wir zu unserer Verfügung? 31. 07 gängige Gerüche, Korrekturen und verwandte Muster: Diese Vorlesung trägt den Titel Common Smells Fixes Ende verwandte Muster. Lassen Sie uns also über gemeinsame Gerüche sprechen, die darauf hinweisen, dass Ihr kaltes Schnittstellen-Segregationsprinzip verletzt wird. Im ersten Beispiel haben Sie einen Geruch gesehen, der dem Verstoß aus ähnelte. Die Liste des Substitutionsprinzips können wir auf diesen Geruch verweisen, ist die Umsetzung in Gesichtsmethoden zu degenerieren . Wenn eine Methode, die entweder eine Methode von einem Basisglas entfernt oder eine von einer Schnittstelle geerbte Methode implementiert , eine Ausnahme auslöst, höchstwahrscheinlich nicht implementierte Ausnahme oder einfach nichts tut. Was als degenerative Implementierung bezeichnet wird, die darauf hinweist, dass ich Geschwindigkeit verletzt werden kann. Das ist logisch, da es eine sehr hohe Chance gibt, dass ein Klient aus einem solchen Glas nichts über diese Mathematik wissen will und es nicht gleichzeitig benutzen möchte. Dies ist ein Hinweis auf eine Fehlgeschwindigkeitsverletzung. Eine solche Quest kann nicht als Ersatz für das Basisglas oder eine Schnittstelle dienen. Manchmal in solchen Fällen gab es Verletzung ist die Ursache für das Problem. Aber oft ist ihre Ursache die Verletzung des Eises. Seien Sie so sollten Sie Ihren speziellen Fall studieren und herausfinden, was das Problem verursacht. Ein anderer Geruch , den Sie in der zweiten Demo gesehen haben, kann als der Fall beschrieben werden, wenn ein Client namens auf eine Klasse verweist, aber nur einen kleinen Teil aus verwendet . Es ist ein P I. Es deutet offensichtlich darauf hin, dass zwischen solchen Gläsern ein lokaler Haitianer ist. Dies sollte Ihnen vorschlagen, dass hier etwas nicht stimmt, und Sie müssen die Untersuchung des Problems beenden. Oft werden Sie feststellen, dass sich das Problem hinter den beiden Fett in Gesichter verbirgt. Um das Problem zu beheben, müssen Sie eine solche Schnittstelle richtig trennen. Ein weiterer Unterfall hier ist, dass, wenn Sie eine fette Schnittstelle sehen, aber Sie es nicht besitzen, Sie die Schnittstelle ändern können, weil Sie ihren Quellcode nicht ändern können. In diesem Fall könnte es nützlich sein, wenn Assad besser anzuwenden. Sie haben die Anwendung aus diesem Muster im SRP-Abschnitt gesehen. Im Falle der feisty Verletzung, wir verwendet Fassade, um die Breite von Fett Gläser einzugrenzen, a p I. Wenn Sie eine fette Schnittstelle haben und es ist ein P, Ich ist nicht kompatibel mit einer Schnittstelle auf der Client-Seite. Wenn Sie versuchen, es zu verwenden, dann können Sie feststellen, dass es auch eine Möglichkeit gibt, den Adapter besser anzuwenden. zuerst Schauen wir unszuerstdas Adaptermuster an. Im Allgemeinen, was ist ein Deborah-Muster? Laut der Bande of Four Buch Deputy Pattern soll die Schnittstelle aus einem Glas in nichts umwandeln , um Kunden zu begegnen. Propect Adapter lässt Brillen zusammen arbeiten, die sonst nicht könnten. Aufgrund inkompatibler Schnittstellen zeigt diese Folie, dass ein Fall eines Adapters angewendet werden kann. Stellen Sie sich vor, dass auf den ersten Client, die von der Kämpferschnittstelle abhängt haben . Auf der anderen Seite haben wir die Wizard Class, die drei Mitglieder enthüllt, die nicht mit der Kämpferschnittstelle kompatibel sind. Wenn wir den Wizard über die Kämpferschnittstelle verwenden wollen, müssen wir einen Assistenten Adapter vorstellen, der die Kämpfer Schnittstelle implementiert und intern den Assistenten verwendet. Es passt es in unserem Fall an, wenn wir über sie sprechen, um Segregationsprinzip zu konfrontieren. Wir haben kein klassisches Problem, wenn Adapter normalerweise angewendet wird, weil wir nicht mit inkompatiblen Gesichtern umgehen . In unserem Fall sind Schnittstellen nicht inkompatibel. Einer ist einfach zu fett für einen anderen. Trotzdem kann das Adapterschlafzimmer auch in unserem Fall angewendet werden. Schauen wir uns den Code und das Visual Studio an, das diesen Fall demonstriert, um das Adaptermuster anzuwenden, um mich an das Ich spreche zu halten . Ich kam nicht mit einem echten Fall heraus, also zeige ich Ihnen einfach ein völlig synthetisches Beispiel. Hier ist der Fall. Zuerst sehen Sie, dass wir die Eye Wide Schnittstelle haben, die vier Methoden A, B, C und D definiert B, . Die Kunden Cold will nur die Methoden A und B sehen um das stellvertretende Muster anzuwenden, wir kann eine separate I-schmale Schnittstelle definieren, die auf den A- und B-Methoden definiert. Der Adapter selbst wird implementieren, dass ich die Schnittstelle verengen, während es die augenweite Schnittstelle akzeptiert . Instanz im Konstruktor als die Implementierung von A- und B-Methodenadapter delegiert nur die Verantwortung an die augenweite Schnittstelle. Beispiel Das Gold der Kunden kann sich nun auf die schmale Schnittstelle A verlassen. Nehmen Sie die Instanz im Konstruktor. Wir können in der Adapterinstanz übergeben, und der Client erhält den Zugriff nur zwei Methoden A und B. Dies ist, wie das Adaptermuster angewendet werden kann, um das Eis zu halten Es gibt einen weiteren kniffligen Fall im Zusammenhang mit dem Adaptermuster. Nehmen wir an, wir haben eine Klasse Geldbörse Ostern, die direkt von vielen Kunden verwendet wird. Und jetzt sagen wir, neue Kunden benötigen eine neue Methode in der Geldbörse Ostern, und sie werden nur von dieser Methode abhängen. Dann können wir jetzt folgendes tun. Alte Kunden können die pro Schwester so verwenden, wie sie sie zuvor verwendet haben, und sie werden die neue Methode nicht sehen. Während neue Clients nur als Sie Methode sehen, wird diese Implementierung von der Schnittstelle explizite Implementierung bezeichnet. Sie können eine solche Methode nur über die Schnittstelle aufrufen, so dass der folgende Clientcode kompiliert wird. Gehen wir zurück zu den Folien. Die allgemeine Art, ein Problem mit einer fetten Schnittstelle zu beheben, besteht darin, zu erstellen, und es gibt eine Schnittstelle mit nur absolut erforderlichen Methoden darin. Dann lassen Sie die Fed-Schnittstelle Ihre neue Schnittstelle implementieren und dann diese neue Schnittstelle im Code des Clients verwenden , die nicht über irrelevante AP I-Mitglieder von einer fetten Schnittstelle wissen müssen. Das ist genau das, was wir in der zweiten Reihe getan haben, indem wir Dama faktorierten, während wir das Problem mit der Konfiguration beheben. Und der letzte Punkt hier, den ich ansprechen möchte, ist, dass Sie nicht alle Ihre Schnittstellen in eine einzelne Methode in Gesichter abstürzen sollten , nur weil dies die Eis-P-Verletzung unmöglich macht. Es Blinder beeinflussen Oring-Techniken nur, wenn Sie das Gefühl haben, dass es ein technischer Vater gestoppt um hier und da zu erscheinen oder wenn ein technischer Vater noch nicht begonnen hat, sich zu verbreiten. Aber Sie wissen sicher, dass es wird, wenn Sie die Eis-P-Verletzung nicht beheben. Der letzte Tipp, den ich sagen möchte, betrifft das Abhängigkeitsmanagement auf einer binären Ebene. Die Tiefe ist also, dass es besser ist, wenn möglich, die Schnittstelle innerhalb der Assembly des Clients zu behalten . Es macht einfacher, die Schnittstelle zu ändern. Wenn etwas nicht stimmt, kann ein Client die Schnittstelle genau so ändern, wie er es will, anstatt Adapter auszurollen . Okay, das ist großartig. Wir haben das Ende des Abschnitts erreicht. In der nächsten Vorlesung werden wir abschließen, was Sie in diesem Abschnitt gelernt haben. 32. 08 Schlussfolgerungen: Diese Vorlesung trägt den Titel Fazit. Das Prinzip, das wir in diesem Abschnitt diskutiert wurde, war die Schnittstelle Segregation Prinz oder ich spreche im Hemd, es s P hat eine einfache Definition. Clients sollten nicht gezwungen werden, sich von Methoden abhängig zu machen, die sie nicht verwenden. Diese Definition impliziert also, dass man große, kleine, zusammenhängende und fokussierte Schnittstellen anstreben kleine, muss. Natürlich können verschiedene Kunden nur eine Teilmenge von FBI-Mitgliedern verwenden, auf die sie angewiesen sind. Es sei denn, dass AP, Ich beginne zu wachsen Transformation in eine sehr fette Schnittstelle mit unabhängigen Mitgliedern zueinander , wo, wenn ähnliche, aber verschiedene Methoden scheinen, um die Anforderungen der verschiedenen Kunden zu erfüllen . Eine typische Art der Verletzung, die Sie gesehen haben, war, als eine Schnittstelle zu breit war. Was dazu geführt hat, dass einige Gerüche wie Implementierer nicht implementierte Ausnahme werfen oder Clients die ganze Masse in der Intelligenz sehen müssen , was sie tatsächlich verwenden müssen, wie wir besprochen haben , gibt es mehrere Möglichkeiten, mit mir umzugehen Verstöße. Manchmal reicht es gerade aus, eine separate Schnittstelle von einer fetten zu extrahieren und sie gegebenenfalls zu verwenden . Manchmal muss man mit einer Fassade herauskommen, die irrelevant verbirgt. Ap I Mitglieder. Manchmal müssen Sie ein Adaptermuster anwenden, besonders wenn Sie die fat-Schnittstelle nicht besitzen und daher den Quellcode nicht ändern können. Die intelligente Einhaltung des Schnittstellen-Segregationsprinzips macht eine Anwendung leichter zu pflegen, was besonders langfristig wertvoll ist . Wenn ich missbräuchlich spreche, können Sie mit Tönen enden. Off to small interface ist, was sie schwieriger macht, von alten Clients zu verwenden. Dies ist ein Geruch, der als Anti Ice bekannt ist. Sei so, dass wir das Ende dieses Abschnitts erreicht haben. Das war eine interessante Untersuchung. Aber es gibt ein anderes Prinzip, das auf uns wartet, das Abhängigkeitsinversionsprinzip. Der nächste Abschnitt ist dem D. I. P.gewidmet I. P. . 33. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 34. 02 DIP Definition: Dieser Vortrag trägt den Titel Definition Aus dem A P. Das Prinzip der Abhängigkeitsinversion dreht sich alles um Entkopplung. Das ist sehr wichtig, also werde ich Sie daran erinnern, was Kopplung ist. Kopplung zeigt an, wie abhängige Module von den inneren Funktionsweisen abeinander sind. Dicht gekoppelte Module verlassen sich weitgehend auf den spezifischen Zustand voneinander, gemeinsame Variablen und viele Typen lose gekoppelte Module sind ziemlich unabhängig. Sie haben ein paar gut definierte AP Augen und teilen eine begrenzte Menge aus oder gar keine Daten. So ist die Kopplung, was versucht, es ist der Prozess der Erreichung der lose gekoppelten Module. Sie können Module hier verstehen, sowohl als Klassen Assam Glückseligkeit waren. Die D I P ist eine andere Ebene auf der Quellcode-Ebene in der Binärebene anwendbar. Wenn Sie sich Wikipedia ansehen, werden Sie sehen, dass niedrige Kopplung oft ein Abzeichen ist. Ein gut strukturiertes Computersystem und das gute Design und in Kombination mit hoher Kohäsion , unterstützt die allgemeinen Mädchen aus höherer Reizbarkeit und Aufrechterhaltung der Fähigkeit Gut gesagt in der Tat. Also, was ist die formale Definition? Nach den Kinderprinzipien, Mustern und Praktiken in Souchard von Onkel Bob sollten hochrangige Module nicht von Low-Level-Modulen abhängen. Beide sollten von Abstraktionen abhängen. Abstraktionen sollten nicht von Details abhängen. Details sollten von Abstraktionen abhängen. Scheint so, als wäre dies eine Definition mit zwei Ebenen. Die erste Ebene betrifft Module, und die zweite betrifft Abstraktionen. Dies ist jedoch eine großartige Definition . Es ist immer Es erfordert eine weitere Klärung, da es sehr schwer ist, in der Praxis anzuwenden. Ein solcher Rat ist ohne praktische Beispiele zu sehen. Ich möchte Ihnen ein Bild zeigen, das das D I pena reale Leben demonstriert. Angesichts der Lampenfassung und einem Soldat. Eine Frage. Steh auf. Würden Sie eine Lampe direkt an die elektrische Verkabelung in einer Wand soldaten? Wenn du das tust, könntest du diese Steckdose nur für diese Lampe benutzen, weil sie sozusagen eng gekoppelt sind. Um das Problem zu beheben, müssen wir mit einem Standardstecker kommen, Sie auf dem rechten kleinen Bild sehen können. Wenn alle Geräte einen solchen Stecker implementieren, können sie in die Steckdose blockieren. Dasselbe gilt für Abhängigkeiten und Code. Die Richtlinien auf hoher Ebene sollten nicht direkt von Details auf niedriger Ebene abhängen, wenn vier Bildgeräte nicht direkt abhängig sind. Sie können eine Ausnahme von fast allen Regeln finden. Sehen Sie sich dieses Bild an. Dies ist ein billiges Hotel, in dem der Haartrockner direkt mit der Steckdose verbunden ist. Aber in diesem Fall wird dies absichtlich gemacht, und tatsächlich ist es sinnvoll. Die Absicht ist in diesem Fall, den Trockner wieder vor Dieben zu verteidigen. Dies ist ein seltener Fall in dieser Vorlesung. Wir erwähnten den Begriff von der Abhängigkeit. In der nächsten Vorlesung werden wir Abhängigkeiten genauer betrachten. 35. 03 Dependencies 01: Diese Vorlesung trägt den Titel Abhängigkeiten, Lassen Sie uns definieren, was wir mit einer Abhängigkeit meinen. Es gibt verschiedene Arten von Abhängigkeiten vom Framework auf Dritt-Body-Blättern, externe Systeme wie Dateisystem-Datenbank oder jede Systemressource und genähte Abhängigkeit von einem benutzerdefinierten Typ, der auf dem dotnet-Framework basiert. In diesem Abschnitt ist die wichtigste Art von Abhängigkeiten für uns die Abhängigkeiten von benutzerdefinierten Typen, die von uns entwickelt werden. Zum Beispiel hier auf der Folie das hängt hier auf der Folie dasPersonenglas von der persönlichen Repository-Klasse ab. Eine Person kann ihre Funktionen nicht bereitstellen, ohne sich auf die persönliche Repository-Klasse zu verlassen. Das Personen-Repository ist eine Low-Level-Klasse, die Inter mit einer Datenbank arbeitet, während die Person das High-Level-Domänenobjekt ist. In diesem speziellen Fall hängt das High-Level-Objekt vom Low-Level-Objekt ab. Ein solcher Fall ist darauf ausgerichtet, wie Anfänger Software bauen. Traditionell ist dies ein hohes Niveau von Ihnen auf einer klassischen Anwendung, mit drei Tränen auf der Oberseite haben wir eine Benutzeroberfläche. Eine Benutzeroberfläche ruft ein p I von Objekten auf, die Business-Logik-Objekte implementieren, die Geschäftslogik implementieren, den Kerl von Low-Level-infrastrukturelle Objekte abrufen, die mit einer Datenbankin Betrieb , die mit einer Datenbank externer Webdienst und so weiter. Was ist falsch an den Beziehungen zwischen den Layern in diesem Diagramm? Weißt du, was es ist? Das Problem besteht darin, dass Objekte auf hoher Ebene außerhalb der Domänenschicht direkt von Objekten auf niedriger Ebene der Infrastrukturschicht abhängen . Die Lampe wird wie ein Schraubstock an die Steckdose verlötet. Was würden Sie tun, wenn eine Anforderung zur Änderung des Datenbankmanagementsystems ins Spiel kommt ? Es ist schwer, eine Abhängigkeit zu ersetzen. Wenn es eine enge Kopplung zwischen den Abhängigkeiten gibt, die am häufigsten ändernden Teile über Grenzen von einer Systembenutzeroberfläche rezitiert und DB-bezogene Dinge sind aus der Domänenperspektive irrelevant, daher sollte die Domänenlogik unabhängig von irrelevanten Dingen. Um das Problem zu beheben, müssen wir die Abhängigkeit zurücksetzen, die auf die infrastrukturelle Schicht zeigt. An diesem Beispiel zeige ich Ihnen, wie wir ein Hindernis von einem anderen entkoppeln können. Eine grundsätzliche Theorie. Mawf Software Engineering besagt, dass wir jedes Problem lösen können, indem wir ein zusätzliches Maß an Umleitung einführen. Also lasst uns genau das mit der Paarperson aus dem Repository machen. Hier ist die Folie, die die Änderungen durch ein einfacheres Factoring reflektiert, die wir oft auf solche Schnittstellen beziehen, wie scheint, diese Szenen ermöglichen es uns, jede Abhängigkeit zu injizieren, die wir wollen. Welche implementiert natürlich diese Schnittstelle? Dies ist eine einfache, aber leistungsstarke Technik, um die Abhängigkeiten zu invertieren eine geringe Kopplung zwischen den Komponenten zu erreichen. Ein weiterer interessanter Aspekt. Bedenken rund um Zeit und Kompilierzeit. Abhängigkeiten. Sehen Sie sich das Diagramm hier an. Haben Sie ein Modul A, das Funktion F auf Modul geht. Seien Sie durch die Schnittstelle, wenn wir Polymorphismus verwenden, indem wir eine Schnittstelle erstellen , sie zwischen Modul A und Modul B einfügen. Wir enden mit diesem Modul A hat um die Zeitabhängigkeit von B, aber es hat keine Kompilierungsabhängigkeit davon. Wir können nur noch mehr Juwel A zusammenstellen , wenn wir wollen. Ohne dass sich Ihre Kompilierung des Moduls in Sprachen wie C Plus befindet, hilft es, die Menge der Kompilierungszeit erheblich zu reduzieren. Das waren die Grundlagen dessen, worin sich die Abhängigkeiten befinden. In der nächsten Vorlesung werden zwei Haupttypen von Abhängigkeiten näher betrachtet 36. 04 Volatile und stabile Dependencies: aber dieser Vortrag trägt den Titel Volatile und stabile Abhängigkeiten. In der vorherigen Vorlesung haben Sie an einem einfachen Beispiel gesehen, wie Sie die Abhängigkeit vom Projektarchiv invertieren können, indem Sie eine Ebene in Richtung einer logischen Frage einführen, die in den Sinn kommt, welche Abhängigkeiten weggespürt werden sollten. Und um diese Frage zu beantworten, müssen wir zuerst erkennen, dass alle Abhängigkeiten in zwei Lager aufgeteilt werden können . Werden wir mit einer Kachel und stabilen Abhängigkeiten flüchtige oder, mitanderen Worten, instabile Abhängigkeiten definieren anderen Worten, ? Laut Mark Samen, eine Abhängigkeit sollte als volatil betrachtet werden. Wenn eines der folgenden Kriterien erfüllt ist, hängt die Abhängigkeit selbst von der Umgebung ab und zwingt den Kühler, diese Umgebung einzurichten. Ein klassisches Beispiel wäre eine Abhängigkeit von einer Datenbank oder allen Typen, die eine Reparatur mit einer Datenbank implizieren . Alle anderen externen Systeme, wie Webserver, fallen ebenfalls in diese Kategorie. Die Abhängigkeit existiert noch nicht und befindet sich noch in der Entwicklung. Dies ist ein regelmäßiger Deal, wenn wir Code schreiben wollen , , unter anderem interoperiert mit einem Objekt in Existenz. An diesem Punkt wollen wir nicht warten, dass das Objekt geschrieben wird, also haben wir nur eine Naht eingeführt, die das A P I von diesem Objekt widerspiegelt und Anrufe durch diese Szene tätigt. Die Abhängigkeit, die nicht auf allen Computern außerhalb von Entwicklern und der Abhängigkeit installiert ist, hat ein Verhalten von weniger als 10 Minuten. Es kann auf Tageszeit jetzt Zufallszahlen Generation und ähnlich instabil von ihrer Natur abhängen . Dinge im Allgemeinen. Wir können stabile Abhängigkeiten definieren, da Abhängigkeit nicht volatil ist. Es mag seltsam klingen, aber es ist ziemlich einfach und nützlich, also bleiben wir bei der Definition. Volatile Abhängigkeiten sind diejenigen, die durch die Einführung von Ebenen aus der Richtung abstrahieren wollen . Da sie instabil sind, müssen wir zumindest eine Möglichkeit haben, sie durch Testverdoppelungen in Komponententests zu ersetzen. Andernfalls können wir mit einer ungetesteten BLE-Anwendung enden. Denken Sie daran, dass Sie eine Anwendung testable behandeln können, bis ihr Design es erlaubt, Unionstests zu schreiben . Wenn eine Anwendung nur Integrationstests zulässt, sollte sie als ungetestet ble betrachtet werden. Lassen Sie uns das Thema Ernährung erarbeiten, indem wir sehr nahe Begriffe lernen. I o. C und D I. Wir werden in der nächsten Vorlesung darüber sprechen 37. 05 IoC und Definitions: Dieser Vortrag trägt den Titel Definitionen Off Fire C und D I. In der Vorlesung, in der wir den Begriff der Abhängigkeiten diskutierten, sahen wir dieses Diagramm. Wenn Sie genauer hinschauen, werden Sie feststellen, dass Mogul A eine Beziehung zwischen der Komposition und der Schnittstelle hat. Es bedeutet, dass wir das Modul B als Implementierer von dieser Schnittstelle injizieren müssen. Irgendwie demonstriert dieses Beispiel, was Abhängigkeit ist. Injektionsabhängigkeit Injektion ist eine der wichtigsten Begriffe wird in diesem Abschnitt zu verwenden . Lassen Sie uns also trennen Abhängigkeits-, Injektions- und Abhängigkeitsinversionsprinzip, um Missverständnisse aus diesen eng miteinander verbundenen Konzepten zu vermeiden . Es gibt tatsächlich einen anderen allgemeinen Begriff in der Version der Kontrolle, und Sie sollten auch den Unterschied zwischen diesem Begriff und den vorherigen beiden, über die wir gesprochen haben, verstehen . Also lassen Sie uns Definitionen zu diesen Begriffen geben, und wir werden vom IOC beginnen. Inversion of Control ist ein sehr allgemeiner Begriff, der die beweglichen Beziehungen zwischen einem Kühler und einem Collie widerspiegelt. Ein klassischer Steuerungsfluss impliziert, dass ein Client eine vollständige Kontrolle über die Umgebung und Sequenz-Off-Aufrufe von Bibliotheksmethoden hat . Die Inversion der Kontrolle impliziert, dass Macaulay wir alle Bibliotheksmethoden implizieren können, wenn wir sagen Aufruf. Übernehmen Sie die Kontrolle über einige Erkältungen zwischen der Farbe und dem Anruf. Die einfachste Form einer neuen Version der Steuerung sind Cold Backs. Die Hauptidee eines Callbacks besteht darin, einen Weg für einen Aufruf zu bieten, um eine Farbe zurück zu rufen. Deshalb gibt es einen sehr wichtigen Unterschied zwischen den regulären Bibliotheken und Frameworks. Frameworks regeln den Client. Coat Frameworks stellen Blöcke bereit, die nur Feld von Kunden sein müssen. Frameworks haben auch die Kontrolle über die Umgebung. Dies ist die Umkehrung der Kontrolle in der Handlungsabhängigkeit. Inversionsprinzip ist eine detailliertere Version von der Inversion des Steuerbegriffs D. I. P. P. Concretize ist, dass High-Level-Module nicht von Low-Level-Modulen abhängen sollten und so weiter. Die Umkehrung der Kontrolle ist eine Frage des Prinzips. In gewissem Sinne, nach der Definition von der Abhängigkeit Injektion von Mark Semen in seinem Buch Dependance Injection in Punktnetz gegeben , die Air Command Ihnen sehr viel. Dependency Injection ist ein Satz von Software-Design-Prinzipien und -Muster, die es uns ermöglichen, lose gekoppelten Code zu entwickeln. Zur gleichen Zeit müssen Sie verstehen, dass ich sehen kann ohne d I IOC ohne sterben möglich ist weil wir die Implementierung ändern können, indem wir uns auf Unterklassening verlassen, zum Beispiel durch das Abspielen des Template-Musters , die früher diskutiert wurde. Dennoch besteht der wichtigste Weg, um die Inversion der Kontrolle durchzuführen, darin, Abhängigkeitsinjektionstechniken zu antworten . In der nächsten Vorlesung sehen Sie ein Beispiel für die Verletzung des Tages P. 38. 06 DIP Violation: Hier ist eine einfache Dama, die das Wesen eines Problems demonstriert. In diesem Fall haben Sie eine Klasse namens Divergence Checker, und hier ist, was es tut, um physische Geräte, die durch zwei Klassen dargestellt werden, Begegnung und steuerliche Registrierung. Äh, das ist ein Fall aus meiner Praxis in Russland. Wenn wir etwas verkaufen, müssen wir den Verkaufsvorgang in einem speziellen Gerät namens Fiscal Registration registrieren. ER in meinem Fall ein separates Gerät haben, wird in meinem Fall ein separates Gerät haben,das Verschlüsselungs- und Entschlüsselungsvorgänge durchführt und leider die Verantwortung von einer steuerlichen Registrierung verdoppeln muss, wobei alle Details über Zellen in Sicherheit. Folglich müssen wir regelmäßig überprüfen, ob es keine Divergenz zwischen den Zählern einer Steuerregistrierung und dem speziellen Gerät gibt , das hier durch die Zählerklasse repräsentiert wird, um die Kontrolle durchzuführen . Ich habe diese Klasse jetzt implementiert. Diese Quest hat logischerweise Abhängigkeiten. Es hängt von einem Zähler und steuerlicher Registrierung ab. ER, diese Klassen direkt mit physischen Geräten in der realen Welt gesprochen, das Spiel Divergenz Checker enthüllt mehr als eine öffentliche Methode, aber in diesem Fall ist es genug, um die einzige, die diese Methode tatsächlich überprüft. Wenn es eine Divergenz zwischen Zählern von zwei Geräten gibt. Diese Methode verwendet beide Abhängigkeiten. Es dauert zwei Zähler von einem Gerät und logisch gleichen Zähler von einem anderen Gerät, aber dann überprüft es nur. Wenn entsprechende Werte gleich sind, wir an, wir wollen einen Komponententest für die Köpfe Divergenzmethode schreiben. Wie werden wir dies mit dem aktuellen Design zu tun, gibt es keine Möglichkeit, einen Gewerkschaftstest zu schreiben, um Divergenz zu erlangen. Checker Klasse ist eng mit dem Zähler und steuerliche Registrierung gekoppelt. ER, diese Abhängigkeiten sind instabil oder volatil, da sie riel physikalische Geräte darstellen. Physikalische Geräte sind immer geneigt Zehe instabil ba Haar. Deshalb können wir keine vertrauenswürdigen Komponententests schreiben. In der nächsten Vorlesung werden wir uns drei Möglichkeiten zur Anwendung von Abhängigkeitsinjektionen ansehen, um das Problem zu beheben. 39. 07 Refactor: eines besseren Designs mit der a: Die Ursache des UN-testbaren Designs ist in diesem Fall, dass diese Klasse unehrlich ist. Es belügt seine Kunden. Es lügt über die Tatsache, dass es muss. Abhängigkeit ist es liegt, indem sie sie versteckt. Der erste Weg, um das Problem zu beheben, besteht darin, Abhängigkeit sichtbar zu machen. Es gibt drei Hauptwege, um diese Konstruktorinjektion, Eigenschafteninjektion und Methodeninjektion zu erreichen . Konstruktorinjektion ist, wenn die Anforderungsabhängigkeiten über den Konstruktor übergeben werden. So der offensichtliche Reflektor und kann getan werden, ist dies. Das erste, was wir tun müssen, ist eine Szene zu schaffen, die als Grenze zwischen der Hauptlogik und externen Geräten dienen wird . Jetzt können wir unseren Re-Factoring-Prozess fortsetzen. Jetzt kann ein Client den Gewinn nicht erstellen, der gegen Checker teuer ist, ohne an Abhängigkeiten zu denken. Ein Kunde sieht sie und muss entscheiden, was Passan ist. Die Verantwortung wird auf die Seite des Kunden verlagert, und das ist gut. Jetzt können wir einen Komponententest schreiben, der diese Abhängigkeiten durch Testverdoppelungen ersetzt, die unter der vollständigen Kontrolle des Client-Codes stehen . Bevor Sie einen Komponententest schreiben. Schauen Sie sich die anderen beiden Optionen Eigenschafteninjektion und Methode Injektion. Zuerst schauen wir uns an, wie Luke mit einer Eigenschafteninjektion genannt wird. - Der Unterschied zwischen dieser Option und der vorherigen besteht darin, dass der Client-Code die Abhängigkeit zurücksetzen kann , wann immer er gleichzeitig möchte. Aus der Perspektive kann ein Client nun den Gain-Divergenz-Prüfer erstellen und vergessen, die Abhängigkeiten festzulegen. Danach kann es aufrufen, dass Divergenz, Methode und Gesicht als andere Referenzausnahme hat . Es bedeutet, dass die Kapselung dieser Klasse unterbrochen ist. Es bietet keine Garantien, dass seine Methoden wie erwartet funktionieren. Eine weitere Möglichkeit besteht darin, die Abhängigkeiten in der Methode anzufordern, wo sie benötigt werden. Es mag wie ein bisschen seltsam aussehen, aber es ist absolut gültige Option. In diesem Fall kennt der Client-Code keine Abhängigkeiten, bis er die Methode aufruft. Dieses Design bewahrt die Verkapselung. Es bietet Garantien, dass sie Divergenz haben. Die Methode funktioniert wie erwartet. In jedem Fall. Lassen Sie uns einen Komponententest schreiben, die Richtigkeit der Köpfe Divergenz Methode Gradvalidiert Grad . Der Tod vergeht. In dieser Vorlesung haben Sie ein einfaches Beispiel für die Anwendung der Abhängigkeitsinjektionstechniken dort gesehen, wirklich einfach. In größeren Beispielen bleiben die Techniken unverändert, bevor sie fortfahren. Ich möchte eine Zusammenfassung der dreitägigen Techniken geben, die wir gerade in der nächsten Vorlesung angewendet haben 40. 08 DI: Dieser Vortrag trägt den Titel D. I. Techniques. Konstruktorinjektion impliziert, dass Abhängigkeiten über den Konstruktor übergeben werden. Der vorteilhafteste Aspekt der Konstruktorinjektion ist, dass sie die Varianz des Objekts schützt , das das Objekt will. Erstellen ist immer ungültiger Status. jedoch Sie sollten sichjedochder folgenden möglichen Fallstricke bewusst sein. In großen Systemen neigt die Konstruktorinjektion zu einem Kamel. Acht viele Abhängigkeiten. Möglicherweise sehen Sie mehr als drei Abhängigkeiten, die über den Konstruktor angefordert werden. jedoch Dies istjedochnicht der Nachteil der Konstruktorinjektion selbst. Höchstwahrscheinlich ist dies ein Lächeln, dieses R P zu verletzen. Falls ein Konstruktor mehr als drei oder vier Abhängigkeiten benötigt, sollten Sie die Möglichkeit in separate Klassen extrahieren. Manchmal kommt es vor, dass mehrere Abhängigkeiten dazu neigen, zusammen weitergegeben zu werden. Hier ist ein Code-Snippet, das zeigt, dass, wenn Ihr Modell Abhängigkeiten übernimmt und sich vorstellen kann, dass viele andere Ansichtsmodelle dieselben Abhängigkeiten annehmen. In solchen Fällen wäre es ratsam, ein Containerobjekt für sie zu erstellen und zu verlangen, dass Containerobjekt in den Konstruktoren am besten ist. Scheint, als hätte es keine Wirkung, aber es ist immer eine gute Idee, Objekte zu verbinden, die in vielen Fällen zusammenpassen. Eines Tages möchten Sie eine benutzerdefinierte Validierung wichtig einführen, die verwandt ist, erzählte den Abhängigkeiten oder so etwas, aber höchstwahrscheinlich mehr als für Parameter ist der Geruch dieser Artie-Verletzungen, sagte ich. Werfen Sie einen genaueren Blick auf die Verantwortlichkeiten einer Klasse, die so viele Abhängigkeiten erfordert . Ein weiterer interessanter Fall betraf dies sozusagen. Nicht obligatorische Abhängigkeit ist wie ein Logger. Es ist eine gültige Lösung, mehrere Konstruktoren verfügbar zu machen, denen einige die Standardimplementierungen von den Abhängigkeiten sagten. Sie können hier ein Beispiel sehen. In diesem Fall können Sie im Komponententest den I-A-Logger ersetzen Durch einen verdammten, es ist doppelt, was es nichts tut, während im Produktionscode, Clients können einfach den Standardkonstruktor verwenden, da in den meisten Fällen niemand kümmert sich um die Protokollierungsmechanismen. Ein weiteres Schönes, auf das Sie stolpern könnten, ist, dass solche Frameworks, wie das Entitätsframework oder andere objektrelationale Mapper, von Objekten verlangen können, dass sie einen öffentlichen Standardkonstruktor haben. In einem solchen Fall werden Sie gezwungen sein, die öffentliche Standardkonstruktion freizulegen. Andernfalls erhalten Sie eine Ausnahme in der Rundenzeit. Natürlich können Sie überlegen, einen Wrapper um ein solches Objekt zu schreiben, das sehr nahe an einem Bounder eines Systems steht so die Kapselung erhalten bleibt. Wenn eine bestimmte Abhängigkeit nur eine einzige Methode verwendet wird, sollten Sie diese Abhängigkeit vom Konstruktor entfernen und als Argument der Methode angefordert werden , die sie sicherlich benötigt und nicht bereitstellen kann, ohne sie dient. Mit anderen Worten, erwägen Sie, die Methode Injection Eigenschaft Injection zu verwenden, impliziert die Abhängigkeiten über Eigenschaften mit öffentlichen Settern. Es ermöglicht, die Abhängigkeit während der gesamten Lebensdauer des Objekts zu ersetzen. Die Flexibilität ist der Hauptvorteil. In diesem Fall jedoch so schwer, sind die Nachteile jedoch so schwer,dass wir uns bemühen sollten, auf diese Art und Weise der Injektion Onley im Falle der nicht verpflichteten verlassen . Unabhängigkeit ist so ein Slagers. In solchen Fällen sollte es immer eine Standardimplementierung außerhalb der Abhängigkeit geben, und sie sollte in einem Standardkonstruktor oder direkt in der Eigenschaft festgelegt werden. Siehst du das Beispiel auf der Folie? Dieser goldene Zusatz verlässt sich auf den Seeshop. sechs Features aus Eigenschaftsinitialisierung. In allen anderen Fällen sollten Sie die Eigenschafteninjektion vermeiden, da sie die Kapselung leicht von einer Klasse abbrechen und die Abhängigkeit verborgen machen kann. Unabhängigkeit wird ausgesetzt, da Eigenschaften verborgen sind, weil niemand verpflichtet ist, sich an alle internen Details einer Klassenmethode zu erinnern . Injektion ist eine interessante Technik. Abhängigkeiten, bei denen es sich um festgelegte Brandeigenschaften oder Konstruktoren handelt, werden normalerweise von vielen Methoden während der gesamten Lebensdauer des Objekts verwendet. Manchmal und Implementierung lee variieren jedoch von einem Aufruf zu einem anderen Aufruf oder wenn die Methode statisch ist, zum Beispiel erfordert die Umwandlung einer Währung in eine andere ein Objekt, das die Rate erhält. Ein ähnliches Beispiel ist der I-Formatierungsanbieter , der in solchen Methoden wie Doppelbalken benötigt wird. jedoch Denken Siejedochzweimal vor der Implementierung der Methodeninjektion nach. Wenn Sie eine Abhängigkeit direkt an eine Mathematik übergeben möchten. Nur weil Onley diese Methode unter 20 anderen Methoden diese Abhängigkeit verwendet, dann ist dies ein Geruch von einer sirupigen Verletzung, vielleicht eine separate Verantwortung, die sich innerhalb des Glases versteckt. Ein weiteres Problem bei diesem Ansatz ist, dass IOC-Container die Abhängigkeiten nicht automatisch injizieren können . Zwei Methoden, die ich sehe, sind Werkzeuge, die dazu beigetragen haben, den Prozess der Abhängigkeitsinjektion zu automatisieren , und wir werden es in diesem Abschnitt weiter diskutieren. Okay, jetzt haben wir die Idee der Abhängigkeitsinjektion und drei Haupttechniken. Diese einfachen Techniken haben grundsätzliche Auswirkungen. Im Rial können lebende Dinge etwas schwieriger sein, als diese Vorlesung verkauft wurde. Die Probleme, es Schönheit, die architektonische Ebene. Lassen Sie uns über architektonische Implikationen aus der Inversion der Kontrolle Independence Injektion in der nächsten Vorlesung sprechen. 41. 09 architektonische Implikationen: Dieser Vortrag trägt den Titel „Architektonische Implikationen“. Inverting Dependance ist das Mittel, mit dem wir Grenzen zwischen Softwaremodulen schaffen . Wenn wir eine Grenze erstellen möchten, wählen wir aus, welche Abhängigkeiten gegen den Fluss der Kontrolle invertiert werden sollen. So zeigen sie alle in die gleiche Richtung über die Begrenzungsgrenzen, wie auf dieser Folie aus der Art und Weise, wie wir Keulen erstellen. Ein Plug In ist ein Modul, das anonym von einem anderen Modul aufgerufen wird. Mit anderen Worten, der Kragen hat keine Ahnung, wer oder was es in diesem Fall nennt. Das Modul weiß es nicht, dass es das Modul aufruft. Als Keulen können unabhängig eingesetzt werden und darüber hinaus entwickeln ihre selbständig eine ble. Wir teilen das System durch Grenzen und invertieren dann. Die Abhängigkeit ist, dass diese Grenzen überschritten, so Keulen definieren die Grenzen von Ihrem System. Das alte Modell der Erstellung von Softwaresystemen mit drei Ebenen ist, dass datenzentrierte Motile in solchen Architekturen der Datenbank und dieses Schema ist das Zentrum des Systems. Es treibt alle anderen Teile des Systems an. Offen gesagt, dieser Ansatz ist noch am Leben und könnte manchmal von Vorteil sein. Aber jetzt waren Tage geneigt, Datenbasis und Ihre Is Tools zu behandeln, die in datenzentrierten Architekturen ersetzt werden können. Ein wesentlicher Teil der Hauptlogik wird am Datenbankstandort implementiert werden, so dass es in gespeicherten Prozeduren mit einer Sprache wie Fortsetzung implementiert wird. Das Hauptproblem bei diesem Ansatz ist, dass datenverarbeitungsbezogene Sprachen wie Sequel , die sehr effizient in der Verarbeitung von Schülern sind, nicht entwickelt wurden, um Geschäftslogik zumindest bedeutende Teile der Geschäftslogik zu implementieren . Datenbankbezogene Sprachen sind sehr schlecht auf Funktionen, die es erlaubten, Beziehungen zwischen Domänenobjekten zu motilieren . Dies ist einer der Hauptgründe, warum sich die weltweite Entwicklergemeinschaft auf einen anderen Ansatz verlagerte , bei dem die Datenbank als kleinste Details behandelt wird. Und hier erreichten wir den Punkt, an dem wir die Auswirkungen der Architektur auf Basis von Plug Ins weiter analysieren . Hier ist ein Diagramm, in dem sich die Domäne in der Mitte befindet. Wenn wir Datenbanken und Sie weisen Werkzeuge behandeln, die meist irrelevant sind, kommen wir auf die Idee, dass der Kern der feinen Anwendung die Domänenlogik ist. Demand-Logik ist der stabilste Teil des Systems. Scheint, dass Domänenrichtlinien relativ selten geändert werden. Zum Beispiel ändert sich das richtige Teil viel häufiger. Beachten Sie, dass alle Abhängigkeiten auf die Domäne zeigen. Wenn Sie dieses Diagramm vergrößern, vorausgesetzt, dass diese großen Höhlen aus vielen Objekten bestehen, erhalten Sie das folgende Diagramm. Ich habe dieses Diagramm direkt aus dem Block von Mark Semen. Ich bemerkte, dass die ganze Abhängigkeit immer noch in Richtung der Mitte der Anwendung zeigt. Wenn Sie die Layer in dieses Diagramm eingeben, erhalten Sie Folgendes. Dieses Diagramm zeigt, was Architekturen Zwiebelarchitektur nennen. Es gibt andere ähnliche Begriffe, wie sechseckige Architektur und Ports und Adapter. Architektur. All diese Begriffe bedeuten im Wesentlichen das Gleiche. Sie sind alle über die gleichen Ports. All das scheint, dass wir durch Extrahieren in Gesichter und Adapter eingeführt werden, sind Plug Ins, die von der Grenze aus einem System in großen Systemen kommen. Der Graph der Abhängigkeiten ist sehr groß, obwohl Sie sich bemühen sollten, den Graphen so flacher zu halten, wie Sie können, auch wenn Sie den Graph flach halten. Sie können auch mit dem Problem konfrontiert werden, die Lebensdauer von Abhängigkeiten zu steuern. Dies führt zu einer interessanten Frage. Wer dafür verantwortlich ist, die Kontrolle über die Abhängigkeiten Instanz zu behalten, siehe ation in ihrem Leben und dann schwor, ist offensichtlich. Jede Anwendung beginnt mit der Hauptmethode. Entwickler beziehen sich häufig auf Maine nicht auf einen physischen Einstiegspunkt, sondern auf einen infrastrukturellen Punkt, an dem alle Beziehungen zwischen Abhängigkeiten eingerichtet werden sollten . Die Idee, alle Abhängigkeiten an einem einzigen Ort in Maine einzurichten, entspricht tatsächlich dem Single Choice Prinzip, das im OCP-Abschnitt diskutiert wurde. Maine ist der einzige Ort, der alles über die Strafen in ihren Beziehungen weiß . Es bedeutet nicht unbedingt, dass alle Abhängigkeiten in Maine inst enshi atiert werden. Einige von ihnen sind vielleicht eine Instanz, die sie in Maine hasste. Tatsächlich wird der andere automatisch in der Laufzeit erstellt, entsprechend der Einrichtung in der Hauptpartition. In dieser Vorlesung haben wir herausgefunden, dass das wichtigste der infrastrukturelle Punkt ist, an dem wir alle Abhängigkeiten aufbauen . Jetzt müssen wir verstehen, wie wir sie in der Praxis einrichten können. In der nächsten Vorlesung werden wir die Reinheit genauer betrachten. Ich und ich sehen Container. Sie sind mit zwei Haupttechniken verwandt, die es ermöglichen, die Abhängigkeiten einzurichten und sie richtig zuinjizieren sie richtig zu 42. 10 reinen DI und IoC: Dieser Vortrag trägt den Titel Pure D I und ich habe Container gesehen. Hoffentlich verstehen Sie jetzt die möglichen Schwierigkeiten, denen Sie begegnen können, wenn Sie die Abhängigkeitsinjektionstechniken anwenden . Grundsätzlich gibt es zwei Möglichkeiten, mit Abhängigkeitsinjektion umzugehen. Die erste 1 besteht darin, alle Abhängigkeiten und Abhängigkeiten von Abhängigkeiten manuell zu erstellen und sie explizit zu injizieren, indem der neue Operator aufgerufen wird, der den Konstruktor übergeben wird. Alle erforderlichen Abhängigkeiten Mark Semen, verwies auf diesen manuellen Ansatz als der so genannte arme Mann sterben im Jahr 2014 Mark scheinbar Ruhestand, ersetzt ihn durch einen neuen Begriff reine sterben. Der Grund dafür war, dass der arme Mann D I etwas abfällig oder zumindest unattraktiv klang. Es hat auch nicht die Nachricht mitgeteilt, die ohne einen D. sterben. Ein Container ist in vielen Fällen besser als das Auge innerhalb des IRC-Containers. Im Gegenteil, es klang, als wäre es nicht so gut. Das war ein Zitat aus dem Mark Seamans Block, Bost. Ich zeige Ihnen ein Beispiel für reinen sterben aus einer Buchungsanwendung oder geschrieben von Mark Semen. Sie können hier in den wichtigsten Lots von Code sehen. Dies ist ein bekanntes triviales Beispiel, das zeigt, wie schwierig es sein kann, alle Abhängigkeiten manuell einzurichten und zu verfolgen , indem wir uns auf ein reines D I verlassen Deshalb haben wir vollwertige IRC-Container. Lassen Sie uns zurück zu Folien die zweite Möglichkeit, mit den Augen umzugehen, um sich auf einen IOC-Container zu verlassen . Was ist also ein IRC-Container oder ein D-I-Container? Mit anderen Worten, ich sehe, dass Container ein Framework ist, das hilft, Abhängigkeit anzuwenden. Injektion. Dies ist das Hauptmerkmal des Fannie Eisbehälters. Ich sehe, dass Container-Abhängigkeiten automatisch von Kurscontainern die Möglichkeit bieten , sie durch Konfigurieren dieser Abhängigkeiten einzurichten. Wenn der Client-Code also einen Container auffordert, eine bestimmte Abhängigkeit aufzulösen, weiß ein Container, wie diese Abhängigkeit erstellt werden kann. Es weiß, wie man die Abhängigkeiten erstellt, die Soldat zwangsweise Alden Zubehörabhängigkeit erstellt , bis es erstellt. Sie haben eine beantragt. Auf der Folie sehen Sie ein Diagramm mit Typabhängigkeiten. Stellen Sie sich vor, wir rufen Nizer Container an, um das Hauptmodell Ihres Modells zu lösen. Mit anderen Worten, wir wollen von einer Krankenschwester einen Container, um eine Instanz aus der Hauptklasse Ihrer Motilklasse zu bekommen. Die Haupt Ihrer Mittelklasse hängt von dem I-Kunden in Gesicht. Er nimmt diese Schnittstelle in seinem Konstruktor. Um das Hauptansichtsmodell zu erstellen, wird der IOC-Container weiter suchen Um herauszufinden, wie die I-Kundenschnittstelle aufgelöst werden kann, wird der Container die Kundenklasse finden, die diese Kundenschnittstelle implementiert, so dass der Container versuchen wird, erstellen Sie die Kunden-Quest. Um die Kundenklasse zu erstellen, der Container an seinen Konstruktor übergeben, den ich Kunden-Repository habe, da die Kundenklasse von dieser Schnittstelle abhängt, um das I-Kunden-Repository aufzulösen, wird IOC weiter tiefer graben und finden Sie den Implementierer dieser Schnittstelle. Es wird feststellen, dass ich Kundenschnittstelle durch das Kunden-Repository aufgelöst werden kann. Aber um das Kunden-Repository zu erstellen, den Container und müssen das I. D Gateway auflösen , scheint das Kunden-Repository davon abhängt und schließlich stirbt. Der Container erstellt das DB-Gateway und nach diesem Container erstellt Kunden-Repository als Kunde und dann die Haupt Ihres Modells. So haben unsere Seecontainer eine rekursive Lee Abhängigkeiten aufgelöst. In diesem Diagramm wird der IOC-Container selbst nicht angezeigt. Wenn wir hier setzen, gibt es eine Container-Klasse. Es wird von all diesen Arten abhängen. Es muss über alle Abhängigkeiten wissen. Es ist die Aufgabe des Containers, seine Verantwortung. In der nächsten Vorlesung möchte ich Ihnen schnell zeigen, wie Sie eine naive Implementierung aus einem einfachen IOC-Container erstellen , um den grundlegenden Mechanismus ihrer Funktionsweise zu klären. 43. 11 Erstellung eines einfachen a: Lassen Sie uns einen sehr einfachen, den ich sehe Container implementieren. Zuerst werde ich eine Karte zwischen Typen definieren. Diese Karte enthält 1 zu 1 Beziehungen zwischen Abhängigkeiten. Hier ist es natürlich. Wir müssen eine öffentliche Methode zur Verfügung stellen, die es Clients ermöglicht, Abhängigkeiten zu registrieren. Dies ist eine generische Methode, die zwei Arten nimmt und sie zu unserer Karte hinzufügen. Es gibt nichts anderes zu erklären. Lassen Sie uns eine öffentliche Methode zum Auflösen von Abhängigkeiten erstellen. Diese Methode ist auch generisch. Der T-Parameter ist der Typ, den ein Client aufgelöst werden möchte. Diese Methode ruft eine andere Methode auf, die privat ist und die gesamte Logik aus dem Container implementiert . Hier erhalten wir den entsprechenden Typ aus der Karte. Wenn wir es nicht gefunden haben, werfen wir eine Ausnahme. Beachten Sie, dass wir einen Typ haben. Dies ist keine Instanz von einem Typ. Es ist der Deskriptor. Ich sehe, dass Container eine Reflexion stark verwendet. Ohne Reflexion. Es ist unmöglich, Typabhängigkeiten zu analysieren und richtig zu erstellen, mit einem Typ, den wir anfordern können. Es sind Konstruktoren. Wir implementieren einen sehr einfachen IOC-Container. Aus Gründen der Einfachheit bekomme ich einfach den ersten Konstruktor von einem Typ, der Deskriptor von einem Typ hat, den wir seine Parameter anfordern können . Wenn es keine Parameter gibt, erstellen wir einfach eine Instanz aus einer Abhängigkeit und geben sie zurück. Andernfalls müssen wir sie lösen. Rekursiver Lee. Also müssen wir folgendes tun, diese kalte rekursive Lee versucht, alle Konstruktorparameter aufzulösen . Am Ende möchten wir eine Instanz aus einer Abhängigkeit erstellen, so dass wir den Konstruktor aufrufen, der die Parameter übergeben. Los geht's. Vertrauen Sie mir, Dies ist ein sehr einfacher RC-Container. Nichts mehr, nicht weniger. Lasst uns versuchen, es zu benutzen. Nehmen wir an, wir wollen das Hauptansichtsmodell auflösen. Ich habe Ihnen auf dem Diagramm in der vorherigen Vorlesung gezeigt. Bevor Sie das Hauptmodell lösen, müssen wir den IOC-Container einrichten. Also sind wir registriert. Abhängigkeit ist eins nach dem anderen, Hauptansichtsmodell ist auf sich selbst in Flächen zugeordnet werden entsprechenden Implementierer Z zugeordnet. Danach können wir die Hauptansicht Modell Grade auflösen. Ich sagte, ein Breakpoint und führt zu Buck das Programm, um sicherzustellen, dass alles gut funktioniert. Ja, Sie können sehen, wo der Bremspunkt ist. Und wenn ich mit dem Mauszeiger über die Hauptansichtsmodellinstanz führe. Ich sehe, dass es erfolgreich erstellt wurde. Alles funktioniert gut. Also, das war die Essenz von jedem. Ich sehe Container. In der nächsten Vorlesung zeige ich Ihnen eine Anwendung, die mit NRC-Container erstellt wurde, um zu demonstrieren, wie reale Szenarien aussehen können. 44. 12 Demo einer echten World App wurde mit einem a erstellt: hier sind eine einfache Anwendung implementiert, die es ermöglicht, die am wenigsten ausstehenden Studenten zu verwalten. Die Lösung besteht aus mehreren Projekten. Der Studentenmanager ist eine WP F-Anwendung, die Ansichten enthält, und ich sehe Container-Bootstrapping. Wenn Sie mehr Granularität wünschen, können Sie die Bootstrapping-Fläche in einer separaten Baugruppe beibehalten. Indian Framework ist der Rahmen, der das MVV n Muster unterstützt und in diesem Fall bietet eine einfache Augen, einen Behälter. Schauen wir uns die Anwendung genau diese Anwendung unterstützen einfache Crowd-Operationen . Dies ist eine WP F-Anwendung und es wird mit ihnen V V M Pattern implementiert. Dies bedeutet besser drei Teile motile Ansicht und über mobile Ansichten werden durch Beispieldateien dargestellt . Ansichten stellen also dar, warum jeder von Ihnen ein entsprechendes Ansichtsmodell hat, das entsprechend benannt ist. Beispielsweise hat die Hauptansicht die entsprechende Hauptansicht Ihres Modells. Die Elemente sind an Eigenschaften und Methoden eines entsprechenden Ansichtsmodells gebunden. Dies wird über einen speziellen Mechanismus in WP F namens Datenbindung erreicht. Zum Beispiel, wenn wir Benutzer auf Hinzufügen Schaltfläche in der Hauptansicht klickt, wird dieser Aufruf durch die Anzeigenstudenten-Methode behandelt werden, die zum Hauptansichtsmodell gehört. Die Replikation wird mit Hilfe eines kleinen Frameworks erstellt, das ich auch selbst geschrieben habe, um zu demonstrieren, wie Frameworks bieten. Diese scheinen für Blackens bemerken, dass das Hauptansichtsmodell drei Argumente benötigt, die über den Konstruktor übergeben werden . Die erste Abhängigkeit ist die Schnittstelle, die es ermöglicht, Crowd-Operationen über Studenten durchzuführen. Die Datenbank wird in diesem Fall durch eine XML-Datei dargestellt. Der Einfachheit halber habe ich keinen Aggregator erlaubt, Nachrichten zwischen irgendwelchen Komponenten aus einem System zu übergeben. Auch hier sind diese Details für unsere Diskussion nicht sehr wichtig. Die letzte Abhängigkeit stellt eine Szene dar, die vom Framework bereitgestellt wird, mit der neue Ansichten aus Ansichtsmodellen geöffnet und geschlossen werden können . Wenn Sie eine vergessene Anwendung erstellen, müssen Sie Ansichten verbinden und neu erstellen. Irgendwie ist ein wichtiger Weg, Stattdessen aß sie eine Ansicht und dann von Ihnen Modell und eine andere ist das Gegenteil. Zuerst kreativ Sie modellieren und dann zu finden, und stattdessen aß sie eine entsprechende Ansicht. Unser Framework unterstützt beide Modelle. Schauen wir uns jetzt das Framework an und wie unsere Anwendung Bootstrap bekommt. Dieser Rahmen. Es ist das Framework, das es ermöglicht, Ihre Modelle automatisch zu vernetzen und sie mit Ansichten zu verbinden, um diese Funktion bereitzustellen. Ein Framer muss wissen, welche Baugruppen durchsucht werden sollen, indem er nach einem entsprechenden Modell sucht. Die Suche basiert auf der Namenskonvention. Wenn eine Hauptansicht erstellt wurde , sucht ein Framework nach einem Mann Ihres Modells in den Baugruppen. Hinzu kommt, dass durch die Anwendung, die auf diesem Rahmen beruht geleast. Hier ist der Chunk off Gold , der durch Assemblys scannt und nach einem View-Modell sucht und nun den relevantesten Teil zu unserem Thema. Die Bootstrap ER-Basis ist ein großer Anschein, der uns ein abstraktes Glas ausgesetzt ist, das im Haupt aus implementiert werden muss . Die Anwendung, die sich auf das Framework verlassen möchte, erlaubt Framework Toe automatisch Abhängigkeiten aufzulösen, z. erlaubt Framework Toe automatisch Abhängigkeiten aufzulösen, z.B. Ausgewählte Assemblys sollten vom Client überschrieben werden. Es sollte eine vollständige Liste von Assemblys zurückgeben, die Abhängigkeiten enthalten. Aber sie erhalten Instanz, ist eine abstrakte Methode, die vom Framework verwendet wird, um die Abhängigkeiten aufzulösen. Daher sollte ein Client diese Methode mit einem IRC-Container überschreiben, den er konfigurieren für pünktlich verwenden möchte und konfigurieren für die Entwurfszeit den eisigen Container einrichten sollte und sie müssen von einem Client geschrieben werden. Die Hauptmethode eines Clients sollte eine Startmethode aufrufen, die das Framework einrichtet. Diese Methode richtet alle internen Dinge aus einem Framework. Und dann können Sie auch feststellen, dass die Methode zum Auflösen einem Zustand des öffentlichen Feldes aus der IOC-Klasse zugewiesen ist . Diese Klasse stellt einen Service-Locator dar. Mit dieser Klasse können Sie von jedem gewünschten Ort aus nach Abhängigkeit suchen. Dies ist notwendig, weil es ein paar Stellen im Rahmen gibt, an denen diese Methode verwendet wird . Andernfalls hätte das Framework keinen Zugriff auf den Mechanismus von der Strafe. Auflösen von Bereitstellung durch den Client. Denken Sie daran, dass Sie den Container nur aus dem infrastrukturellen Code aufrufen sollten. Wenn Sie den Code der Luft gesehenen Clients explizit aufrufen, müssen Sie wahrscheinlich die Abhängigkeiten ausblenden. Schauen wir uns die Seite des Klienten an. Abgelehnt erbt von der Bootsabisolierbasis. Es verwendet den alten und leistungsstarken RC-Container namens Castell Windsor. Der Windsor Container ist als Feld definiert. Die ausgewählten Baugruppen kehren zu Baugruppen zurück, montieren aus Verwendung und zeigen Modelle an. Die configure around time Instanz schattiert den Container, aber dann registriert es die erste Abhängigkeit mithilfe des Windsors AP, werde ich sagen, dass, wenn ein Container zur Auflösung des I-Datenanbieters von Studenten angefordert wird , Es sollte den Students XML-Provider als Implementierung der generischen Schnittstelle übergeben. Außerdem sagen wir, dass das Erstellen des XML-Anbieters der Studenten einen Container den Rap über XML String als Argument an den Konstruktor übergeben sollte . Ich habe Integra, Gator und ich Fenstermanager sind danach registriert. Sie sind auf die gleiche Weise registriert, bis auf ein Detail, das ihre Lebenszeit betrifft. Die Lifestyle Singleton-Methode stellt sicher, dass der Implementierer Zoff diese Schnittstellen einmal erstellt wird und danach die gleiche Instanz überall übergeben wird. Ich habe keinen Aggregator oder ich Fenstermanager, den ich angefordert habe. Also werden sie uns gesondert und sie werden während der gesamten Lebensdauer von der Anwendung verlassen, bis die Anwendungsdomäne entladen ist. Am Ende gibt es einen Aufruf an das Register Ihrer Model-Methode. Sieh es dir an. Diese Methode fügt dem Container alle Klassen hinzu, deren Name auf Ansichtsmodell endet. So wird die Architektur mit Plug Ins und den Rappern implementiert, um den Zeitausführungsfluss zu verstehen . Ich zeige Ihnen das folgende Diagramm-Anwendungsmodell wird durch das W-Paar-Framework definiert. Es definiert ein Startereignis. Diese Anwendung abonniert sie und der Handler kann als Einstiegspunkt oder Hauptmethode behandelt werden . Dieser Handler erstellt den Bootstrap ER , der von der Stripper-Basis erbt, in unserem kleinen, um, Vivian Framework definiert um, ist. Und es geht um die Startmethode. Die Start-Methode ruft die Konfiguration um die Zeit auf, führt zu dem Prozess der Einrichtung des eisigen Containers. Die Castell Windsor in unserer Anwendung WP von bietet den Punkt, wo wir die erste Ansicht gesagt , die geöffnet werden muss. Ich habe es dir nur nicht gezeigt. Ich sagte es zu einer speziellen Infrastruktur von Yukol Shell-Ansicht. Diese Ansicht ist ein Benutzersteuerelement, das andere Ansichten kostet. Shelve Sie verwenden einen speziellen automatischen Verdrahtungsmechanismus, Off-View-Modelle, die vom indischen Framework bereitgestellt werden. Da alle Abhängigkeiten und alle Assemblys für das indische Framework bekannt sind, ist es ein wenig Cades. Das Regal Ihr Modell und erstellt, warum es einen Container gibt. Die Show Ihres Modells erstellt automatisch die Hauptfigur Ihres Modells von I I C, und die entsprechenden Ansichten erstellt über spezielle WBF-Mechanismus aus Datenvorlagen. Es ist in Ordnung zu verwenden sind das Regal Ihr Modell zu sehen. Da es sich bei diesem Modell um eine reine Infrastruktur handelt, ist es nur dafür verantwortlich, die Ansichten von einer Schalenansicht abzuschalten. An dieser Stelle wird die Anwendung gestartet und das Hauptfenster ist für den Benutzer sichtbar. Wenn der Benutzer nun zum Beispielauf den at student Parton klickt zum Beispiel , ruft das View-Modell den I-Fenstermanager auf , der Teil des indischen Frameworks ist an den Typ eines Ansichtsmodells übergeben wird. Die entsprechende Ansicht aus, die geöffnet werden muss, falls bei Studenten ausgeschaltet würde, würde der Bearbeitungsschüler Ihres Modells übergeben . Und hier kommt der Rahmen ins Spiel. Es erstellt das angeforderte Ansichtsmodell. Warum das ich gesehen habe, sucht es dann den Ansichtstyp und erstellt ihn. Danach verbindet es Ansichtsmodell zu überprüfen, indem der Datenkontext von der Ansicht auf die Ansichtsmodellinstanz gesetzt wird. Schließlich ruft das Framework die W pay for Methodenshow im Fenster auf, um sie sichtbar zu machen. Hier ist der Ausführungsablauf. Beachten Sie, wie Frameworks viele Ports für die Clients Gold bereitstellen, was besagt, dass sie von Adaptern auf der Clientseite implementiert werden. Der Kundencode definiert die Geschäftslogik, die Framer seine eigene Arbeit erledigt, indem er alle erforderlichen infrastrukturellen Funktionen bereitstellt. Ihr Seecontainer übernimmt die Verantwortung, Abhängigkeiten zu schaffen und ihre Lebensdauer zu verwalten . Jedes Teil erledigt seine eigene Arbeit. Sehr nett. Wenn Sie den Persistenzmechanismus ändern möchten, kein Problem Ich habe Datenanbieter implementiert und die I. C s u Notwendigkeit eingerichtet und Sie sind fertig. Keine Probleme. Diese Demo zeigt, wie reale Welt Anwendungen vielleicht Struktur Sie dulden, Lou die Quelle Gold dieser Anwendung und startete dieses Beispiel auf Ihrem eigenen Kraftstoff drei. Um die Anwendung zu entlarven und Ausschau zu halten, wird in der Tiefe gebaut, bevor Sie zum Abschluss gehen. Lassen Sie uns zusammenfassen, was wir gelernt haben, um einige häufige Gerüche von jp Verletzung zu markieren. 45. 13 häufige Geräte von Smells: Diese Vorlesung trägt den Titel Gemeinsame Gerüche der AP-Verletzung. Alle häufigen Gerüche des Tages P-Verletzung nehmen ihre Wurzeln aus dem Tag p-Definition. Die I P klar besagt, dass hochrangige Politik sollte nicht auf niedrigem Niveau Details abhängen, So sind die gemeinsamen Gerüche die folgenden. Ein Schließen erstellt explizit eine oder mehrere Abhängigkeiten, die sie vor einem Client verstecken. Eine Klasse verwendet nicht-deterministische Abhängigkeit ist wie tagsüber oder zufällig. Es gibt Möglichkeiten für das Paar solche Abhängigkeiten, die oft aus dem dotnet Framework selbst kommen. Eine Möglichkeit besteht darin, eine Klasse zu erstellen, die mit nicht deterministischen Abhängigkeiten arbeitet und sie durch Integrationstests abdeckt . Und eine andere Möglichkeit besteht darin, eine Art Off-Adapter zu erstellen. Ich meine, erstellen Sie Ihre eigene Schnittstelle und implementiert in einer benutzerdefinierten Klasse, die nicht deterministische Abhängigkeiten verwendet. Dann können Sie diese benutzerdefinierte Schnittstelle im Produktionscode verwenden und durch Testverdoppelungen ersetzt , die unter Ihrer Kontrolle stehen. In Komponententests verwendet eine Klasse sehr oft angegebene Abhängigkeiten. Sie sind Singletons Single Con's Make Unit Testing. Sehr schwierig. Angegebene Abhängigkeiten von einer Klasse werden auch vor einem Client ausgeblendet Wenn also ein Abhängigkeitsstatus nicht ordnungsgemäß Instanz war, wird sich eine Klasse höchstwahrscheinlich falsch verhalten und Ausnahmen auslösen. Und so zwingt es Clients, sich ständig an versteckte Abhängigkeiten zu erinnern. Das ist fast immer eine schlechte Sache. Die Hauptidee aus dem Entfernen der D I. P-Gerüche ist, dass Sie eine Ebene in Richtung auf Make the Class extrahieren müssen, die, während die D I p abhängig von dieser Schicht in Richtung ist. Ein weiteres Prinzip, das oft hilft, ist das Prinzip der einheitlichen Verantwortung. Einhaltung des SRP hilft oft, das Extrahieren von nutzlosen Schnittstellen zu vermeiden. In der nächsten Vorlesung werden wir zusammenfassen, was wir in diesem Abschnitt gelernt haben. 46. 14 Schlussfolgerungen: Diese Vorlesung trägt den Titel Fazit. In dem Abschnitt haben Sie gelernt, was Tag sein Tag wird bedeutet, dass hochrangige Richtlinien sollten nicht von Details auf niedrigem Niveau abhängen. Es gibt zwei Haupttypen der Abhängigkeit ist stabil und instabil oder volatil. Instabile Abhängigkeiten sind diejenigen, auf die wir die Inversion der Kontrolle nicht anwenden werden. Welche Inversion der Kontrolle Unabhängigkeit Injektion sind und wie diese Vorstellungen mit dem D. I P und zueinander zusammenhängen dem D. . Drei Techniken der Abhängigkeitsinjektion Konstruktorinjektion, die in 95% der Fälle verwendet werden sollte, und Eigenschafts- und Methodeninjektion, die die Einhaltung des D. I P. führt zu einer Plug-in-Architektur, , die allgemein als die Ports und Adapterarchitektur bezeichnet wird. Dies führte uns zu der Schlussfolgerung, dass es einen einzigen Ort geben sollte, der alles über Anwendung, Abhängigkeiten und ihre Beziehungen weiß über Anwendung, , und dieser Ort ist gemacht. Wir haben auch gelernt, dass manuelle Abhängigkeitsinjektion mühsam werden kann und deshalb sehe ich Container existieren, was hilft, Abhängigkeitsinjektion zu vereinfachen. In schwierigen Fällen lernt man, wie man einen einfachen eisigen Container baut, und man sah ein Beispiel aus einer realen Anwendung, die auf einem eisigen Behälter beruht und ihn in Maine einrichtet. Und wir haben auch zusammengefasst, was die üblichen Gerüche von der Diaby-Verletzung existiert und wie man sie beheben kann. Dieser Abschnitt ist der letzte in diesem Band, das letzte Prinzipal aus dem soliden Akronym abdeckt. Im nächsten Band werden wir die Themenprinzipien diskutieren und wie sie mit soliden Prinzipien zusammenhängen. Ich warte im nächsten Abschnitt auf dich. Danke, dass Sie zugesehen haben. 47. 01 Umriss: Hi. Dies ist der letzte Spaß beim Backen Ingenieur vor Ort. Und in diesem Abschnitt werden wir lernen, wo die Prinzipien sind. Wir verweisen auf die Grundsätze, über die wir in diesem Abschnitt zu Themen sprechen weil sie die Wurzeln von all den anderen konkreteren Prinzipien sind die wir tatsächlich versuchen, mit den Materieprinzipien zu entsprechen. Wir werden vom Trockner starten. Wiederholen Sie sich das Prinzip nicht. Sie lernen die Definition der häufigsten Gerüche der Verletzung des trockenen Prinzips. Danach haben Sie die Schlüssel gelernt oder halten Sie es einfach. Dummes Prinzip. Hier werden wir über Einfachheit und Komplexität, zufällige und wesentliche Komplexität und wie Einfachheit zu erreichen sprechen. Das nächste Meta-Prinzip, über das wir reden werden, ist das junge Ich oder du wirst es nicht brauchen . Es ist mit der unnötigen Komplexität Geruch verbunden und betrifft die Vorfreude von gemeinsamen Merkmalen. Wir werden uns mit praktischen Problemen beschäftigen, denen wir gegenüberstehen und welche weiteren Konsequenzen aus der Implementierung von Funktionen, die wir eigentlich nicht brauchen. Danach werden wir über die Socke oder Trennung von Bedenken Prinzip sprechen. Dieses Prinzip beruht auf Weihrauch. All die soliden Prinzipien. Die Trennung von Bedenken ist sehr wichtig, um gut wartbare Anwendungen zu erreichen. Sie werden die gängigsten Wege sehen, um die Trennung von Bedenken zu verletzen. Prinzip Befehl Abfragetrennungsprinzip macht leichter zu begründen über. Der Code wird das Tief von Demeter diskutieren, das ist das Hauptwissen aus der Liste. Separat werden wir über das Prinzip sprechen, das Sie am wenigsten erstaunt ist. Dann werden wir das Thema Information Verstecken und Verkapselung berühren. Übrigens werde ich in diesem Abschnitt das Wortprinzip anstelle des Materieprinzips verwenden. Weiter, nur um Zeit in der nächsten Vorlesung zu sparen, erfahren Sie mehr über das Trockenprinzip. Lasst uns loslegen. 48. 02 DRY: Diese Vorlesung trägt den Titel Dry Principle. Eine beträchtliche Anzahl von Box in Software wird durch wiederholten Code verursacht. Wenn Sie 10 Funktionen haben, die dasselbe tun und das Verhalten einer solchen Funktion ändern müssen, müssen Sie alle 10 Funktionen ändern. So wurde die Definition des trockenen Prinzips in einem berühmten Buch formuliert, The Pragmatic Programmer von Andy Hunt und Dave Thomas. Und es hört sich so an. Jedes Stück Wissen muss eine einzige eindeutige Darstellung im System haben. Dieses Prinzip betrifft all die verschiedenen Aspekte der Software, die auf jeden Programmiercode oder Datenbank-Intrierer oder irgendetwas anderes angewendet werden kann , einschließlich der Dokumentation der gängigsten Arten, gegen das Trocken-Prinzip zu verstoßen, sind die folgende magische Strings oder andere magische Werte, doppelte Logik an mehreren Orten und wiederholte geben als Logik oder mehrere Switch-Fälle in der gesamten Codebasis verstreut? Schauen wir uns Beispiele an. Sehen Sie sich dieses Beispiel an. Sie erhalten die Antwort nicht von einem Gerät, dann vergleichen wir die Ergebnisse mit 188. Solche magischen Werte neigen dazu, sich über eine Klasse zu verbreiten, die Inter mit dem Gerät arbeitet. So erscheint Duplizierung. Eine Seite der Duplikation, die weiß, was 188 bedeutet, die Bedeutung des Codes zu verstehen? Wir müssen die Dokumentation lesen. Wäre es nicht schön, eine Konstante mit einem aussagekräftigen Namen zu definieren? Diese Konstante kann jetzt überall verwendet werden, wo wir brauchen. Es ist jetzt klar, was 188 bedeutet. Es bedeutet, dass es keine Verbindung mit dem Gerät gibt. Hier ist ein weiteres Beispiel. Die ähnliche Situation hier sehen wir, dass magische Werte begannen, abgesehen von der Tatsache , dass es absolut unmöglich ist zu verstehen, was hier vor sich geht. Und der Tauchort kann zu unglücklichen Folgen führen. beispielsweise Wennbeispielsweiseeiner der duplizierten Werte geändert wird, werden Sie diese Werte überall ändern. Es wurde verwendet, um das Problem zu beheben. Wir können die gleiche Technik anwenden, die konstante Werte definiert, die die einzelnen Quellen von Veränderung werden . Ich habe Konstantenwerte nur für duplizierte Werte definiert, aber höchstwahrscheinlich würde ich dasselbe für alle anderen Werte tun. Jetzt ist es offensichtlich, dass Befehle zuerst ein Gerät initialisieren, als einen Befehl zu senden, und danach das Gerät geschlossen. Hier ist das gleiche Beispiel. Was ist hier los? Wir haben die duplizierten magischen Zahlen korrigiert, aber was kann verbessert werden. Darüber hinaus haben wir die duplizierte Logik hier, und es ist nicht zu sprechen, dass es 10 neue Methoden mit dem gleichen Muster aus gesendeten Befehlen erscheinen kann . Sieh mal, wie wir sie reflektieren können. Diese Schicht habe ich eine Methode extrahiert, die die duplizierte Logik entfernt, indem sie die Verantwortung abnimmt , indem sie die Verantwortung abnimmt tatsächliche Befehle durch Initialisierung und Beendigung umschließt. Die Vorteile könnten nicht andere sein, aber im Falle von mehr als drei Methoden würden Vorteile daraus werden. Dies ist ein einfaches Beispiel für duplizierte Logik. Es gibt viel interessanteren Fall im Zusammenhang mit duplizierter Logik. Die Frage ist: Ist das wahr? Diese doppelte Logik ist immer eine schlechte Sache, und dann, Sir ist ziemlich interessant. Stellen Sie sich vor, Sie entwickeln drei Anwendungen, die zur gleichen Domäne gehörten. Logischerweise hätten solche Anwendungen erhebliche Ähnlichkeiten in der Funktionalität, die sie implementieren. Diese Tatsache führt logischerweise zu einem natürlichen Wunsch, eine gemeinsame Bibliothek zu erstellen, die Stücke von Funktionalität enthält. Das ist für alle drei Anwendungen gleich. Wie Sie sich erinnern, muss jedes Stück Wissen eine einzige eindeutige Darstellung im System haben. Also, wenn Sie das gleiche funktionale Wissen dreimal für jede Anwendung implementieren, dann scheinbar verletzen Sie den trockenen Prinzipal? Ja, ja. Betrachten wir nun den folgenden Fall. Aus meiner Praxis hatten wir drei Anwendungen, die die Logik der folgenden Funktion teilten. Hier haben wir eine Klasse mit drei Eigenschaften und die Funktion, die überprüft, die die Karte gibt, ist für einige Zeit gültig. Diese Funktion funktionierte gut für alle drei Anwendungen, aber eines Tages änderte sich eine der Anwendungen. Die Anforderungen sind erforderlich, um auch Vornamen und weniger Namen zu überprüfen. Die Implementierung einer anderen Funktion für diese bestimmte Anwendung würde als Verletzung des Antriebsprinzips angesehen. So wurde eine Entscheidung getroffen, eine Bullenflagge einzuführen. Und hier ist die zweite Version der gleichen Funktion. Cool. Wir behalten die Fähigkeit, die gleiche Funktion auf der gesamten Codebasis zu verwenden. Der Frieden hat sich niedergelassen, und wir haben unsere Arbeit seit einiger Zeit fortgesetzt. Alles war in Ordnung, bis eines Tages, als Boss sagte, dass es eine andere Anforderung von der dritten Anwendung. Die dritte Anwendung kann jetzt erlauben, Ideen länger als 10 Zeichen zu sein, um die Möglichkeit zu erhalten , die gleiche Funktion über die Codebasis zu verwenden, die ein neues Boland-Flag eingeführt hat. So sah die neue Version dieser Funktion aus. Ja, ja, ich weiß, dass diese Funktion in Riel Mass wurde, und das ist erst der Anfang. Wenn Sie beginnen, solide Prinzipien und alle Best Practices anzuwenden, um diese Masse zu vermeiden erhalten Sie oft eine separate Implementierung für jede Anwendung. Oft nicht immer. Aber oft ist es besser, Ihre Logik nicht zwischen Anwendungen zu teilen. Es ist besser, diese Logik separat zu erweitern, zumindest bis Sie absolut sicher sind, dass Sie dieselben Implementierungen zusammenführen können. In der Tat gibt es Fälle, in denen wir 100% sicher sind, dass sich bestimmte Geschäftslogik nie ändern wird. Oder die Wahrscheinlichkeit von Abweichungen ist extrem gering. Wenn die Semantik anders ist, führen Sie den Code nicht zusammen , der wie duplizierter Code aussieht. Schauen wir uns einen anderen Fall an, wenn Duplizierung eigentlich keine Duplizierung ist. Hier ist ein Beispiel, übrigens, dieses Beispiel stammt auch aus meiner eigenen Praxis. Fragen werden einfach anders benannt. Sie haben zwei Klassen, die Präsident waren, verschiedene Geräte. Beide haben die gleichen Dateneigenschaften. Ein Nachwuchsentwickler aus unserem Team entschied, dass dies eindeutig gegen das Trockenprinzip verstößt, also entschied er sich, dieselben Dateneigenschaften in basiertes Glas zu extrahieren. Er kam mit der fallenden reflektierten Version dieses Codes heraus. Hier ist das Geräteglas, das die duplizierten Eigenschaften enthält. Jetzt werden alle Geräte vom Glas erben und das Trockenprinzip ist Matt. Leider war das eine schlechte Entscheidung und es gibt mehrere Gründe. Der erste Grund ist, dass es schwer zu glauben ist, dass alle Geräte die gleichen Eigenschaften haben. Ich bin mir ziemlich sicher, dass L S P von dieser Fabrik verletzt wird. Der zweite Grund ist, dass wir jetzt eine starke Kopplung zwischen basierter Klasse und Erben haben . Und tatsächlich, Ich sehe nicht, wo die Vorteile einer solchen Erbschaft freundlich. Es ist ein sehr seltener Fall, wenn die Vererbung von Daten eine gute Idee ist. Wissen Sie, alle Sprachen Objekte bestehen aus öffentlichen Funktionen. Die Daten sollten ausgeblendet werden. Der dritte Grund ist, dass die erste Absicht falsch war. Es gab keine Duplikation. Die Tatsache, dass Toe-Objekte dieselben Dateneigenschaften haben, macht sie nicht ähnlich. Was das Objekt ähnlich macht, ist ihr Verhalten. Es gibt also keine Notwendigkeit, Objekte zu koppeln, die unterschiedliche Semantik haben. Vladimir Horcoff kam sogar mit dem Begriff der Dienstprogrammvererbung heraus. Vladimir Horcoff, es hat uber aus diesem Videokurs kam sogar mit dem Begriff von Dienstprogramm Vererbung, dieses Beispiel zeigt genau diese böse Technik. Auf der Folie sehen Sie den Verweis auf den Block, der über die Vererbung der Dienstprogramme verfügt. Werfen Sie einen Blick auf diesen Code hier haben eine Aufzählung von Formen und die Visualize ER-Klasse, die Zehe-Operationen definiert. Es gibt nur zwei Operationen nur aus Gründen der Einfachheit. Im realen Szenario würde es viele Klassen geben, die das in, ähm, orations und Dutzende von Methoden verwendet ähm, , die von Switch-Fällen gefüllt sind. Also, welche Fälle auf der gleichen in Bewunderung, die über die gesamte Codebasis verstreut sind, ist einer der schlimmsten Alpträume. Sie können Seniorleben, wenn sich eine Art des Verhaltensaspekts in Bezug auf eine der Aufzählung von Alice ändert . Sie müssen alle Stellen im System finden, an denen Switch-Cases implementiert sind, und die entsprechenden Codeblöcke ändern . Wenn Sie eine Form hinzufügen, müssen Sie alle Stellen mit Wechselfällen suchen und diese ändern, indem Sie Fälle für diese neue Form hinzufügen. Das ist eine wahre böse Vervielfältigung. Wie man das Problem zu beheben. Das offene Close-Prinzip ist Antwort. Sie können das Basisglas definieren und die Enumerationswerte in Erben umwandeln, die durch Klassen dargestellt werden. Wenn sich etwas ändert, haben Sie einen einzigen Ort, an dem Sie diese Änderung vornehmen müssen. Jetzt kann sich der Client-Code nur auf das Basisform-Glas verlassen. Keine Switch-Fälle, die über die gesamte Codebasis verteilt sind. Denken Sie daran, dass Wiederholung und Logik Abstraktion erfordert. Großartig. In der nächsten Vorlesung werden wir das Kussprinzip studieren. 49. 03 KISS: Diese Vorlesung trägt den Titel Kiss Principle. Haben Sie die Aussage von Albert Einstein gehört? Machen Sie alles so einfach wie möglich, aber nicht einfacher. Diese Aussage ist die Essenz des Kussprinzips. Kuss bedeutet, dass du es einfach hältst, Dumm. Je komplexer ein Systemkomplex ist, desto mehr Möglichkeit, dass es brechen kann. Daher sollte Einfachheit ein zentrales Ziel im Design sein und auf die Komplexität des Assessor sollte vermieden werden während ich jung bin, Sie werden es nicht brauchen. Prinzip ist über das Entfernen eines Beurteilers Mantel Kuss ist alles darüber, wie die Umsetzung so einfach wie möglich zu machen . Also die Aussage dieses Prinzips ist eine einfache Lösung ist besser als eine komplexe, auch wenn die Lösung dumm aussieht, das Prinzip ist tief philosophisch in der Tat, nur versucht, eine wahre Definition von der Einfachheit zu finden, wie die Einfachheit zu definieren und zu messen, wäre die einfache Definition die folgenden einfach Städte der Zustand der Qualität des Seins einfach. Finden Sie nicht, dass eine solche Definition nicht hilfreich war? - Das tue ich. Was bedeutet es, einfach zu sein? Scheinbar, dass die einzige Möglichkeit, die Einfachheit in Software zu behandeln, ist, dass etwas, das leicht zu verstehen oder zu erklären ist, Kann als einfach betrachtet werden. Im Gegensatz zu etwas Kompliziertem. Es ist sehr schwer und manchmal sogar unmöglich, eine einfache Lösung zu finden, die ein schwieriges Problem löst . Die Komplexität der Implementierung wächst tendenziell zusammen mit steigenden Anforderungen , so dass das Gefühl von Einfachheit relativ ist. Die Haupttechnik, die wir verwendet, um mit Komplexität zu kämpfen, ist die Zersetzung , und übrigens ist die Zusammensetzung der Aspekt, stark verbunden ist Zehe fast alle soliden Prinzipien. Einhaltung des SRP wenden wir die Zusammensetzung auf die gekoppelten Objekte oder Module an, mit dem Klatsch nicht immer bestätigen, sondern oft auch die Zusammensetzung beinhaltet, besonders wenn wir einen neuen Typ erstellen müssen, um eine isolierte Quelle der Veränderung in die Gesichts-Segregation. Das Prinzip dreht sich alles um die Komposition. Abhängigkeit in der Version ist alles darum, die Systemwelt zu komponieren. In der Liste des Substitutionsprinzips geht es vor allem darum, wie Wette Zersetzung so der Seele zu vermeiden . Prinzipien zielen darauf ab, Lösungen so einfach wie möglich zu erreichen. Auf der anderen Seite führt der Missbrauch fester Prinzipien immer zu der Komplexität des Zubehörs. Dies ist die wahre Manifestation der Einheit und Kampf gegen Gegensätze Gesetz. Es ähnelt mir, ein Kraut namens Wert. Aaron Valerie in hat beruhigende Eigenschaften, Also, wenn Sie die Lear in Aceh Medizin nehmen, Sie erwarten, ruhiger zur gleichen Zeit zu werden. Es ist eine sehr bekannte Tatsache, dass, wenn Sie zu viel ausziehen, während Sie in sind, es das Gefühl aus Angst verursachen wird. Die Tatsache wird das Gegenteil sein. Das Problem der Einfachheit relative nous führt uns zu zwei verwandten Vorstellungen. Zufällige und wesentliche Komplexität. Ich habe vorhin gesagt, dass komplexe Systeme tatsächlich komplex sind und man nichts dagegen tun kann . Sie können die Software des Banksystems nicht implementieren und erwarten, dass es ein einfacher als Solitär sein wird . Die Komplexität, die von der Domäne selbst auferlegt wird, wird als wesentliche Komplexität bezeichnet. Die wesentliche Komplexität kann auf keinen Fall reduziert werden. Der einzige Weg, wie wesentliche Komplexität reduziert, ist, wenn sich die Domänenregeln in Richtung der Einfachheit ändern . Leider können Sie solche Änderungen kaum durchsetzen. Zufällige Komplexität ist die Komplexität unserer Lösungen, die darauf abzielen , die Probleme außerhalb der Domain zu lösen, für die wir verantwortlich sind. Die zufällige Komplexität ist die Entwickler. Das Design der Software-Optimierung hängt alle mit der zufälligen Komplexität zusammen. Kiss ist fundamentales philosophisches Prinzip, so können wir die folgenden Regeln markieren, die natürlich keine Dogmen sind. Ich bevorzuge Komposition gegenüber Vererbung waren möglich. Halten Sie sich bei, wenn Ellison, die Aussagen gab, bis Sie sehen, dass Sie Polymorphismus einführen müssen, vermeiden Sie die Optimierung in 90% der Fälle. Langsamere Lösungen arbeiten genug schnell Ausnahmen von dieser Regel ist, wenn Sie sicher wissen, dass Sie an einer sehr komplexen Software arbeiten, einer der Hauptaspekte der Wünsche. Die Leistung, wenn die Leistung absolut kritisch ist. Kleinere Gläser und kleinere Methoden sind Teig. Die beste Methode ist ein Ein-Liner, Google. Für die Technik, die extraktiv genannt wird, fallen Sie, was über Methoden re Factoring ist. Beeilen Sie sich nicht, Dienstprogrammklassen für private Methoden zu extrahieren, die von einem einzigen Ort innerhalb der Klasse verwendet werden . Lassen Sie es s Städte, bis es andere Teile des Codes gibt. Wird diese Methode auch erfordern. Schreiben Sie nicht Perimeter entstanden. Allgemeine Methoden bevorzugen Methoden, die ein spezifisches Problem lösen. Teilen und erobern. Dies ist ein Prinzip, das darauf abzielt, komplexe Probleme zu lösen. Teilen Sie das Problem in kleinere Probleme auf und lösen Sie sie eins nach dem anderen. Bemühen Sie sich, Kommentare zu vermeiden. Kommentare bedeuten, dass Sie nicht versucht haben, die Absicht in der Programmiersprache auszudrücken, rechten Bruder Typen, und haben Sie keine Angst, sie wegzuwerfen. Behalten Sie die Anzahl der Phantasien, die ein Problem in etwa von 5 bis 7 Menschen lösen. Verstand ist nicht gut darin, im Gedächtnis zu bleiben. Moderne sieben Dinge gleichzeitig, Ständig arbeiten. Vereinfachen Sie Ihre Codebasis. Onkel Bob Martin schlägt sogar eine Regel vor, dass Sie sich vor dem Einchecken immer fragen sollten, ob die Codebasis besser ist als vor dem Einchecken. Das ist die Regel eines Pfadfinders. Optimierung ist die Hauptausrede für das Schreiben von komplexem Code, aber bemühen Sie sich, die Menge an Gold näher an fünf oder 10% der Codebasis zu halten, nicht mehr. Optimieren Sie nur, wenn Sie absolut sicher sind, dass ein Leistungsproblem vorliegt. Messen Sie nicht die Leistung durch Ihre Ich verlasse mich auf spezielle Werkzeuge für die Verfolgung der Leistung . Denken Sie daran, dass es zwei Werte außerhalb der Software gibt. Die erste 1 ist, dass Software korrekt funktionieren sollte, und die zweite 1 ist, dass die Software gut entworfen werden sollte, und die zweite 1 ist viel schwieriger, sie zu erreichen. Die 1. 1 in den meisten Fällen. Der nächste Prinzipal, über den wir sprechen werden, ist das junge Prinzip, das für u N Gonna benötigt steht. Dieses Prinzip ähnelt dem Kussprinzip. In der nächsten Vorlesung erfahren Sie, was der Unterschied zwischen diesen beiden Prinzipien ist und was Yogi in der Praxis bedeutet ? 50. 04 YAGNI: Diese Vorlesung trägt den Titel Yardeni Principle. Die Machtmenschen sind immer auf der Suche nach Wegen, um sie herum so viel mächtig zu machen. Es ist möglich, Entwickler sind auch Menschen, und sie neigen auch dazu, den gesamten Programmcode so allgemein wie möglich zu machen. Zum Beispiel, wenn ein Softwareentwickler eine Aufgabe hat, eine einfache Bibliothek zu erstellen, um einfache Einkommensergebnisberichte zu generieren , wird er die gesamte allgemeine Bibliothek erlauben, mögliche Finanzberichte zu generieren . Ich muss ein Schlüsselwertpaar von einem benutzerdefinierten Kauf eines Reformers analysieren. Was mache ich denn? Richtig. Ich schreibe den ganzen verdammten Späreneren mit allen möglichen Fällen. Ja, Agni bedeutet, dass du nicht brauchen wirst, es geht darum, über Technik zu vermeiden, er Agnese stark verwandt mit dem, was wir vorhin im Kurs besprochen haben. Erinnern Sie sich an den Geruch namens Unnötig Komplexität? Ja, Detail sagt, dass wir diesen Geruch vermeiden sollten. Erinnern Sie sich an unseren Vortrag über die Vorfreude auf bevorstehende Veränderungen? Im Vorgriff auf bevorstehende Änderungen beginnen Entwickler, Erweiterungspunkte einzuführen. Das Problem ist, dass es passieren kann, dass all diese Erweiterungspunkte nie verwendet werden. Punkte der Erweiterung haben ihre Kosten. Sie sind nicht frei. Sie machen Systeme komplexer und daher schwieriger zu verstehen. Ja, Guineas. Tief philosophisches Prinzip. Es gibt kein gut definiertes Kriterium, das es ermöglicht, die junge Sauberkeit des Systems zu messen. Wenn Sie sich Wikipedia ansehen, werden Sie sehen, dass Young ein Prinzipal aus extremer Programmierung oder XP ist . Kurz gesagt, dass Programmierer keine Funktionalität hinzufügen sollten, bis sie für notwendig erachtet werden. Als eine Art von föderalen Software-Entwicklung, Extreme Programmierung befürwortet häufige Releases versicherte Entwicklungszyklen, die die Produktivität verbessern soll und Checkpoints eingeführt, an denen neue Kundenanforderungen übernommen werden können . XP, Mitgründer auf Jeffries, hat geschrieben. Implementieren Sie Dinge immer, wenn Sie sie wirklich brauchen. Nie. Wenn Sie nur sehen, dass Sie sie brauchen, haben Sie Knie. Das Prinzip hinter dem XP Training off tun die einfachste Sache, die möglicherweise funktionieren könnte. Ein weiteres interessantes Konzept, das auch stark mit Young Me verwandt ist, heißt Worst is Besser. Auch bekannt, seinen New Jersey Stil in Bezug auf Software-Entwicklung. Schlimmer ist besser impliziert ein Modell der Softwareentwicklung und -implementierung, das die folgenden Merkmale aufweist. Einfach sitzen, muss das Design einfach sein, sowohl eine Implementierung als auch eine Schnittstelle. Es ist wichtiger, dass die Implementierung einfach ist als die Schnittstelle. Einfachheit ist die wichtigste Überlegung in der Design-Korrektheit. Das Design sollte in allen beobachtbaren Aspekten korrekt sein, aber es ist etwas besser, einfach als korrekt zu sein. Konsistenz, die sie entwerfen, darf nicht übermäßig inkonsistent sein. Konsistenz kann in einigen Fällen aus Gründen der Einfachheit geopfert werden, aber es ist besser, diejenigen Teile des Designs zu löschen, die mit weniger häufigen Umständen umgehen als Komplexität oder Inkonsistenz und Vollständigkeit der Implementierung einzuführen. Das Design muss so viele wichtige Situationen abdecken, wie es praktisch ist. Alle vernünftigerweise erwarteten Fälle sollten abgedeckt werden. Vollständigkeit kann zu Gunsten jeder anderen Qualität geopfert werden. In der Tat muss Vollständigkeit geopfert werden, wenn die Implementierung vereinfacht wird. Joe pard ized Konsistenz kann geopfert werden, um Vollständigkeit zu erreichen, wenn Vereinfachungen beibehalten werden, besonders wertlos ist Konsistenz aus Schnittstelle. Es gibt ein Problem mit allen Grundsätzen der Angelegenheit. Die Abfälle, die wir ihnen folgen und auf die Praxis anwenden können, sind vage. Das einzige, was wir tun können, ist, den jungen Namen oder Details zu besprechen. Aber am Ende wird unsere Diskussion auch so schwer zu messende Dinge wie die Komplexität der Software enthalten. zum Beispiel Betrachten Siezum Beispielden folgenden Satz aus einem Block off. Martin folgte. Dies ist ein guter Satz, der die Bedeutung deutlich macht. Ja, Agni, aber es ist immer noch nicht so einfach, in der Praxis anzuwenden. Hier ist der Satz. Wenn Sie etwas für ein zukünftiges Bedürfnis tun, das nicht tatsächlich die Komplexität der Software erhöht , dann gibt es keinen Grund, Ihre Akne aufzurufen. Aber die Komplexität der Software, die Frage. Wie zum Teufel soll ich den komplexen Nous schätzen, bevor ich mir ein paar Spielbeispiele anschaue ? Das Prinzip will auch bleiben, dass man sich nicht blind an irgendwelche Prinzipien halten sollte. Zum Beispiel, wenn Sie blind an das junge Ich halten, werden Sie am Ende mit dieser organisierten Kälte und werden früher oder später die Notwendigkeit konfrontiert eine massiv Arbeit durchzuführen. Daher müssen Sie sich stark auf mehrere andere Praktiken verlassen, wie zum Beispiel Fortsetzung des Factorings, setzt automatisierte Komponententests fort und setzt die Integration fort, um negative Folgen zu vermeiden. Die Agni hängt von unterstützenden Praktiken ab, und dies wird in der ursprünglichen Definition angegeben. In extremer Programmierung. Betrachten wir zwei Fälle, in denen wir uns bewerben können. Ja, Agni, ich nenne den ersten Fall von High-Level-Eins. Im zweiten Fall werde ich ein niedriges Niveau nennen. Stellen Sie sich die Situation vor, die ein Team an dem Zahlungssystem arbeitet, das Inter mit vielen Geräten arbeitet, wie gehen Spender, Bilic, Sapper und so weiter. Es kann viele Modelle von jeder Art dieser Geräte geben. an einer aktuellen Version arbeiten, müssen Sie einen Treiber für Inter implementieren, der mit Modellen e aus einem Rechnungsspender arbeitet. Gleichzeitig erwartet ein Projektmanager, dass er in vier Monaten das Y-Modell aus einem Rechnungsspender unterstützen muss . Es ist eine Versuchung, das erwartete Modell parallel zum Z-Modell zu implementieren, um in Zukunft eine Aufgabenumstellung zu vermeiden. Und übrigens, es wäre toll, Boston die Zukunft zu sagen. Hey, wir werden es aufschreiben, wenn die Zeit für die Implementierung des weißen Modells kommt. Entscheidung, solche mutmaßlichen Merkmale umzusetzen, ist ein klassischer Verstoß gegen das Agni-Prinzip . Ist Ihnen klar, welche finanziellen Vergeuden in dem Fall verschwendet werden, dass Motile nie umgesetzt werden müssen? Die Kosten für Butte umfassen alle Anstrengungen, die für die Analyse der Programmierung und das Testen dieser jetzt nutzlosen Funktion verbracht wurden. Okay, stellen Sie sich vor, der Projektmanager hatte Recht mit dieser Funktion. Glauben Sie, dass es keine Kosten für eine solche Entscheidung gibt? Die Sache ist, dass die Implementierung dieser erwarteten Funktion Sie noch Zeit, die für andere wirklich benötigte Funktionen ausgegeben werden könnte. Dies ist eine Verzögerung der Kosten, da andere Funktionen verzögert werden. Die Verzögerung entspricht der Zeit, die für die Implementierung dieses erwarteten Features verbracht wurde. Und das ist nicht zu sagen, dass Sie anfangs falsch liegen könnten, und diese Funktion könnte nie benötigt werden. Und das ist nicht dann, und andere Kosten für die Implementierung von Funktionen wurden erwartet, dass sie in der Zukunft gefragt werden, indem sie eine Kristallkugel für Wahrsagerei verwenden. Ist die Küste vor Clery? Sehr oft macht zusätzlicher Code das System schwer zu verstehen, zu warten und zu modifizieren. Wenn Sie also auch eine wirklich benötigte Funktion implementieren müssen, die von dieser Kälte im Zusammenhang mit Geräten abhängt, verbringen Sie wahrscheinlich mehr Zeit, um sie zu implementieren. Und das ist nicht Dann gibt es ein sehr unglückliches Szenario, wenn die Notwendigkeit aus einer Funktion richtig prognostiziert wird. Aber die Umsetzung der Zukunft ist falsch. Wenn die Zeit kommt und Sie erkennen, dass eine Funktion implementiert ist, erwarten wir nicht von Kunden. Sie werden sich in einer Situation stellen, in der Sie eine falsche Funktion haben, manchmal völlig falsch, und Sie müssen eine harte Entscheidung treffen, ob Sie die aktuelle Implementierung wegwerfen und das Feature vollständig aus dem Boden oder um Ressourcen in die Reparatur der bestehenden falschen Umsetzung zu investieren. Das ist ein sehr schwieriges Dilemma. Es ist schwer abzuschätzen, ob Sie das Feature neu schreiben oder das vorhandene reparieren sollten . Martin Vater kam mit einer großen Haut, die alle möglichen Probleme im Zusammenhang mit jungen Verletzung demonstriert. Das Beispiel, das wir diskutiert haben, ist die hohe Ebene Fall und Sie, Agnese viel einfacher auf dieser Ebene anzuwenden, obwohl , natürlich, , natürlich,auch auf dieser Ebene, manchmal machen wir Fehler. Ein anderer Fall ist ein niedriges Niveau und es betrifft jeden Tag Entscheidungen, die wir im Prozess der Codierung treffen. zum Beispiel vor, Stellen Sie sichzum Beispiel vor,dass Sie gerade eine Funktion innerhalb einer Klasse schreiben, die eine Zahl aus einer benutzerdefinierten Zeichenfolge analysieren muss , die von einer Plastikkarte abgerufen wird. Sie haben im Grunde zwei Möglichkeiten. Eine besteht darin, nur eine separate Funktion zu implementieren, die diese Zeichenfolge innerhalb der Klasse übergibt, an der Sie gerade arbeiten. Die zweite Wahl und dies ist die Art und Weise, die standardmäßig sehr oft war, ist, eine Übergabefunktion zu implementieren und die Dienstprogrammklasse zu extrahieren, die die Übergabefunktion enthält . Anscheinend können wir davon ausgehen, dass unsere Kollegen möglicherweise auch die Funktion aus anderen Teilen der Codebasis verwenden möchten . Ich möchte diese Frage in Bezug auf diesen speziellen Fall nicht beantworten. Ich möchte die Frage beantworten. Im Allgemeinen gibt es einen einfachen Algorithmus, der hilft, eine richtige Entscheidung im Codierungsprozess und in solchen Situationen zu treffen. zunächst, Fragen Sie sichzunächst,ob die Funktion oder eine Zukunft jetzt implementiert werden muss. Ereignisse waren ja, dann implementiert, Sie haben die Antwort ist nein. Stellen Sie sich eine andere Frage. Wie viele Anstrengungen wird nötig sein, um diese Funktion oder ein Feature in der Zukunft zu implementieren? In dem Fall wird es erforderlich sein. Wenn die Antwort ist, wird es definitiv sehr einfach sein. Dann behalten Sie alle Dinge so, wie sie sind. Stellen Sie nichts Zusätzliches vor. Wenn die Antwort lautet, wird es enorm viel Zeit brauchen, um viele Dinge zu schreiben, um das Design zu optimieren, damit es genug geschmeidig ist, diese Funktion einzuführen. Dann überlegen Sie, Sommerfraktionen durchzuführen, die es Ihnen ermöglichen, massiv Schriften in der Zukunft zu vermeiden. Denken Sie daran, dass weder Gile Praktiken noch irgendwelcher Materie Prinzipien die Idee auferlegten, Planung zu vermeiden . Im Gegenteil, Sie sollten immer sorgfältig planen, was Sie in der Zukunft benötigen. Und welche Ressourcen und Anstrengungen benötigen Sie, um neue Anforderungen wieder zu erfüllen? Es bedeutet nicht, dass Sie eine große Leistung von Design durchführen müssen, aber es schuldet. Das heißt nicht, dass man viel vergessen muss. Das Ziel, das wir erreichen wollen, ya Agni anzuwenden, ist es, etwas Zeit zu sparen. Bitte bewerben Sie sich nicht. Junge mich, um Fabrik wieder. Sie müssen eine Fabrik ausführen, um Yanni zu aktivieren. Ich hoffe, Sie verstehen jetzt besser, wie Sie den Heiligen Gral mit dem Algorithmus erreichen, den ich in diesem Vortrag angegeben habe. Sei bereit zum Scheitern. Bei der Anwendung des Agni-Prinzips wird es einige Zeit dauern, genug Erfahrung zu sammeln und zu erfinden. Ihre Beharrlichkeit wird sich in der nächsten Vorlesung auszahlen. Wir werden einen Blick auf die Trennung der Anliegen Prinzip. 51. 05 SoC: Diese Vorlesung trägt den Titel „Trennung von Bedenken“. Trennung von Bedenken oder eine Socke und Short ist ein Prinzip, die tatsächlich im Abschnitt von Single Responsibility Prinzip SRP im Fußball stark verwandt diskutiert wurden . Grundsätzlich ist Fußball ein Prinzip, was bedeutet, dass wir verschiedene Anliegen in verschiedene Module aufteilen müssen. Anhaften an Socke ermöglicht es, modulare Systeme zu bauen. Der Unterschied zwischen Fußball und SRP besteht darin, dass Fußball meist auf höchstem Niveau angewendet wird . Der Wert der Trennung von Bedenken ist die Vereinfachung der Entwicklung und Wartung von Computerprogrammen . Wenn Bedenken gut getrennt sind, können einzelne Abschnitte wiederverwendet sowie eigenständig weiterentwickelt und aktualisiert werden. Ein besonderer Wert ist die Möglichkeit, später einen Codeabschnitt zu verbessern oder zu ändern, ohne die Details aus anderen Abschnitten kennen zu müssen und ohne Änderungen an diesen Abschnitten vornehmen zu müssen. Die meiste Zeit können Sie SRP und Sock als die gleichen Konzepte behandeln, und Sie können sie austauschbar verwenden. Hier ist die Liste der Bedenken, denen wir bei der Entwicklung von Unternehmenssoftware oft gegenüberstehen müssen. Sie sind Geschäftslogik, Präsentation, Logik und Datenbank. Stellen Sie sich vor, ein Raum, in dem alle Dinge über den Boden verstreut sind, wird einfach sein. Um dort ein bestimmtes Buch zu finden. Wäre es nicht einfacher, all die Dinge getrennte Bücher auf dem Regal zu halten, Spielzeug in den Kisten und so weiter? Dasselbe können wir über Programmierung und Trennung von Bedenken sagen. Wenn Sie eingeben verwirren Sie. Ich war Geschäftslogik. Dann wird es schwieriger für Sie sein, die ganze Masse zu halten, alles zu finden, was Sie brauchen, ihre Veränderung, alles, was Sie ändern müssen und so weiter. Es gibt eine Sache, die unsere besten Absichten in Bezug auf die Trennung von Bedenken ruinieren kann. Diese böse Sache nennt man leckende Abstraktionen mit separaten Bedenken. Indem wir die konstante Verkapselung Onley durch Kapselung spielen, können wir Objekte schützen und ihre Innenräume verstecken. Leider ist Abstraktion undicht, vor allem bei komplexen AP Augen. Es gibt eine große Anzahl von beliebten Fällen von lecken Abstraktionen. Eines meiner Lieblingsbeispiele. Eines Ihres Modells oder, mit anderen Worten, Präsentationslogik weiß etwas, das für Sie spezifisch ist. Ich hier ist ein Beispiel, wenn ein Ansichtsmodell eine Eigenschaft vom Typ Kragen freigibt, dies ist ein klassisches Beispiel, wenn die Präsentationslogik aus der Socksicht falsch implementiert wird . Um dieses Beispiel zu beheben, müssen wir die Eigenschaft entfernen und eine andere aussetzen, die nur eine Bowline zurückgibt, die Sie auf seiner Seite sind , sollte entscheiden, welche Farbe zu spitzen. Dies ist kein Problem von einer Präsentationsschicht. Ein weiteres gutes Beispiel. Wenn die Hauptlogik mit eindeutigen Bezeichnern arbeitet, die in einer Datenbank gespeichert sind. In diesem Fall wird eine Sorge der Persistenz mit der Domänenlogik gemischt. Domänenlogik sollte unabhängig sein in Bezug auf Persistenzmechanismen, tatsächlich gibt es in Abschaltungen Beispiele für flickende Abstraktionen. Denken Sie daran, dass Schichten, die unterschiedliche Bedenken darstellen, so voneinander isoliert werden sollten, dass keiner von ihnen auf der anderen Seite über irgendwelche intrinsischen Details wissen sollte . Ich muss zugeben, dass es Ausnahmen von dieser Regel aus der Perspektive des Domine Dreamin Designers Didi Dean Shirt geben kann , der Startprozeduren schreibt, die jede Art von Geschäftslogik implementieren. Zum Beispiel führen sie Validierung und Mutation von Daten wird als Verletzung der Trennung von Bedenken betrachtet . Principal Zur gleichen Zeit, leiderdirekt laufen, direkt laufen, chirurgische Eingriffe sind in bestimmten Szenarien viel schneller als die Durchführung von Operationen durch ein Objekt. Relationale Mapper wie Entitätsframework behandeln solche Fälle als Ausnahmen. In der nächsten Vorlesung lernen Sie das kranke US- oder Kommandoabfrage-Trennungsprinzip 52. 06 CQS: Diese Vorlesung trägt den Titel Command Query Separation Command. Abfragetrennung ist ein Prinzipal Off Imperative Programmierung. Es wurde von einem aber bewundern als Teil seiner Pionierarbeit an der Programmiersprache Eiffel entwickelt . Es besagt, dass jede Methode entweder ein Befehl sein sollte, der in Aktion ausgeführt wird, oder eine Abfrage , die Daten an den Kühler zurückgibt, aber nicht beides. Mit anderen Worten, eine Frage zu stellen, sollte die Antwort nicht ändern. Im Allgemeinen können wir Funktionen in zwei Haupttypen aufteilen. Funktionen, die Befehle und Funktionen ausführen, die eine Abfrage ausführen und ein Ergebnis zurückgeben. Oft mischen Anfänger Quadrate und Befehle. Als Ergebnis erstellen sie Funktionen, die einen Befehl ausführen und ein Ergebnis aus erwerben zurückgeben. Zur gleichen Zeit. Das ist fast immer eine schlechte Sache. Betrachten Sie ein Beispiel. Welche Farbe fragt man hier? War der Logan-Versuch erfolgreich? Vielleicht wahr bedeutet, dass ein Benutzer bereits gesperrt wurde. Es ist schwer zu sagen, wenn man sich die Funktionssignatur ansieht. Die Sache ist, dass es unmöglich ist, die Bedeutung eines Boudin-Ergebnisses durch den Funktionsnamen auszudrücken . Das Problem liegt nicht im schlechten Namen der Funktion, aber das Problem ist, dass ein Befehl nicht von einer Abfrage getrennt ist. Die Befehlslogik und queere Logik sind in der gleichen Funktion gemischt. So krank. USA ist eines der Kernprinzipien, die dazu beigetragen haben, bessere AP Augen in Bezug auf dieses Beispiel zu entwerfen . Es wäre besser, eine Funktion auszurollen, die einen Befehl und eine oder mehrere Funktionen implementiert , die zum Beispiel Abfragen implementieren, wie diese durch die Namen und Signaturen aus diesen Funktionen. Es ist klar, was sie bedeuten und was sie tun. Mit anderen Worten, diese Funktionen sind ehrlich, dass sie nichts Verborgenes bedeuten und keinen Anrufer anlügen . In der nächsten Vorlesung werden wir uns das Gesetz aus dem Dekanometer ansehen. 53. 07 Gesetz der Demeter: Dieser Vortrag trägt den Titel Law Off de Meter. Wenn wir uns Wikipedia ansehen, werden wir sehen, dass das Gesetz aus dem Zähler, Lord in kurz oder prinzipiell off list Wissen ist eine Designrichtlinie für die Entwicklung von Software , insbesondere objektorientierte Programme. In seiner allgemeinen Form ist der Herr ein spezifischer Fall aus der losen Kopplung. Okay, hört sich großartig an. Aber was bedeutet es wirklich? Allgemeine Formulierung der niedrigen ist jede Einheit sollte nur begrenzte Kenntnisse über andere Einheiten haben . Onley-Einheiten, die eng mit der aktuellen Einheit oder jeder Einheit verwandt sind, sollten nur mit ihren Freunden sprechen . Sprich nicht mit Fremden. Großartig klingt klar, aber immer noch nicht genug praktisch. Die formale Objektform des Gesetzes lässt sich zusammenfassen. Dies eine Methode oft Objekt kann nur Methoden aus dem Objekt selbst aufgerufen werden. Ein Argument aus der Methode, jedes Objekt, das innerhalb der Methode erstellt wurde, und alle direkten Eigenschaften oder Felder des Objekts. Oh, endlich die praktische Bedeutung klar. Darüber hinaus kamen alle diese Richtlinien am Ende zu der folgenden einfachen Aussage. Sprich nicht mit Fremden. Eine andere einfache Formel dieses Gesetzes wird verwendet. Nur ein Doc. Okay, dann gehen wir, um ihr ein praktisches Beispiel zu sehen, das vor langer Zeit von David Bach vorgeschlagen wurde. Es ist eine großartige Illustration für das Problem. Betrachten Sie den folgenden Fall. wir so, als ob wir die Geschäftsbeziehungen zwischen einem Papierjungen und dem Kunden, der Zeitschriften kaufen möchte, motillieren sollten. Ein Papierjunge klingelt an der Türklingel, der Kunde öffnet sie. Ein Paperboy muss irgendwie bezahlt werden und dann eine Zeitschrift an den Kunden übergeben werden. Schauen wir uns den Code an. Beispiel. Welche Modelle? Der Fall hier ist eine einfache Kundenklasse, die Vor- und Nachnamen hat, und es hat auch eine Brieftasche vom Typ Wallet. Hier können Sie die Wallet-Klasse sehen. Es ist extrem einfach. Es speichert nur den Dezimalwert, der den Geldbetrag in der Brieftasche bestimmt. Der Klient aus der Brieftasche. AP. Ich kann Geld in die Brieftasche hinzufügen, kann Geld abheben und die aktuelle Menge an Geld überprüfen. Sieht gut und einfach aus. Es ist nur Gewalt, die unsere Bedürfnisse ernähren sollte. Die letzte Sache ist, die Logik von einem Papier zu implementieren, aber schauen wir nach innen. Die Kartonklasse zeigt eine einzige Methode Deliver Magazin, die die Kosten für das Magazin und den Kunden, an den ein Paperboy liefern muss, übernimmt. Das Magazin sieht toll aus. Schauen wir uns das Implementierungspapier an. Boi nimmt nur die Brieftasche von einem Kunden und überprüft dann die Menge des Geldes, wenn es genug Geld gibt , den der Papierjunge nur nimmt, sie brauchten etwas. Sonst geht ein Papierjunge einfach weg. Großartig. Nun, ich würde sagen, was denkst du? Ist es wirklich toll? Wenn Sie ein wenig tiefer denken, dann können Sie mit der Idee kommen, dass es etwas seltsam in der Tatsache, dass der Papierjunge nimmt die Brieftasche von einem Kunden, um bezahlt werden, ein Papierjunge hat Zugang zu Kunden Welt. Was für ein Unsinn. Wären Sie so nett, Ihre Brieftasche unbekannte Paperboys zu geben? Ich bezweifle so in diesem Fall, die Verletzung des Gesetzes von D brauchen einen Reservist. Der Papierjunge arbeitet mit einem Wasser durch einen Kunden. Der erste Punkt hier im Code ist, wenn ein Paperboy die Welt nimmt. Dann gibt es eine zweite Tochter Wenn er die Menge an Geld in der Welt im gleichen Fall überprüft , wenn ein Paperboy etwas Geld abheben, um das Problem zu beschreiben oder ernsthaft, sollte ich sagen, dass das Hauptproblem mit diesem Design ist, dass die Papier Jungen ausgesetzt mehr Informationen, als er sein muss. Alle Probleme sind die Folgen dieser Tatsache. Jetzt sind diese drei Klassen eng gekoppelt. Wenn wir die Weltklasse ändern, wenn ich Änderungen an beiden anderen Klassen vornehmen muss, übrigens, wenn eine Brieftasche jetzt ist, dass der Papierjunge die untere Referenzausnahme werfen wird, so könnte es sein, dass in der realen Welt Code basiert, muss der Paper Boy damit umgehen, jetzt Prüfungen einführen und die zweite Sequenz, die den Code überladen. Wie kann man das Problem beheben, um das Problem zu beheben? Schwächen Nur motile die reale Welt Szenario. Wenn der Papierjunge eine Zeitschrift liefert, bittet er nur um eine Zahlung. Schauen wir uns das verbesserte Design an. Jetzt. Die Kundenklasse stellt die öffentliche Methode „Zahlung abrufen“ zur Verfügung. Während das zugrunde liegende Wallet-Objekt jetzt in einem privaten Feld enthalten ist. Niemand außer dem Kunden hat Zugriff auf seine Brieftasche. Der Papierjunge ist jetzt gezwungen, die Zehe. Bitten Sie den Kunden, eine Zahlung zu erhalten. Paperboy nein hat nicht die Rechte. Und übrigens, die Verantwortung, die Verantwortung, wie im vorherigen Design, in der Brieftasche des Kunden zu fummeln, so dass das verbesserte Design auf drei Arten besser ist. Es modelliert besser das Szenario der realen Welt. Der Paper Boy Code bittet den Kunden jetzt um eine Zahlung. Der Papierjunge hat keinen direkten Zugriff auf die Brieftasche. Zweitens, die Rolle, die Klasse jetzt ändern kann. Und die Paper Boys völlig isoliert von der Änderung und der dritte waren nun frei, die Implementierung der get Zahlungsmethode zu ändern. Okay, wechseln wir zurück zu Dias. Zusammenfassend möchte ich sagen, dass die Regel über die Anzahl der Punkte manchmal täuschend sein kann. Die Sache ist, dass das Gesetz vom Zähler nicht über die Anzahl der Punkte geht. In diesem Gesetz geht es darum, die Kopplung zu reduzieren und die Verkapselung zu beweisen. Wenn wir über Datenstrukturen wie Datenstrukturen sprechen, die durch das Excel Dokument verfügbar gemacht werden, ist es völlig in Ordnung, wenn es ein P ist. Ich erlaubt Ihnen, die Struktur des Dokuments wie dieses Excel-Dokument zu graben, das sie nicht Zelle und so weiter. Das gleiche kann auf fließende AP Augen angewendet werden. Wenn jedes Ziel ein Objekt zurückgibt, so dass Sie Methodenketten erstellen können, behandeln Sie also immer Regeln nicht als Dogmen und versuchen Sie, die zugrunde liegende Bedeutung des Raums zu verstehen . Anstatt Regeln blind in der nächsten Vorlesung anzuwenden, werden wir das Prinzip von geringstem Erstaunen lernen. 54. 08 PoLA: Diese Vorlesung trägt den Titel Principal Off Mindest Erstaunen und andere Grundprinzipien, auf denen eine große Anzahl von Vater Prinz stehen wird, ist das Prinzip aus dem geringsten Erstaunen. Dieses Prinzip besagt, dass sich eine Komponente außerhalb eines Systems in einer Weise verhalten sollte, die mit dem Verhalten von Benutzern außerhalb dieser Komponente übereinstimmt . Die folgenden Prinzipien und Techniken beruhen auf dem Prinzip aus der Liste Erstaunen. Und natürlich helfen sie, sich an dieses Prinzip zu halten. Voll sicher. A p I Befehl Abfragetrennung in Veränderbarkeit entworfen durch Vertrag und jetzt Prävention und viele andere. Sehen Sie sich das folgende Beispiel an. Wir haben eine Reporting-Klasse mit zwei Methoden bringt Bericht ein und drucken Bericht. Be und dieses Code-Snippet funktioniert gut. Aber wenn ein Client die Reihenfolge dieser Aufrufe wie folgt ändert, ein Datenbankverbindungsfehler von Ihnen. Die Sache ist, dass eine Datenbankverbindung zu Beginn des Bring to Reppert eine Methode öffnet und am Ende der print Reppert be Methode schließt. Dies ist ein einfaches Beispiel, das einen starken Geruch von zeitlicher Kopplung hat, wo die Wurzel verursacht die Nebenwirkung, die vor dem Client verborgen ist, was das sehr erstaunliche aus der Sicht des Kunden macht. Humorvoll können wir schließen, dass die Metrik, die den Faktor von Erstaunen reflektiert oft FBI ist, dass die Zahl von geschrien WTF erlaubt ist. Einfach ausgedrückt, bedeutet das Principal Off List Erstaunen, dass ein Design sowohl große Erwartungen als auch diese Erwartungen erfüllen sollte . Es sollte so ziemlich das tun, was die Leute erwarteten zu tun. Ein weiteres Beispiel für ein Acht b I, das seine Kunden erstaunt, ist der Typ über den Standard-Java-Stack. Standard-Stack-Implementierung in Java hat Bush- und Pop-Methoden ausgesetzt , und außerdem stellt sie die von der Vektorklasse Gottes geerbte Anzeigenmethode zur Verfügung. Was die ed Mathe es tun soll, wo das Element hinzugefügt werden soll. Es ist absolut erstaunlich. Ich war fast großartig, als ich den Tag zum ersten Mal sah. Hier ist ein Beispiel aus dem Seeshop. Ein Benutzer würde von der zumindest erwarten, dass es Toe hinzufügen Elemente erlaubt. Leider ist auch das Sea Shop-Typ-System in diesem Fall nicht ideal. Sie werden nicht unterstützt. Außergewöhnlich der Thron. In der nächsten Vorlesung erfahren Sie, was die Informationen versteckt und gekapselt sind, und was ist der Unterschied zwischen ihnen 55. 09 Einkapselung: Diese Vorlesung trägt den Titel Information Verstecken und Verkapselung. Wenn wir uns Wikipedia ansehen, werden wir die folgende Definition aus der Information Verstecken in Informatik sehen Information Verstecken ist das Prinzip der Trennung von den Designentscheidungen in einem Computerprogramm , die am ehesten zu ändern sind, so dass andere Teile des Programms vor umfangreichen Modifikationen geschützt werden. Wenn sich die Entwurfsentscheidung geändert hat, beinhaltet der Schutz eine stabile Schnittstelle, die den Rest des Programms vor der Implementierung schützt . Die Details, die sich am liebsten ändern, wurden auf andere Weise geschrieben. Ausblenden von Informationen ist die Möglichkeit, zu verhindern, dass bestimmte Aspekte einer Klasse oder Softwarekomponente für ihre Clients zugänglich sind. Verwendung beider Programmiersprachen Fissuren wie private Variablen waren eine explizite Exportrichtlinie . Ich stimme dieser Definition zu, und nachdem ich die soliden Prinzipien gelernt habe, ist es absolut klar, dass das Verstecken von Informationen allen soliden Prinzipien zugrunde liegt. Wir bemühen uns immer, diese Informationen zu verbergen, was für die Kunden irrelevant ist. Wenn ein Kunde sieht, was er nicht braucht, ist es schwieriger, solch einen p I zu verstehen. Eine der beliebtesten Fragen, die Sie in Interviews hören können, ist die Erklärung des Unterschieds zwischen Informationsverbergen und Kapselung, eine große Anzahl von Menschen verwirrt diese Begriffe. Es gibt eine populäre Meinung, dass diese Begriffe die gleichen sind. Ich stimme dieser Aussage nicht zu, dass das Verstecken von Informationen die Samos-Kapselung ist. Und hier ist der Grund. zunächst, Versuchen Siezunächst,zurückzuschauen und auf die folgende Frage zu antworten. Erstellen Sie Ihre Anwendungen auf der Basis von wiederverwendbaren Komponenten? Ich bin sicher, auf 100%, dass Sie geantwortet haben. Ja, das tue ich. Natürlich tust du das. Wenn Sie auf Job O C Sharp programmieren als Ihre Anwendungen, zumindest stehen Sie oben auf einem ganzen verdammten Framework. Und die folgende Frage ist, lesen Sie den Quellcode von diesen wiederverwendbaren Komponenten? Wenn es regelmäßig verfügbar ist und die Antwort höchstwahrscheinlich ist, tun Sie es nicht von Zeit zu Zeit. Wir müssen zum Beispiel den Quellcode von BCL lesen . Aber das ist ein seltener Fall. Dies liegt daran, dass diese Komponenten gekapselt sind. Sie erlaubten, sie zu benutzen, ohne ihre Innenräume zu graben. Wir brauchen keinen Zeh. Verstehen Sie die Küche aus wiederverwendbaren Komponenten, um sie zu verwenden. Das ist es, was Kapselung ist. Die Kapselung ermöglicht die Wiederverwendung von Komponenten ohne Verständnis ihrer internen Implementierung. Schauen Sie sich das Beispiel einer schlecht gekapselten Klasse hier ein necken. Es mag scheinen, dass dies ein Silizium-Beispiel ist, aber ich habe eine Menge von solchen Goldbasis gesehen. Natürlich ist dies der schlimmste Fall, aber selbst ein AP erinnern schlecht umgesetzt kann zu schwerwiegenden unglücklichen Folgen führen. Was ist damit nicht los? A. P Ich schaue auf das Tempo Verkäufer und Methode. Warum gibt es einen String-Wert zurück? Ist es der Code aus der Antwort? Ist es ein Kunde I D Rücksendung? Wer zum Teufel könnte wissen, was durch String-Wert gekapselt werden kann? Er nimmt den Berg, der durch Strom dargestellt wird. Was wird hier erwartet? Eine Dezimalstelle oder ein Spaziergang? Vielleicht suchen Sie eine ganze Zahl weiter, aber sie erhalten Kundenmethode Rückgaben Vermeiden Sie, um zu verstehen, wie diese Methode zurückgibt, ein Kunde, der ein Kunde der Sicherheit über das empfangene Ereignis und die letzte entfernen Kundenmethode wissen muss . Es gibt wieder eine ganze Zahl zurück. Alles kann durch einen ganzzahligen Wert dargestellt werden. In einem solchen Fall habe ich einmal gesehen, wie ein C-Programmierer ganze Zahlen verwendet hat, um Bulletins seine Einsen und Nullen im C-Shop zurückzugeben . Ja, ich habe sogar einen so gruseligen Papierkorb gesehen, wie dieser Code aussehen könnte. Hier ist das Grundgehalt, das nichtig zurückgibt und Dezimalzahl akzeptieren. Alles ist verständlich. Jetzt ist es ein Befehl, der den Geldwert in Dezimalstellen akzeptiert. Eine weitere Möglichkeit besteht darin, einen Ergebnismoment zurückzugeben , der außerhalb des Geltungsbereichs dieses Kurses liegt. Wenn Sie daran interessiert sind, robuste AP Augen in Bezug auf Fehler mit der Verwendung Ergebnis Moment betrachten meinen Kurs A B und C Shop nehmen, die Best Practices des Designs und der Implementierung auf Sie. Für mich, eine andere Methode get Kunde gibt nun einen Kunden zurück. Alles ist ganz klar. Eine andere Möglichkeit ist es, zurückzukehren und vielleicht aus dem Kunden vielleicht auch so genannt Mona, die außerhalb des Geltungsbereichs dieses Kurses ist. Und wenn Sie daran interessiert sind, Roboter zu bauen, Band Jungs in Bezug auf jetzt ist mit der vielleicht Moment betrachtet, um meinen Kurs einen PNC-Shop zu nehmen , die Best Practices des Designs und der Implementierung auf Sie dimmen es für den entfernten Kunden kann entweder void oder ein Ergebnis zurückgeben. Wir verwenden ein Ergebnismoment explizit in einer Signatur zu sagen, dass die Operation, die sie fehlschlagen, wenn sie zurückgibt vermeiden, bedeutet dies, dass die Operation immer erfolgreich ist. Dies ist ein Beispiel für eine gute Klarheit, a p I. Die Absicht aus Kapselung besteht darin, die in Varianz zu schützen, indem ungültige Zustände unmöglich Befehl Quitter gemacht wird. Das Trennprinzip ist eines der wichtigsten Prinzipien im Zusammenhang mit der Kapselung. Und dann möchte ich scherzen, dass Sie immer daran denken sollten, dass Sie Code schreiben sollten, damit der Leser Ihres Codes ein psychopathischer Massenmord sein könnte. Wer kennt Ihre Wohnadresse? Schlafen Sie gut, mein lieber Student. 56. 10 API: Was ist ein P I, im Wesentlichen ein p I ist eine abgesetzte Funktionalität. Im Großen kann es als ganze Bibliothek ausgeliefert werden. Oder es kann einfach eine Klasse sein. Jeder Programmierer produziert einen Preis in der einen oder anderen Form. Gute Programmierung ist modular. Was von Natur aus bedeutet, dass diese modularen Grenzen AP-Augen für sich sind. Gute AP Augen neigen dazu, wiederverwendet zu werden. Sie können zu einem großen Vorteil werden. Im Gegenteil, schlecht ein Preis werden Verbindlichkeiten. Sie sind ein nettes CP-Auge. Es gibt böse AP-Augen, aber es gibt kein perfektes FBI. Definitiv die perfekte Ein Kuchen ist etwas auf einem realistischen. Wenn Sie eine Klasse für den internen Gebrauch innerhalb eines Unternehmens entwickeln, entwickeln Sie eine private A kaufen für die anderen Entwickler in Ihrem Unternehmen, diese Art off Umgebung, in der die kalten Blätter markieren Samen nennt Zoo, wenn Sie eine Klasse für die entwickeln öffentlich. Es ist ein öffentliches FBI, das potenziell von Millionen von Entwicklern auf der ganzen Welt verkauft verwendet werden kann, dass diese Art von Umgebung, in der der Code hinterlässt Mark Samen nennt Wildnis. Diese beiden Hauptfälle sind unterschiedlich, aber wie sehr sie unterschiedlich sind. Wir werden ein wenig nach der Einführung in Betracht ziehen. Übrigens, Sie können einen großen Artikel über Ranger und Zookeepers von Mark Semen nach dem Link lesen, den ich beigefügt habe. Erstens wäre es sehr schön, Eigenschaften aus einem guten a p I zu definieren. Wir werden die folgenden Eigenschaften markieren. Einfachheit, Ausdruckskraft und Kompromisse, Erweiterbarkeit und Konsistenz. Lassen Sie uns nun tiefer in die Eigenschaften von AP Augen eingraben. Die erste charakteristische Einfachheit kann durch die bekannte Regel in Bezug auf eine Pastetenentwicklung beschrieben werden , die Sie immer hinzufügen, aber nie entfernen können. Dies bedeutet, dass Sie, wenn viele Benutzer von Ihrem a p I entfernt sind, Funktionalität, die sie bereits verwenden, nicht entfernen können. Deshalb ist es immer vorzuziehen, fragwürdige Funktionen zu verschieben, anstatt sie in die aktuelle Version von Kurs einzubeziehen . Die vorherige Aussage bezieht sich auch auf AP Ivor Shani, aber wir betrachten es im Zusammenhang mit der Suche nach der Balance zwischen Macht und Einfachheit. Hier stehen wir vor einem Kompromiss zwischen Macht und Einfachheit. Wenn Macht oder, anderen Worten, Fähigkeiten ausgedrückt in Funktionalität off auf einem p I grob, es ist Einfachheit verschlechtert. Das Gleichgewicht ist irgendwo in der goldenen Mitte versteckt, so dass eine der interessantesten Fragen hier ist, wie man die Einfachheit schätzt, oft ein P I. oft ein P I. Leider gibt es keine algorithmischen Möglichkeiten, um eine sinnvolle Koeffizienten aus Einfachheit. Oft vom FBI. Die einzige Möglichkeit zu verstehen, ob ein FBI einfach ist oder nicht, ist, die Zeit zu schätzen, die für das Verständnis von seinen Benutzern aufgewendet wurde. Diese Methode ermöglicht es, eine Lernkurve zu bauen, oft FBI, wenn die A P I Einfachheit aus, die Sie versuchen zu analysieren, ist relativ klein se. Wenn es kein riesiger Rahmen ist, dann können Sie es ein paar Ihrer Kollegen geben und zuschauen. Wie viel Zeit werden sie brauchen, um Ihr A P I zu verstehen und wie oft werden sie Kommentare oder Unterlagen vom FBI benötigen ? Dieser einfache Schritt zeigt, ob das FBI einfach genug ist, Vergleich zu Ihren Anforderungen an Einfachheit oder nicht. So zunächst können Sie zunächsteine Frist für das Verständnis von Europa festlegen. Dann bitte ich Ihre Kollegen, zu versuchen, eine Preisfunktion zu nutzen und dann Ihre Prämisse zu vergleichen . Riel-Ergebnisse auf diese Weise gehen, werden Sie in der Lage sein, eine Entscheidung zu treffen, um Ihren Kuchen einfacher zu machen oder am aktuellen Punkt zu stoppen . Dinge werden komplexer, wenn ein P I in Begriffen aus einem bestimmten Domänenmodell ausgedrückt wird. In diesem Fall müssen Sie diejenigen finden, die mit dem Domänenmodell vertraut sind und diejenigen, die nicht sind. Warum beides? Weil Programmierer Personalressourcen sind und jederzeit ein Unternehmen verlassen können. Diese können zu der Situation führen, in der ein Neuling die Verantwortung übernimmt, mit Ihrem A p Izu arbeiten Ihrem A p I Sie müssen also verstehen, wie viel Zeit es dauern wird, um Ihr A P I zu verstehen. In beiden Fällen führen diese Gedanken zu die nächste Eigenschaft aus einem guten A P I. Gute AP Augen sind teuer, denn um sie einfach zu machen, es ist ein Zubehör, um viel mehr Zeit zu verbringen, als nur alle Assays zu versenden. Leider leidet nicht nur Einfachheit unter Investitionen, Fehler neigen zu akkumulieren und das Design beginnt zu verrotten. Folglich führt es zu einem großen Ball von Schlamm anstelle von Klarheit, und am Ende führt es zu Box Ressource ist, die zugeordnet werden kann Reparatur Entwicklung sind immer begrenzt . Also offensichtlich können wir nicht lange acht Kerle polieren. Deshalb gibt es übrigens immer Kompromisse zwischen Macht und Einfachheit. Trotz des Strebens, ein super mächtiges FBI zu schaffen, ist es fast unmöglich, universell zu parade, Jungs, es bedeutet, dass ein P I Entwickler müssen zuerst die ersten Dinge implementieren. Um die wichtigsten Szenarien zu verstehen, ist es ein Zubehör, um Fähigkeiten, Vorteile und Fehler zu analysieren , die vom Benutzer in allen verschiedenen Weisen aus der Implementierung eines P I-Ausmaßes konfrontiert werden . Stabilität ist das nächste Hauptmerkmal. Dieses Merkmal spiegelt die Fähigkeiten, um die Macht zu erhöhen, oft FBI ohne Abschlussschreiben. Es gibt ein paar Neuigkeiten in Bezug auf diese Eigenschaft. Wir können betrachten erweitert Fähigkeit aus der Perspektive, Hinzufügen neuer Funktionen und Erhaltung der Abwärtskompatibilität. Das Design sollte sich bemühen, neue Funktionen hinzuzufügen. Das Hauptobjekt sind nicht Prinzip in diesem Fall ist das offene Close-Prinzip, was bedeutet, dass ein Objekt zur Erweiterung geöffnet und zur Änderung geschlossen werden sollte. Ich würde sagen, dass dieses Prinzip meistens auf den Zoo anwendbar ist. AP Eyes e g hell mit den Jungs als öffentliche acht Jungs ist, dass wir auf den ersten nicht Rollout Features, die mit der Funktionalität widersprechen könnte, die in der Zukunft eingeführt werden kann . Wenn Sie Zweifel haben. Es ist besser, kein FBI-Mitglied einzuführen, als es vorzustellen. Wenn wir über öffentliche AP Augen sprechen, schießen wir zuerst, bewahren die Abwärtskompatibilität, Ändern einer vorhandenen AP I, so dass es alle vorhandenen Clients brechen wird, ist die größte Szene. Leider diese Szene manchmal nicht vermieden werden, aber Sie sollten versuchen, den Client-Code so selten wie möglich zu brechen. Ein FBI muss logisch und konsequent sein. Die Konsistenz, oft FBI, bedeutet, dass Entscheidungen für das Design des Bandes gelten. EI sind stark eigenmächtig. Es wird immer verschiedene Optionen mit ihren Vor- und Nachteilen zur Verfügung stehen. Aber ein P I Designer sollten beiseite nehmen und dabei den ganzen Weg bleiben. Schauen wir uns ein schlechtes Beispiel für Konsistenz an. Die Beach Peaster Library stellt die folgenden Methoden zur Verfügung. Anscheinend gibt es eine inkonsistente Benennung von Methoden. Es sieht so aus, als ob Entwickler Zweifel hatten und zögerten, bei welchem Stil sie bleiben sollten. Auf dem Weg. Die beste Option in diesem speziellen Fall war, überall Unterstriche zu verwenden. Ein schlimmster Weg war, überall zu verwenden. Die zusammenhängende Benennung und der schlimmste Weg ist überall zu verwenden, verschiedene Namensstile, der schlimmste Weg ist genau das, was BHP String AP I Designer gewählt haben. Jetzt sollten Entwickler zwei verschiedene Benennungsstile berücksichtigen und daran denken, wann sie verwenden , die es Dies ist wirklich verrückt. Okay, wir haben die Eigenschaften der Glaubensleute besprochen. Lassen Sie uns jetzt kurz über öffentliche und private Jungs sprechen. Die markierten Prinzipien sind wichtiger, um öffentliche AP Augen öffentlich aufzubauen, Jungs setzen mehr Verantwortung für die Jugend und privat Augen sein. Deshalb müssen Sie sich bemühen, diese Eigenschaften so viel wie möglich besser zu machen. Die Kosten für schlechte Entscheidungen können extrem hoch sein. Was ich gerade gesagt habe, bedeutet nicht, dass die Entwickler des privaten FBI diese Eigenschaften nicht berücksichtigen müssen . Ich glaube stark daran, dass private AP Augen entwickelt werden sollten, unter Berücksichtigung all dieser Eigenschaften. Die Auswirkungen von minderwertigen privaten AP, die ich entwirft, könnten schrecklich sein. Die Sache ist, dass Schichten auf anderen Ebenen sowie Anwendungen aufgebaut werden, die oft auf anderen Anwendungen basieren. Die Einführung von bahnbrechenden Änderungen in private AP-Augen könnte sich daher sehr schlecht auf abhängige Module und ganze Anwendungen auswirken . Die Corolla re dieser Tatsache ist, dass Zookeepers müssen sich bemühen, Ranger sowieso zu werden. Daher sind alle Techniken, die wir in diesem Kurs diskutieren, für die Entwicklung von privaten und öffentlichen AP Augen mehr zum Thema. Sie können die folgenden Links zu dieser Vorlesung lesen. Okay, lassen Sie uns ein wenig über ein P I Entwicklungsprinzipien sprechen. Es gibt einige Entwicklungsprinzipien, die uns helfen, ein P Augen mit großen oder zumindest zufriedenstellenden Eigenschaften zu schaffen . Schauen wir uns sie genauer an. AP Augen sollten so einfach wie möglich sein, aber nicht einfacher. Dies ist das Prinzip, das zunächst Albert Einstein gesprochen hat. Dies ist ein allgemeiner Grundsatz, der auf viele Dinge in unserem Leben anwendbar ist, im Rahmen einer Preisentwicklung. Dieses Prinzip impliziert, dass einfache Dinge einfach sein sollten und gleichzeitig schwierige Dinge in der Praxis erreichbar sein sollten. Es bedeutet auch, dass, wenn Sie Zweifel über die Einführung eines bestimmten Mitglieds haben, einfach es auslassen. Denken Sie noch einmal daran, dass Sie immer hinzufügen, aber nie entfernen können. Diese Regel ist relevanter für die Öffentlichkeit ein Preis, aber vergessen Sie nicht, dass die Einführung brechen Veränderungen in privaten FBI ist auch eine Szene, eine gute AP. Ich sollte erlauben, viel zu tun, ohne viel in der Praxis zu lernen, es bedeutet, dass Sie sich bemühen sollten, ein P Augen zu bauen, die einfach in anderen zu verwenden sind, um einfache Aufgaben zu erfüllen. Und oben auf diesen einfachen Szenarien sollten schwierigere Aufgaben möglich sein. Haben Sie bemerkt, dass das erste Prinzip mit der 2. 1 resoniert? Eigentlich sind alle Prinzipien verheddert. Sie alle haben etwas gemeinsam. AP Augen sollten auf Anwendungsfällen als praktische Corolla re wir hier sagen können, ist, dass es zwei Dinge bedeutet. Die 1. 1 ist, dass, um einen AP zu entwerfen, ich mir nur vorstellen, dass Sie ein Kunde des Bandes sind. Ich schreibe einen Code , der verwendet, dass gerade noch nicht existent a p I. Wie die Kunden kalt aussehen sollte wie die Kälte, die Sie geschrieben haben. Die zweite Sache ist, dass Sie so schnell wie möglich beginnen müssen, eine Skizze von einem Nachbarn zu machen . Sammeln Sie keine Abschaltungsanforderungen, machen Sie einfach eine einfache Skizze und fragen Sie: Sind die Entwickler, was denken sie über Ihr Design? Das erste, was Sie tun sollten, ist, mehrere kalte Proben für die wichtigsten Anwendungsfälle zu schreiben. Bitten Sie Ihre Kollegen, diese wichtigsten Anwendungsfälle zu implementieren, wenn sie Schwierigkeiten hatten. Es ist ein schlechtes Zeichen. Stellen Sie eine niedrige Barriere für die Verwendung eines A P I bereit. In der Praxis bedeutet dies, dass Sie den einfachsten Konstruktoren immer Standardwerte für Parameter zur Verfügung stellen sollten , die Ausnahmen mit Meldungen auslösen, die erklären, was zu beheben ist. Das Problem sollte nicht von Clients verlangen, explizit mehr als einen Typ für die Hauptverwendung zu erstellen . Fälle sollten nicht von Plänen erfordern, um eine breite Initialisierung durchzuführen, oft Objekt bauen selbsterklärende AP Augen. Ich würde diesen Gedanken zum Ausdruck bringen. Mit anderen Worten, lassen Sie einen Kuchen Kunden auf Intel verlassen ein Gefühl A von Kunden sollten die a pie verstehen, indem Sie nur die Intelligenz verwenden. Also ein a p I muss intuitiv verständlich sein. Trotz des vorherigen Punktes sollten Sie eine anständige Dokumentation im Fall von privaten AP Augen zur Verfügung stellen. Dies ist besonders wichtig für einen Preis, der die wichtigsten Begriffe enthielt, was sie von Natur aus schwer zu verstehen macht, vor allem für diejenigen, die erst am Anfang sind, die Domain-Konzepte zu lernen. Am Ende würde ich sagen, dass Ihr Baby ich die stärkste Emotion ansprechen sollte. Welches denkst du? Liebe? Nicht genau. Appell an die Faulheit. Niemand will ein Buch lernen. Eine Hand in der Dicke über die Verwendung Ihres FBI. Niemand, auch du. 57. 11 SOLID VS YAGNI: Dieser Vortrag trägt den Titel „Solide gegen Young“. Wenn Sie sich den Kurs genau ansehen, können Sie feststellen, dass wir beim Versuch, ein Designproblem zu beheben , immer mehr Klassen und Funktionen hatten. Mit anderen Worten, es scheint, dass wir mit einem komplexeren Design endete. Blinde Anwendung von soliden Prinzipien kann uns zu der unnötigen Komplexität führen. Lächeln Sie sehr oft. Unnötig Komplexität ist das direkte Ergebnis der Verletzung des Yardeni-Prinzips. Greg Young kam vor langer Zeit mit der folgenden Aussage heraus. Entwickler neigen dazu, spezifische Probleme mit allgemeinen Lösungen zu lösen. Vergoldung führt immer zu Kopplung und Komplexität und Software. Greg Yann schlug vor, Ziege spezifisch zu machen, anstatt sie allgemein zu machen. Das Prinzip der Einzelverantwortung Natural entspricht dem Greg Young Vorschlag, Gold spezifisch zu machen . SRP führt zu spezifischen Klassen mit konkreten Verantwortlichkeiten. Es geht um ein sehr spezifisches Problem. Die Kalay shin off Prinzipien erscheinen, wenn wir eine Situation erreichen, in der wir Code allgemeiner machen müssen , was wir tun sollten, dass die eigentliche Frage ist, was verallgemeinert werden sollte. Die Antwort auf diese Frage gibt ihr wiederverwendetes Abstraktionsprinzip. Das Wickelprinzip bedeutet im Wesentlichen, dass, wenn Sie in unserem Fall eine Abstraktion haben, eine Schnittstelle oder eine abstrakte Klasse und sie nicht wiederverwendet oder anderen Worten von mehr als einem Implementierer implementiert wird. Dann verletzen Sie wahrscheinlich das wiederverwendete Abstraktionsprinzip. Der eigentliche Wert einer Abstraktion ist also, dass sie das Irrelevante eliminiert und das Wesentliche nach Toa Onkel Bob verstärkt . Also hier zu kommen, um Prinzipien zu lösen, die Yardeni Verletzung gleichzeitig vermeiden, beginnen Sie mit einer konkreten Umsetzung aus einem bestimmten Verhalten, beobachten Sie die entstehenden Gemeinsamkeiten und wenden Sie die Regel der drei, die besagt, dass, wenn Sie finden Sie sich in einer Situation, wenn Sie das gleiche genannte dritte Mal wiederholen möchten, müssen Sie eine Abstraktion einführen und das gemeinsame Verhalten darin eingekapselt. Nur so können Sie die Balance zwischen soliden Nous und Ihnen, Agnes auf architektonischer Ebene erreichen . In der nächsten Vorlesung werden wir dieses Thema ein wenig konkretisieren und über OCP versus Yeah, Agnisprechen Agni 58. 12 OCP VS YAGNI: In der vorherigen Vorlesung haben Sie die Beziehungen zwischen soliden Prinzipien im Allgemeinen und Yanni-Prinzip gelernt. In dieser Vorlesung sehen Sie ein konkretes Beispiel von soliden gegen Yardeni in der Form von OCP gegen die Agonie . Lassen Sie uns auf die klassische Form von UCP-Verletzung zurückkommen, die wir im Rezeptbereich analysiert haben. Wir haben hier die feine Gerätemethode, die ihre implementiert. Welche Case-Anweisung Inside Switch Gay Anweisung ist eine Konstruktion aus einer prozeduralen Programmierung in der Natur? Verstößt diese Methode gegen das OCP? Aus der Sicht der Myers Klatschdefinition wird das Rezept hier nicht verletzt, da das Hinzufügen eines neuen Gerätemodells zu keiner Änderung der Signatur aus der Feuergeräte-Methode führt . Aber wir haben uns vor allem an der Definition von Martin interessiert. In der heutigen Zeit und aus Martins Sicht wird das OCP eindeutig verletzt, um das Problem zu beheben. Im OCP führte Sectional eine abstrakte basierte Klasse und mehrere Erben ein, die die Gerätemodelle darstellten. Also haben wir mehrere neue Typen anstelle von anfänglichen eingeführt. Ja, Agni bedeutet gleichzeitig, dass wir keine Abstraktionen einführen müssen, bis wir sie wirklich brauchen. Also, was mit dieser Situation zu tun? Welches Prinzip sollte hier warten Klatsch Orry Ogni, Ein Kollege von mir, Vladimir Horcoff, gibt eine große Antwort auf diese Frage. Seine Antwort ist, es kommt darauf an. Es hängt davon ab, worüber wir vorher gesprochen haben. Ob wir über öffentliche AP sprechen, ich oder nicht, die Antwort ist in diesen Fällen anders. Also im Fall von einem privaten AP, ich jung ist wichtiger als OCP. Wenn wir den Code vollständig besitzen und ihn innerhalb einer privaten Gruppe von Menschen entwickeln, sollten wir keine Abstraktionen einführen. Bis wir sehen, dass der dritte sich wiederholende Cho Chung erscheint, dann müssen wir OCP anwenden, um übermäßige Code-Anwendung zu verhindern. Im Falle der öffentlichen AP, ich müssen wir Ihre Qual opfern und OCP sofort anwenden, weil die zukünftigen Kosten zu Ehren Factoring in Richtung der objektorientierten Design enorm sein wird brechen Veränderungen einführen . Kunden mögen es nicht, Änderungen zu brechen. In diesem Fall ist OCP wichtiger als Yanni. In der nächsten Vorlesung klären wir den Unterschied zwischen SRP und ich spreche 59. 13 SRP und ISP: Diese Vorlesung wird als R P und Eyes Speed betitelt. Sehr oft werden Entwickler durch den Unterschied zwischen SRP und ich spreche verwirrt. Zum Beispiel sagen Entwickler, dass, wenn sie dieses R P anwenden, keine Eisgeschwindigkeit anwenden müssen. Seit alle Brillen eine einzige Verantwortung haben, denken sie, dass ich Geschwindigkeiten anwenden, um diese RP-Verletzung zu beheben. jedoch Diese Meinung istjedochweit davon entfernt, die Wahrheit zu sein. S R B impliziert, dass eine Klasse nur eine haben sollte. Der Grund zu ändern Ich spreche zur gleichen Zeit sagt uns, dass Kunden nicht von Dingen abhängen sollten , die sie nicht mehr konkret brauchen und gehen direkt auf den Punkt, ihre unterschiedlichen Ansichten auf die gleiche Idee, SRP ist mehr auf den Designer Seite. Point off view, während ich spreche, konzentriert sich mehr auf den clientseitigen Standpunkt. Betrachten Sie das folgende Beispiel hier haben eine Datenspeicherung, die sowohl Lese- und Schreiboperationen implementiert . Es wäre seltsam, diese Operationen in separate Klassen zu trennen, so dass wir dies nicht verletzen. Sind sie zur gleichen Zeit hier? Wenn wir 10 Clients haben, die von der Lesefunktion abhängen, und weitere 10 Clients, die von Kreditschreibfunktionen abhängen, könnte es sinnvoll sein, zwei Schnittstellen einzuführen , die ich leser und ich schreibe, um Dinge vor Kunden zu verstecken, die sie tun nicht. Ich muss es sehen, damit wir das Eis hier anwenden können. Ok. In der nächsten Vorlesung werden wir über Architektur und Design sprechen. 60. 14 Architektur und Design: Diese Vorlesung trägt den Titel Architektur und Design. Haben Sie schon einmal gedacht Was ist Architektur? Was bedeutet das? Und was ist der Unterschied zwischen Architektur und Design? Entwickler haben diese Begriffe oft austauschbar verwendet. Es ist sehr wichtig, den Unterschied zu spüren. Beginnen wir also mit der Architektur. Jede seriöse Software hat eine Architektur. Selbst wenn die Architektur chaotisch ist, würde das bedeuten, dass Chaos die Architektur dieses chaotischen Systems ist. Softwarearchitektur ist ein sehr vager Begriff , der sehr oft als höchste Abstraktionsstufe von einem System behandelt wird. Welche Art von Datenspeicherung ist vorhanden? Wie interagieren Module miteinander? Welche Recovery-Systeme sind vorhanden und so weiter? Irgendwo im Jahr 2013 gab es einen Beitrag von Martin Vater, der das Problem der Definition des Begriffs aus Architektur analysiert . Er zitierte Ralph Johnson , der sagte, dass es keine solche Vorstellung, ist die höchste Ebene der Abstraktion eines Systems Benutzer, Entwickler, Entwickler, Produkthalter, sie alle schauen auf das System aus verschiedenen Winkel und sehen Sie die Architektur anders. Es ist richtiger zu sagen, dass die Architektur aus wichtigen Komponenten besteht, und was eine Komponente signifikant macht, ist ein Experte. Entwickler sagen, dass bestimmte Komponenten signifikant sind, so dass der Begriff von der Architektur sozial ist. Es handelt sich um eine formelle und sehr oft informelle Einigung darüber, wie das System von höchster Ebene aus betrachtet werden kann. Es gibt auch eine andere Bett-Definition von Architektur, und es ist wichtig, darüber zu sprechen. Hier ist es. Architektur ist die Entscheidungen, die Sie sich wünschen, Sie könnten gleich früh in einem Projekt treffen. Aufgrund dieser Definition neigen Entwickler dazu, zu denken, dass die Wahl eines bestimmten DBM ass, sie treffen eine architektonische Entscheidung. In einigen Fällen ist es wahr, und in anderen Fällen ist es nicht. zum Beispiel isoliert werden, Wenn wirzum Beispiel isoliert werden,um durch die Verwendung von Schnittstellen an der entsprechenden Grenze von unserem Softwaresystem angehäuft zu werden, und wir könnten ersetzen, dass d ein Chaos ist, machen wir es irrelevant. Und höchstwahrscheinlich werden wir das nicht behandeln. D eine Masse hat eine signifikante Komponente. Eigentlich das BMS und du ich Werkzeuge. Wenn wir sagen, dass eine bestimmte DBM Antwort bestimmte Sie High-Tech gehört zur Architektur. Eine Analogie kommt in den Sinn, dass wir beim Bau eines Hauses Hämmer, Stichsägen und andere Werkzeuge als die Architektur des Hauses behandeln . Das würde unsinnig klingen. Natürlich ist dies keine absolut gültige Analogie, da Hämmer keinen so signifikanten Einfluss auf das Ergebnis haben, wie Datenbankmanagementsysteme. Aber wir müssen verstehen, dass wir uns bemühen sollten, wenn möglich, Werkzeuge aus der Sicht des Bereichs irrelevant zu machen. Wir sollten uns bemühen, architektonische Entscheidungen so weit wie möglich zu verschieben, da Entscheidungen, die in frühen Stadien oft am Ende getroffen werden, bestenfalls nicht optimal sind. Die Definition eines Software-Entwurfs rechtfertigt solche tiefgreifenden Beobachtungen nicht. Softwareentwicklung geht es darum, die einzelnen Module oder Komponenten zu entwerfen. Was sind die Verantwortlichkeiten? Funktionen aus Modul X aus Glas? Warum, was kann es tun und was nicht, welche Designmuster verwendet werden können. Software-Design legt Wert auf Modulkomponente und Quest-Ebene. Wir haben auch solche Begriffe wie Architektur und Design Panners. Architekturmuster sind Standardformulare aus Beziehungen zwischen Komponenten, die bedeutende Architekturmuster im Allgemeinen als zweistufige Client- und Server-Szenario , dreistufiger Client Sir, und Datenbank am häufigsten Software oder beendete Architektur, das Web-Service-Modell, ereignisgesteuert und so weiter. Entworfene Eltern sind jene Muster, über die wir während des Kurses gesprochen haben. Von Zeit zu Zeit können sie in Verhaltens-, Struktur- und Schöpfungsmuster aufgeteilt werden . Ich hoffe, du verstehst jetzt besser. Was ist Architektur und Design? Lassen Sie uns in der nächsten Vorlesung ein wenig über die Suche nach einem Gleichgewicht abscheuen. 61. 15 Schlussfolgerungen: in diesem Abschnitt haben Sie gelernt, dass jedes Stück Wissen eine einzige eindeutige Darstellung im System haben muss , und dies ist die Definition des Antriebsprinzips. Die gebräuchlichsten Wege der trockenen Hauptverletzung sind magische Streams oder Werte, doppelte Logik an mehreren Standorten und wiederholte sogar Logik oder mehrere Switch-Fälle die über die Codebasis verstreut sind. Sie erfahren, dass dies impliziert, dass Einfachheit ein zentrales Ziel im Design sein sollte und dass die Komplexität des Prüfers vermieden werden sollte. Die Haupttechnik, die wir benutzt haben, um mit Komplexität zu kämpfen, ist die Zersetzung. Die Komplexität, die von der Domäne selbst auferlegt wird, wird als wesentliche Komplexität bezeichnet. Zufällige Komplexität ist die Komplexität unserer Lösungen, die die Probleme der Domäne lösen sollen. Ja, aber er geht es nur darum, die Technik zu meiden. Es gibt kein gut definiertes Kriterium, das es ermöglicht, die junge Neuheit des Systems zu messen. Ja, er ist ein Prinzipal aus extremer Programmierung, der besagt, dass ein Programmierer keine Funktionalität hinzufügen sollte , bis er als Zubehör gilt. S Europäischer Fußball sind stark verwandt. Grundsätzlich ist Socke ein Prinzip, das bedeutet, dass wir verschiedene Anliegen in verschiedene Module trennen müssen. Festhalten an Socke ermöglicht es, modulare Systeme zu bauen, hier ist die Liste der Anliegen, die wir oft in der Entwicklung von Unternehmenssoftware konfrontiert werden müssen . Sie ich Geschäftslogik, Präsentation, Logik und Daten Maze Befehl Abfrage, Trennung oder suchen Sie uns ist ein Prinzip, das besagt, dass jede Methode entweder ein Befehl sein sollte , der in Aktion oder eine Abfrage, die Daten zurückgibt an den Anrufer, aber nicht beides. Mit anderen Worten, eine Frage zu stellen, sollte die Antwort nicht ändern. Eine allgemeine Formulierung des Gesetzes von Demeter ist die folgende. Jede Gewerkschaft sollte nur über begrenzte Kenntnisse über andere Einheiten verfügen. Onley-Einheiten, die eng mit der aktuellen Einheit oder jeder Gewerkschaft verwandt sind, sollten nur mit ihren Freunden sprechen oder nicht mit Fremden sprechen, die eine Pull-Off-Liste bringt. Erstaunen liegt einer großen Anzahl anderer Prinzipien und Techniken zugrunde. Dieses Prinzip besagt, dass sich eine Komponente außerhalb eines Systems in einer Weise verhalten sollte, die dem entspricht , wie Benutzer außerhalb dieser Komponente wahrscheinlich zu erwarten sind. Sie haben gelernt, dass Informationen Verstecken und Verkapselung unterschiedliche Konzepte sind. Die Kapselung dient zum Schutz der in Varianzinformationen. Verstecken ist eine der Möglichkeiten, wie wir eine richtige Kapselung erreichen. Sie haben auch gelernt, dass Sie Grenzen zwischen Komplexität und Einfachheit erreichen können, indem Sie ihr wiederverwendetes Abstraktionsprinzip anwenden, dass OCP Yardeni im Falle von öffentlichem AP I und umgekehrt im Falle von privaten A P IBits Yardeni und umgekehrt im Falle von privaten A P I Ja, Agonie schlägt OCP. Sie lernen, dass eine Therapie und Eis pr ähnlich in ihrer Absicht, aber anders aus der semantischen Sicht. SRP und ich sprechen und beide werden auf die gleiche Klasse angewendet. Zum Beispiel widersprechen sie nicht miteinander. Man lernt, dass Architektur und Design unterschiedliche Begriffe sind. Architektur ist die Vereinbarung zwischen Gruppe von Menschen, in der Regel Expertenprogrammierer, über die Bedeutung von Systemkomponenten. Während Software-Design ist ein niedrigeres Konzept und betrifft die Implementierungsdetails am Ende, wie Klassen und Schnittstellen interagieren und so Und er hat auch gelernt, dass Sie natürlich üben müssen, um klug zu werden, in Bezug auf Gebäude wartbare Softwaresysteme. Herzlichen Glückwunsch. Dies ist das Ende des Kurses. Das war eine lange Reise. Ich hoffe, es hat dir gefallen. Ich habe viel gelernt und wurde ein besserer Entwickler. Und danke für das Anschauen