Тёмный

Software Architektur - Keine statischen Klassen 

David Tielke
Подписаться 17 тыс.
Просмотров 2,8 тыс.
50% 1

Keine statischen Klassen...
▬ Über diesen Kanal ▬▬▬▬▬▬▬▬▬▬▬▬
Seit vielen Jahren arbeite ich als Consultant, Coach und Trainer für professionelle Softwareentwicklung mit den Schwerpunkten Softwarequalität, Softwarearchitektur sowie Prozessmanagement. Auf meinem Kanal möchte ich Euch mein Wissen und meine langjährige Erfahrung in diesen Bereichen vermitteln - natürlich kostenlos. Dabei versuche ich stets Euch das Wissen so zu vermitteln, dass Ihr damit direkt in der Praxis loslegen könnt und das ganze immer mit guten Portion Humor. Lernen soll ja schließlich Spaß machen :)
▬ Empfohlene Videos ▬▬▬▬▬▬▬▬▬▬▬▬
Wie viel Softwarequalität Ihr braucht - • Architekturen - Von Mo...
Warum Software unwartbar wird - • Warum Software unwartb...
Architektur - Modularisierung - • Architektur - Modulari...
Was ist Architektur - • Was ist Architektur?
Warum Architektur - • Warum Architektur für ...
▬ Wichtige Links ▬▬▬▬▬▬▬▬▬▬▬▬
Abonniere meinen Kanal: / @davidtielke
Alle Videos: / @davidtielke
▬ Social Media ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
► Twitter: / davidtielke
► Xing: www.xing.com/profile/David_Ti...
► LinkedIn: / david-tielke-06140912b
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Наука

Опубликовано:

 

27 сен 2020

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 17   
@Palladin007
@Palladin007 3 года назад
"GlobalHelper" - Mein Favorit :D Und ja, das Ding gibt's wirklich und macht alles, von Logging über String-Operationen bis Serialisierung
@DavidTielke
@DavidTielke 3 года назад
Ich lege noch einen drauf mit "GlobalHelperUtils" - habe ich auch schon gesehen :)
@Palladin007
@Palladin007 3 года назад
@@DavidTielke Und XmlHelper (drei Varianten, alle partial), CsvHelper (I'm Prinzip ein selbst gebautes Split), MessageBoxHelper, MailHelper, DateTimeHelper, ... Das ganze Projekt besteht aus so Dingen :D
@marcusreinicke
@marcusreinicke 3 года назад
Klasse Ansatz, endlich bekommt das Antipattern "Singleton" eine Aufgabe die dem Pattern gerecht wird. Man läuft hier nicht in Gefahr, dass das Singleton Pattern an späterer Stelle im Projekt, wieder ausgebaut werden muss, weil sich die Architektur bzw. Anforderung ändert. Wenn ich eine statische Klasse nach diesem wirklich "klassen" Ansatz ablöse, bin ich wesentlich flexibler, was testen, Mocking usw. angeht. Eigentlich hätte man da auch selber drauf kommen können. Aber es ist wie so oft im Leben, man braucht es einen kleinen Schubser Danke! Gruß Marcus
@DavidTielke
@DavidTielke 3 года назад
Vollkommen richtig, Marcus! Wenn ich der "Schubser" war, freut es mich natürlich umso mehr :) Gruß David
@guentherzurek2005
@guentherzurek2005 Год назад
Hallo, die Objektorientierung ist eine Technik die bereits in den 60-Jahren in Programmiersprachen Einzug gehalten hat. Den Durchbruch in der Breite gab es wie von Dir bemerkt erst in den 90-Jahren. Schaue Dir einmal SIMULA-67 an. Es ist interessant die Schleifen anzusehen die die Programmierentwicklung genommen hat.
@janhendrikschreier
@janhendrikschreier 3 года назад
Wie löst ihr denn das Problem mit den Magic Strings? Also bspw. Parametern, die aus einer Datenbanktabelle kommen, bei der die Tabelle letztlich nur String/String enthält. Da finde ich eine zentrale Static-Klasse, in der nur const Strings und keine Logic enthalten sind schon die eleganteste (mir bekannte) Lösung. So hat man hinterher eben nicht 100 Stellen mit dem gleichen Magic String, sondern nur eine.
@marcusreinicke
@marcusreinicke 3 года назад
Hmmmm, wenn ich das richtige verstanden habe? Also ich habe da dann immer ein Entity verwendet, wenn die Parameter aus der Datenbank kommen. Dieses kann man gut über das Repository Pattern mocken. Warum sollte ich hier den Umweg über eine statische Klasse machen? Gruß Marcus
@DavidTielke
@DavidTielke 3 года назад
Hey Jan Hendrik, meine Abneigung gegen statische Elemente hat ja zwei Hauptgründe: 1. Nicht mehr auflösbare Abhängigkeiten zu Logik 2. Nicht mehr auflösbare Abhängigkeiten zwischen Komponentne Wenn Du eine statische Klasse verwendest, um dort String-Konstanten zu bündeln, ist das erstmal ein guter Ansatz weil dadurch entsteht ja keine Abhängigkeit zu einer Logik die du entkoppeln müsstest ABER wenn du diese String-Konstanten in mehreren Komponenten verwendest, hast Du halt auch eine Implementierungsabhängigkeit zwischen den Assemblies und das ist halt mega doof. An der Stelle musst Du dich als Architekt fragen was jetzt das kleinere Übel ist, duplizierte Konstanten in den Komponenten oder die Abhängigkeit zwischen Assemblies - ersteres verschlechtert nur die Wartbarkeit, während letzteres fast alle qualitativen Aspekte zerstört, daher verwende ich solche static-String-Klassen maximial in einer Komponente, aber nicht darüber hinaus. Auch wenn Du kein #FragDavid dran gemacht hast, gucke ich mal, dass wir dazu heute Nachmittag in der Kaffeepause ein kurzes Video machen, weil diese Frage kommt sehr oft :) Danke für den Input! Gruß David
@Palladin007
@Palladin007 3 года назад
Ich persönlich sehe da zwei Wege: 1. das, was @Marcus Reinicke schreibt: Wenn die String/String-Werte z.B. Name/Wert-Paare sind und die Namen fix vorgegeben sind, dann kann ich sie auch auf Properties mappen. Das Laden und Mappen wiederum lässt sich dann ganz hervorragend mit dem Repository-Pattern im Rest der Anwendung anbieten, das Mapping könnte auch noch eine eigene Abstraktion sein, wenn man das getrennt vom Repository behandeln möchte/muss. 2. eine Art Mapping auf ein Enum oder eine Factory, die anhand der Namen fertige Objekte/Werte zurück gibt. Beides lässt sich ganz hervorragend abstrahieren, also z.B. IMyAbcFactory, die den Namen aus der DB entgegen nimmt. Dann hast Du wieder eine zentrale Stelle, wo deine Konstanten im Code stehen und kannst sie auch tauschen. Konstanten könnten nämlich genauso eine Gefahr sein, auch wenn es nicht ganz so oft vorkommt.
@Andruuid
@Andruuid Год назад
Wie siehts denn mit statischen Funktionen und statischen member in nicht statischen Klassen aus?Gibts da auch einen Ratschlag?
@larsschmitt7259
@larsschmitt7259 3 года назад
was ist mit einer wirklich fehlenden funktion als ExtensionMethod z.B. AddRange bei einer ObservebelCollection Ja, aus purer faulheit die Schleife immer wieder zu Implementieren
@Palladin007
@Palladin007 3 года назад
In so einem Fall würde ich auf Extension-Methods zurückgreifen. Ich habe aber auch selber gemerkt: Aus diesen "wirklich fehlenden Funktionen" werden ziemlich schnell immer mehr, das Risiko, es zu übertreiben ist also groß. Davids fixe Regel "kein static" halte ich für zu kurz gedacht, aber in 99% der Fälle korrekt und daher allgemein sicherer, denn nicht jeder achtet so genau auf seinen Code.
@DavidTielke
@DavidTielke 3 года назад
Hallo Lars, die alternative ist dir eine ICollectionExtensions per Konstruktor injizieren zu lassen und dann dort diese Methode aufzurufen. Das ist im Code natürlich nicht so lesbar, wie die Lösung mit Extension-Methoden, allerdings funktional vollkommen identisch. Am Ende ist Architektur immer das abwiegen von Entscheidungen: Willst du die bessere Lesbarkeit aber dafür die Wiederverwendbarkeit, Austauschbarkeit und Testbarkeit zerstören? Oder willst du die etwas weniger lesbare Variante mit ICollectionExtensions und dafür weiterhin alle anderen qualitativen Aspekte erfüllen? Ich würde da komplett zu letzterem tendieren!!! Zusätzlich finde ich den Hinweis von Paladin007 sehr wertvoll: Einmal so eine Erweiterungsklasse geschrieben, stehen allen Projektbeteiligungen Tür und Tor offen das ganze sehr unvorteilhaft zu "missbrauchen" und meine Erfahrung zeigt das leider auch genau das gemacht wird! Gruß David
@DavidTielke
@DavidTielke 3 года назад
Nein, ich würde weiterhin die Finger von Erweiterungsmethoden lassen (siehe meine andere Antwort) weil hier die Lesbarkeit des Quellcodes nicht über die Aspekte wie Wiederverwendbarkeit und Austauschbarkeit auf Komponentenebene gestellt werden sollte und die würde man hier zerstören. Trotzdem Dein Hinweis auf das "übertreiben" teile ich zu 100%, das ist ein weiterer Punkt weshalb ich Erweiterungsmethoden nicht mag :) Danke für die Anmerkung!
@Palladin007
@Palladin007 3 года назад
​ @David Tielke Bei Erweiterungsmethoden ist die Wiederverwendbarkeit ja genauso gegeben, wie bei einem ICollectionExtensions-Service, Austauschbarkeit natürlich nicht. Aber Beispiel Add vs. AddRange, das ICollection-Interface hat kein AddRange. Das sähe so aus: public static void AddRange(this ICollection collection, IEnumerable items) { foreach (var item in items) collection.Add(item); } Willst Du dafür UnitTests schreiben? Klar, kann man machen, aber das wäre für mich ein Fall von "übers Ziel hinaus geschossen", wo der Aufwand wiederum über den Nutzen liegt. Natürlich besteht dabei die Gefahr, dass solche Extensions auch über's Ziel hinaus schießen und zu viel werden, deshalb sollte man (oder jemand) einen Blick darauf haben. Und ja, das setzt alles voraus, dass alle Beteiligten auf einem Level sind. Meine Denkweise ist eher die, dass ich beim (utopischen) Optimum beginne und das dann den spezifischen Gegebenheiten anpasse oder ggf. umwerfe. Wenn z.B. ein einziges Teammitglied ein Berufseinsteiger ist, alle anderen aber top fit sind, dann bekommt der Eine ein Verbot verpasst, die Extensionmethods anzufassen. Wenn es umgekehrt ist (einer hat was drauf, der Rest nicht), dann werden Extensionmethods verboten. Aber wir können bei so einer theoretischen Diskussion nicht alle Eventualitäten der verschiedenen Teams betrachten. Ich habe deshalb auch ein striktes LINQ-Verbot aufgedrückt bekommen: Die Anderen kennen es nicht und könnten es beim Code kopieren (allein das tut weh) falsch nutzen.
@andiwand1119
@andiwand1119 3 года назад
Mal ganz naiv gefragt: Was würde gegen eine Klasse ObservableRangeCollection sprechen, welche von ObservableCollection erbt und die ursprüngliche Collection um deine geforderten Methoden erweitert?
Далее
Musterkonsistenz mit Namensmustern
27:29
Просмотров 2,4 тыс.
100❤️
00:18
Просмотров 667 тыс.
Would you help?!😳
00:32
Просмотров 6 млн
Lasst Euch nicht alles gefallen
20:51
Просмотров 26 тыс.
Missverständnisse über Software-Architektur
1:06:02
Просмотров 2,1 тыс.
Objektorientierung 1 - Grundidee
36:55
Просмотров 2,3 тыс.
Kubernetes: Eine Einführung
25:25
Просмотров 81 тыс.
Softwareentwicklung im Wasserglas - das DESASTER!
10:47
Как разблокировать айфон?
0:27
Просмотров 145 тыс.