{"id":34828,"date":"2019-10-31T22:00:38","date_gmt":"2019-10-31T19:00:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\/"},"modified":"2019-10-31T22:00:38","modified_gmt":"2019-10-31T19:00:38","slug":"single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Single Responsibility Principle. Nicht so einfach, wie es scheint.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Single Responsibility Principle. Nicht so einfach, wie es scheint.\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> Das Single Responsibility Principle, auch als Prinzip der einzigen Verantwortung bekannt,<br \/>\nauch das Prinzip der einzigen Ver\u00e4nderlichkeit - ein sehr glitschiges Konzept und ein nervenaufreibendes Thema in Vorstellungsgespr\u00e4chen f\u00fcr Programmierer. <\/p>\n<p><\/p>\n<p>Mein erstes ernsthaftes Kennenlernen mit diesem Prinzip fand zu Beginn meines ersten Studienjahres statt, als wir, jung und unerfahren, in den Wald gebracht wurden, um aus frischlingshaften Studenten echte Studenten zu machen.<\/p>\n<p><\/p>\n<p>Im Wald wurden wir in Gruppen von 8-9 Personen eingeteilt und in einen Wettkampf verwickelt - welche Gruppe es schneller schafft, eine Flasche Wodka zu leeren, wobei die erste Person aus der Gruppe den Wodka in ein Glas einschenkt, die zweite ihn trinkt und die dritte einen Snack dazu hat. Die Person, die ihre Aufgabe erfolgreich abgeschlossen hat, stellt sich am Ende der Gruppenreihe an. <\/p>\n<p><\/p>\n<p>Ein Beispiel, wenn die Gr\u00f6\u00dfe der Warteschlange durch drei teilbar war, stellte eine gute Umsetzung des SRP dar.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Definition 1. Einzige Verantwortung.<\/h2>\n<p><\/p>\n<p>Die offizielle Definition des Prinzips der einzigen Verantwortung (SRP) besagt, dass jedes Objekt seine eigene Verantwortung und einen Grund f\u00fcr seine Existenz hat, und diese Verantwortung ist ausschlie\u00dflich.<\/p>\n<p><\/p>\n<p>Betrachten wir das Objekt 'Trinkspruch' (<strong>Tippler<\/strong>).<br \/>\nUm das SRP zu erf\u00fcllen, teilen wir die Aufgaben auf drei Personen auf: <\/p>\n<p><\/p>\n<ul>\n<li>Eine schenkt ein (<strong>PourOperation<\/strong>)<\/li>\n<li>Eine Person trinkt (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>Eine Person bei\u00dft (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Jeder Teilnehmer des Prozesses ist f\u00fcr eine Komponente verantwortlich, das hei\u00dft, er hat eine atomare Verantwortung \u2013 zu trinken, zu gie\u00dfen oder zu bei\u00dfen. <\/p>\n<p><\/p>\n<p>Der Trinkende hingegen ist ein Fassadenelement f\u00fcr diese Operationen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ gie\u00dfen\n        _drinkUpOperation.Do() \/\/ trinken\n        _takeBiteOperation.Do() \/\/ bei\u00dfen\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Single Responsibility Principle. Nicht so einfach, wie es scheint.\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">Warum?<\/h4>\n<p><\/p>\n<p>Der Mensch-Programmierer schreibt Code f\u00fcr den Menschen-Affen, und der Mensch-Affe ist unaufmerksam, dumm und immer in Eile. Er kann etwa 3 bis 7 Begriffe gleichzeitig behalten und verstehen.<br \/>\nIm Fall des Trinkenden sind es drei Begriffe. Wenn wir jedoch Code in einem einzigen Block schreiben, erscheinen H\u00e4nde, Gl\u00e4ser, Schl\u00e4gereien und endlose Streitigkeiten \u00fcber Politik. Und all dies wird im K\u00f6rper einer Methode enthalten sein. Ich bin mir sicher, dass Sie solchen Code in Ihrer Praxis gesehen haben. Es ist nicht gerade eine humanit\u00e4re Pr\u00fcfung f\u00fcr die Psyche.<\/p>\n<p><\/p>\n<p>Andererseits ist der Menschenaffe darauf fokussiert, reale Objekte in seinem Kopf zu modellieren. In seiner Vorstellung kann er sie zusammensto\u00dfen, neue Objekte daraus erschaffen und sie ebenso wieder zerlegen. Stellen Sie sich ein altes Automodell vor. Sie k\u00f6nnen sich vorstellen, die T\u00fcr zu \u00f6ffnen, die T\u00fcrverkleidung abzunehmen und die Fensterhebermechanismen zu sehen, in denen sich Zahnr\u00e4der befinden. Aber Sie k\u00f6nnen nicht alle Komponenten des Autos gleichzeitig in einem 'Listing' sehen. Zumindest der 'Menschenaffe' nicht.<\/p>\n<p><\/p>\n<p>Daher zerlegen Programmierer komplexe Mechanismen in eine Reihe weniger komplexer und funktionsf\u00e4higer Elemente. Allerdings kann man unterschiedlich dekomponieren: Bei vielen alten Fahrzeugen f\u00fchrt der Luftkanal zur T\u00fcr, w\u00e4hrend bei modernen Autos ein elektrischer Fehlfunktion des Schlosses den Motorstart verhindert, was bei Reparaturen problematisch ist.<\/p>\n<p><\/p>\n<p>Nun, <strong>SRP ist ein Prinzip, das erkl\u00e4rt, WIE man dekomponiert, das hei\u00dft, wo man die Trennlinie zieht.<\/strong>. <\/p>\n<p><\/p>\n<p>Er sagt, dass man nach dem Prinzip der 'Verantwortungsaufteilung' dekomponieren muss, das hei\u00dft nach den Aufgaben der jeweiligen Objekte.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Single Responsibility Principle. Nicht so einfach, wie es scheint.\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Lassen Sie uns zur\u00fcck zum Trinken und den Vorteilen kommen, die ein Mensch-Affe beim Dekompilieren erh\u00e4lt: <\/p>\n<p><\/p>\n<ul>\n<li>Der Code ist auf jeder Ebene klarer geworden.<\/li>\n<li>Der Code kann von mehreren Programmierern gleichzeitig geschrieben werden (jeder bearbeitet ein separates Element).<\/li>\n<li>Automatisiertes Testen wird einfacher \u2014 je einfacher das Element, desto leichter ist es zu testen.<\/li>\n<li>Es entsteht eine Kompositionalit\u00e4t im Code \u2014 man kann ersetzen. <strong>DrinkUpOperation<\/strong> durch eine Operation, bei der der Trinkende Fl\u00fcssigkeit unter den Tisch gie\u00dft. Oder man ersetzt die Einschenken-Operation durch eine, bei der man Wein und Wasser oder Wodka und Bier mischt. Je nach gesch\u00e4ftlichen Anforderungen k\u00f6nnen Sie alles tun, ohne den Code der Methode zu ber\u00fchren. <strong>Tippler.Act<\/strong>. <\/li>\n<li>Aus diesen Operationen k\u00f6nnen Sie einen Schlemmer zusammenstellen (unter Verwendung von nur <strong>TakeBitOperation<\/strong>), einen Alkoholiker (unter Verwendung von nur <strong>DrinkUpOperation<\/strong> direkt aus der Flasche) und viele weitere gesch\u00e4ftliche Anforderungen erf\u00fcllen.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Oh, das scheint bereits das OCP-Prinzip zu sein, und ich habe die Verantwortung dieses Beitrags verletzt.) <\/em><\/p>\n<p><\/p>\n<p>Und nat\u00fcrlich die Nachteile: <\/p>\n<p><\/p>\n<ul>\n<li>Es m\u00fcssen mehr Typen erstellt werden. <\/li>\n<li>Der Trinkende wird zum ersten Mal ein paar Stunden sp\u00e4ter trinken, als er k\u00f6nnte.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definition 2. Einheitliche Variabilit\u00e4t.<\/h2>\n<p><\/p>\n<p>Warten Sie, meine Damen und Herren! Die Klasse des Trinkspruchs hat ebenfalls eine eindeutige Verantwortung \u2014 sie trinkt! \u00dcbrigens ist der Begriff 'Verantwortung' extrem vage. Jemand ist verantwortlich f\u00fcr das Schicksal der Menschheit, w\u00e4hrend jemand anderes f\u00fcr das Aufheben der umgekippten Pinguine am Pol verantwortlich ist.<\/p>\n<p><\/p>\n<p>Betrachten wir zwei Implementierungen des Trinkers. Die erste, oben erw\u00e4hnt, umfasst drei Klassen \u2013 einschenken, trinken und snacken.<\/p>\n<p><\/p>\n<p>Die zweite wurde nach der Methodik 'Vorw\u00e4rts und nur vorw\u00e4rts' geschrieben und enth\u00e4lt die gesamte Logik in der Methode. <strong>Act<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/\/\u041d\u0435 \u0442\u0440\u0430\u0442\u044c\u0442\u0435 \u0432\u0440\u0435\u043c\u044f  \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041b\u0443\u0447\u0448\u0435 \u0441\u044a\u0435\u0448\u044c\u0442\u0435 \u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0443\n\u0441lass BrutTippler {\n   \/\/...\n   void Act(){\n        \/\/ \u043d\u0430\u043b\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/ \u0432\u044b\u043f\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/\u0417\u0430\u043a\u0443\u0441\u044b\u0432\u0430\u0435\u043c\n    for(int i = 0; i&lt; 3; i++){\n        var food = _foodStore.TakeOrDefault();\n        if(food==null)\n            throw new FoodIsOverException();\n\n        _hand.TryEat(food);\n    }\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Beide Klassen sehen aus der Perspektive eines Au\u00dfenstehenden absolut identisch aus und haben die gleiche Verantwortung: \"trinken\". <\/p>\n<p><\/p>\n<p>Peinlich!<\/p>\n<p><\/p>\n<p>Dann gehen wir ins Internet und erfahren eine andere Definition des SRP \u2013 Prinzip der Einheitlichen \u00c4nderbarkeit (Single Changeability Principle).<\/p>\n<p><\/p>\n<p>Das SCP besagt, dass \"<strong>ein Modul hat nur einen einzigen Grund zur \u00c4nderung<\/strong>\". Das bedeutet: \"Verantwortung ist ein Grund f\u00fcr Ver\u00e4nderung\". <\/p>\n<p><\/p>\n<p><em>(Es scheint, als w\u00e4ren die Typen, die die urspr\u00fcngliche Definition erfunden haben, von den telepathischen F\u00e4higkeiten einer Menschenaffen \u00fcberzeugt gewesen.)<\/em><\/p>\n<p><\/p>\n<p>Jetzt wird alles klar. Die einzelnen Abl\u00e4ufe f\u00fcr Eingie\u00dfen, Trinken und Essen k\u00f6nnen separat ge\u00e4ndert werden, w\u00e4hrend wir im eigentlichen Trinkprozess nur die Reihenfolge und den Inhalt der Schritte \u00e4ndern k\u00f6nnen, beispielsweise indem wir den Snack vor dem Trinken platzieren oder das Lesen eines Trinkspruches hinzuf\u00fcgen.<\/p>\n<p><\/p>\n<p>Im Ansatz \"Vorw\u00e4rts und nur vorw\u00e4rts\" wird alles, was ge\u00e4ndert werden kann, nur in der Methode ge\u00e4ndert. <strong>Act<\/strong>. Dies kann lesbar und effizient sein, wenn die Logik einfach ist und selten ge\u00e4ndert wird, aber oft endet es in schrecklichen Methoden mit 500 Zeilen, mit mehr if-Bedingungen, als f\u00fcr den Beitritt Russlands zur NATO erforderlich sind. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definition 3. Lokalisierung von \u00c4nderungen.<\/h2>\n<p><\/p>\n<p>Trinker verstehen oft nicht, warum sie in einer fremden Wohnung aufgewacht sind oder wo ihr Handy ist. Es ist an der Zeit, detailliertes Logging hinzuzuf\u00fcgen.<\/p>\n<p><\/p>\n<p>Lassen Sie uns das Logging mit dem Prozess des Eingie\u00dfens beginnen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Vor dem Eingie\u00dfen mit {_hand} und {_bottle}\");\n        \/\/Eingie\u00df-Logik ...\n        _log.Log($\"Nach dem Eingie\u00dfen mit {_hand} und {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>indem wir es in <strong>PourOperation<\/strong>, wir haben in Bezug auf Verantwortung und Kapselung weise gehandelt, aber nun haben wir ein Dilemma mit dem Prinzip der Ver\u00e4nderlichkeit. Neben der eigentlichen Operation, die variabel ist, wird auch das Logging selbst ver\u00e4nderlich. Wir m\u00fcssen es aufteilen und einen speziellen Logger f\u00fcr die Pour-Operation erstellen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">interface IPourLogger{\n    void LogBefore(IHand, IBottle){}\n    void LogAfter(IHand, IBottle){}\n    void OnError(IHand, IBottle, Exception){}\n}\n\nclass PourOperation: IOperation{\n    PourOperation(IPourLogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.LogBefore(_hand, _bottle);\n        try{\n             \/\/... Business-Logik\n             _log.LogAfter(_hand, _bottle);\n        }\n        catch(Exception e){\n            _log.OnError(_hand, _bottle, e);\n        }\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Ein detailgetreuer Leser wird bemerken, dass <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> und <strong>OnError<\/strong> auch einzeln variabel sein k\u00f6nnen, und analog zu den vorherigen Aktionen werden drei Klassen erstellt: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> und <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>Und da wir uns daran erinnern, dass es f\u00fcr den Trinker drei Operationen gibt, erhalten wir neun Logging-Klassen. Insgesamt besteht der gesamte Trinker aus 14 (!!!) Klassen.<\/p>\n<p><\/p>\n<p>Hyperbel? Kaum! Ein Mensch-Affe mit einer Dekompktionsgranate wird den \u201eNalle-Automaten\u201c in einen Krug, ein Glas, Ausgabetreiber, einen Wasserservice, ein physikalisches Modell der Molek\u00fclkollision zerlegen, und im n\u00e4chsten Quartal wird er versuchen, die Abh\u00e4ngigkeiten ohne globale Variablen zu entwirren. Glauben Sie mir, er wird nicht aufh\u00f6ren.<\/p>\n<p><\/p>\n<p>Genau an diesem Punkt kommen viele zu dem Schluss, dass SRP M\u00e4rchen aus rosa K\u00f6nigreichen sind und beginnen, sich selbst zu bel\u00fcgen...<\/p>\n<p><\/p>\n<p>\u2026 ohne je von der Existenz der dritten Definition von SRP zu erfahren: <\/p>\n<p><\/p>\n<p>\"Das Prinzip der Einzelverantwortung besagt, dass <strong>\u00c4nderungen an \u00e4hnlichen Dingen an einem Ort gesammelt werden m\u00fcssen.<\/strong>\". oder \"<strong>Das, was zusammen ge\u00e4ndert wird, sollte an einem Ort aufbewahrt werden.<\/strong>\u201d<\/p>\n<p><\/p>\n<p>Das hei\u00dft, wenn wir die Protokollierung einer Operation \u00e4ndern, sollten wir dies an einem Ort tun.<\/p>\n<p><\/p>\n<p>Das ist ein sehr wichtiger Punkt \u2013 denn alle vorherigen Erkl\u00e4rungen zu SRP besagten, dass man Typen zerlegen muss, solange sie zerlegbar sind, was eine \"oberste Grenze\" f\u00fcr die Gr\u00f6\u00dfe des Objekts auferlegte. Jetzt sprechen wir jedoch auch von einer \"unteren Grenze\". Mit anderen Worten, <strong>SRP verlangt nicht nur, dass man \"zerlegt, solange es zerlegbar ist\", sondern auch, dass man es nicht \u00fcbertreibt \u2013 \"nicht verbundene Dinge nicht zerlegen\".<\/strong>. Dies ist ein gro\u00dfer Kampf zwischen Ockhams Rasiermesser und dem Mensch-Affe!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Single Responsibility Principle. Nicht so einfach, wie es scheint.\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nun sollte es f\u00fcr den Barkeeper einfacher werden. Neben der Tatsache, dass wir den IPourLogger nicht in drei Klassen aufteilen m\u00fcssen, k\u00f6nnen wir auch alle Logger in einen Typ zusammenfassen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class OperationLogger{\n    public OperationLogger(string operationName){\/*..*\/}\n    public void LogBefore(object[] args){\/*...*\/}       \n    public void LogAfter(object[] args){\/*..*\/}\n    public void LogError(object[] args, exception e){\/*..*\/}\n}<\/code><\/pre>\n<p><\/p>\n<p>Wenn uns ein vierter Operationstyp hinzugef\u00fcgt wird, ist die Protokollierung bereits daf\u00fcr vorbereitet. Der Code der Operationen ist sauber und frei von infrastrukturellem Rauschen.<\/p>\n<p><\/p>\n<p>Insgesamt haben wir 5 Klassen zur L\u00f6sung der Getr\u00e4nkewirtschaft:<\/p>\n<p><\/p>\n<ul>\n<li>Einschenken-Operation<\/li>\n<li>Trink-Operation<\/li>\n<li>Snack-Operation<\/li>\n<li>Logger<\/li>\n<li>Fassade des Barkeeper<\/li>\n<\/ul>\n<p><\/p>\n<p>Jede dieser Klassen ist strikt f\u00fcr eine Funktionalit\u00e4t verantwortlich und hat einen einzigen \u00c4nderungsgrund. Alle \u00e4hnlichen Regeln zur \u00c4nderung liegen nah beieinander. <\/p>\n<p>\n<b class=\"spoiler_title\">Beispiel aus dem echten Leben<\/b><\/p>\n<p>Einmal haben wir einen Service zur automatischen Registrierung von B2B-Kunden geschrieben. Und es gab eine GOD-Methode mit 200 Zeilen \u00e4hnlichen Inhalts:<\/p>\n<p><\/p>\n<ul>\n<li>Gehe zu 1C und lege ein Konto an<\/li>\n<li>Mit diesem Konto gehe zum Zahlungsmodul und registriere es dort<\/li>\n<li>Pr\u00fcfe, ob ein Konto mit diesem Konto im Hauptsystem nicht vorhanden ist <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/server\/dts-dronten\/\"   title=\"Server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">Server<\/a><\/li>\n<li>Erstelle ein neues Konto<\/li>\n<li>Ergebnis der Registrierung im Zahlungsmodul und Nummer 1c, f\u00fcge in den Registrierungsresultate-Service hinzu<\/li>\n<li>F\u00fcge diese Informationen zum Konto in die Tabelle ein<\/li>\n<li>Erstelle eine Punktnummer f\u00fcr diesen Kunden im Punktedienst. \u00dcbermittle die 1c Rechnungsnummer an diesen Dienst.<\/li>\n<\/ul>\n<p><\/p>\n<p>Zus\u00e4tzlich gab es in dieser Liste etwa 10 weitere Gesch\u00e4ftsoperationen mit einer schrecklichen Verkn\u00fcpfung. Der Kontenobjekt wurde fast \u00fcberall ben\u00f6tigt. Die Punktkennung und der Name des Kunden waren in der H\u00e4lfte der Aufrufe erforderlich.<\/p>\n<p><\/p>\n<p>Nach einer Stunde Refactoring konnten wir den infrastrukturellen Code und einige Details zur Kontoarbeit in separate Methoden\/Klassen ausgliedern. Die God-Methode wurde vereinfach, aber es blieben 100 Codezeilen, die sich nicht aufl\u00f6sen lassen wollten. <\/p>\n<p><\/p>\n<p>Erst nach einigen Tagen wurde klar, dass die Essenz dieser \u201avereinfachten\u2018 Methode der Gesch\u00e4ftsalgorithmus ist. Und dass die urspr\u00fcngliche Beschreibung des Lastenhefts ziemlich komplex war. Der Versuch, diese Methode in Teile zu zerlegen, w\u00fcrde das SRP verletzen, nicht umgekehrt. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalisierung.<\/h2>\n<p><\/p>\n<p>Es ist Zeit, unseren Trinker in Ruhe zu lassen. Wische deine Tr\u00e4nen weg \u2014 wir werden irgendwann zu ihm zur\u00fcckkehren. Aber jetzt formalisieren wir das Wissen aus diesem Artikel. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalisierung 1. Definition des SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Trennen Sie Elemente so, dass jedes von ihnen f\u00fcr etwas Bestimmtes verantwortlich ist.<\/li>\n<li>Verantwortung wird als \u201aAnlass zur Ver\u00e4nderung\u2018 definiert. Das hei\u00dft, jedes Element hat nur einen einzigen Anlass zur Ver\u00e4nderung, im Sinne der Gesch\u00e4ftslogik.<\/li>\n<li>Potenzielle \u00c4nderungen der Gesch\u00e4ftslogik m\u00fcssen lokalisiert werden. Elemente, die synchron ge\u00e4ndert werden, sollten nebeneinander liegen.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalismus 2. Notwendige Kriterien zur Selbst\u00fcberpr\u00fcfung.<\/h4>\n<p><\/p>\n<p>Mir sind nicht gen\u00fcgend Kriterien f\u00fcr die Umsetzung des SRP begegnet. Aber es gibt notwendige Bedingungen:<\/p>\n<p><\/p>\n<p>1) Stellen Sie sich die Frage \u2013 was macht diese Klasse\/Methode\/Modul\/Dienst? Sie m\u00fcssen darauf mit einer einfachen Definition antworten k\u00f6nnen. (Danke) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/brightori\/\" class=\"user_link\">Brightori<\/a><\/noindex> )<\/p>\n<p>\n<b class=\"spoiler_title\">Erkl\u00e4rungen<\/b><\/p>\n<p>Manchmal ist es jedoch sehr schwierig, eine einfache Definition zu finden. <\/p>\n<p><\/p>\n<p>2) Das Beheben eines Bugs oder das Hinzuf\u00fcgen einer neuen Funktion betrifft die minimal m\u00f6gliche Anzahl an Dateien\/Klassen. Idealerweise \u2013 eine. <\/p>\n<p>\n<b class=\"spoiler_title\">Erkl\u00e4rungen<\/b><\/p>\n<p>Da die Verantwortung (f\u00fcr die Funktion oder den Bug) in einer einzigen Datei\/Klasse gekapselt ist, wissen Sie genau, wo Sie suchen und was Sie \u00e4ndern m\u00fcssen. Zum Beispiel: Das Feature zur \u00c4nderung der Ausgabe der Protokollierung von Vorg\u00e4ngen erfordert nur \u00c4nderungen am Logger. Es ist nicht notwendig, den gesamten restlichen Code zu durchforsten. <\/p>\n<p><\/p>\n<p>Ein weiteres Beispiel ist die Hinzuf\u00fcgung eines neuen UI-Elements, das den vorherigen \u00e4hnelt. Wenn das dazu f\u00fchrt, dass Sie 10 verschiedene Entit\u00e4ten und 15 unterschiedliche Konverter hinzuf\u00fcgen m\u00fcssen, scheint es, als h\u00e4tten Sie \"\u00fcberkompliziert\".<\/p>\n<p><\/p>\n<p>3) Wenn mehrere Entwickler an verschiedenen Funktionen Ihres Projekts arbeiten, ist die Wahrscheinlichkeit f\u00fcr Merge-Konflikte, also dass dieselbe Datei\/Klasse von mehreren Entwicklern gleichzeitig ver\u00e4ndert wird, minimal.<\/p>\n<p>\n<b class=\"spoiler_title\">Erkl\u00e4rungen<\/b><\/p>\n<p>Wenn bei der Hinzuf\u00fcgung einer neuen Aktion \u201aWodka unter den Tisch gie\u00dfen\u2018 der Logger, die Trinkoperation und das Ausgie\u00dfen betroffen sind, scheint es, als w\u00e4ren die Verantwortlichkeiten ungleich verteilt. Sicherlich ist es nicht immer m\u00f6glich, aber man sollte versuchen, diesen Wert zu senken. <\/p>\n<p><\/p>\n<p>4) Bei einer kl\u00e4renden Frage zur Gesch\u00e4ftslogik (vom Entwickler oder Manager) beziehen Sie sich streng auf eine Datei\/Klasse und erhalten Informationen nur von dort.<\/p>\n<p>\n<b class=\"spoiler_title\">Erkl\u00e4rungen<\/b><\/p>\n<p>Funktionen, Regeln oder Algorithmen sind kompakt verfasst, jeweils an einem Ort, anstatt durch Flaggen im gesamten Code verstreut zu sein.<\/p>\n<p><\/p>\n<p>5) Die Benennung ist verst\u00e4ndlich.<\/p>\n<p>\n<b class=\"spoiler_title\">Erkl\u00e4rungen<\/b><\/p>\n<p>Unsere Klasse oder Methode ist f\u00fcr eine bestimmte Aufgabe verantwortlich, und diese Verantwortung spiegelt sich im Namen wider.<\/p>\n<p><\/p>\n<p>AllManagersManagerService ist h\u00f6chstwahrscheinlich ein God-Klasse.<br \/>\nLocalPayment \u2014 wahrscheinlich nicht verf\u00fcgbar <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalismus 3. Die Entwicklungsmethodik \u201aOccam-first\u2018.<\/h4>\n<p><\/p>\n<p>Zu Beginn des Designs wei\u00df der Mensch-Affe nicht um die Feinheiten der zu l\u00f6senden Aufgabe und kann Fehler machen. Fehler k\u00f6nnen auf verschiedene Weise passieren:<\/p>\n<p><\/p>\n<ul>\n<li>Zu gro\u00dfe Objekte erstellen, indem verschiedene Verantwortlichkeiten zusammengef\u00fcgt werden<\/li>\n<li>Zerlegen, indem eine einzige Verantwortung in viele verschiedene Typen aufgeteilt wird<\/li>\n<li>Verantwortungsgrenzen falsch definieren<\/li>\n<\/ul>\n<p><\/p>\n<p>Es ist wichtig, sich an die Regel zu erinnern: \u201eEs ist besser, nach oben zu irren\u201c oder \u201eWenn Sie sich nicht sicher sind, br\u00f6ckeln Sie nicht.\u201c Wenn beispielsweise Ihre Klasse zwei Verantwortlichkeiten vereint, bleibt sie verst\u00e4ndlich und kann mit minimalen \u00c4nderungen am Client-Code in zwei Teile aufgeteilt werden. Ein Glas aus Glasscherben zu bauen, ist in der Regel schwieriger aufgrund des \u00fcber mehrere Dateien verteilten Kontexts und fehlender notwendiger Abh\u00e4ngigkeiten im Client-Code. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">Es ist Zeit, zum Ende zu kommen<\/h2>\n<p><\/p>\n<p>Der Anwendungsbereich des SRP beschr\u00e4nkt sich nicht nur auf OOP und SOLID. Es ist anwendbar auf Methoden, Funktionen, Klassen, Module, Mikrodienste und Services. Es findet gleicherma\u00dfen Anwendung in \"figaks-figaks-and-in-prod\"- und \"rocket-science\"-Entwicklungen und verbessert \u00fcberall die Welt ein wenig. Wenn man dar\u00fcber nachdenkt, k\u00f6nnte man sagen, es ist fast ein grundlegendes Prinzip der gesamten Ingenieurkunst. Maschinenbau, Steuerungssysteme und \u00fcberhaupt alle komplexen Systeme werden aus Komponenten erstellt. Das \"Nicht-Zerkleinern\" beraubt die Konstrukteure ihrer Flexibilit\u00e4t, das \"\u00dcber-Zerkleinern\" der Effizienz und falsche Grenzen gef\u00e4hrden Verstand und innere Ruhe. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Single Responsibility Principle. Nicht so einfach, wie es scheint.\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP ist nicht von der Natur erfunden worden und geh\u00f6rt nicht zur exakten Wissenschaft. Es entsteht aus unseren biologischen und psychologischen Einschr\u00e4nkungen. Es ist lediglich eine Methode, um komplexe Systeme unter Kontrolle zu bringen und zu entwickeln, durch den Verstand des Menschen. Es zeigt uns, wie man ein System dekonstruiert. Die urspr\u00fcngliche Formulierung erforderte betr\u00e4chtliches telepathisches Geschick, aber ich hoffe, dieser Artikel hat etwas von dem Rauchvorhang gel\u00fcftet.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/454290\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26229,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34828","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Single Responsibility Principle. Nicht so einfach, wie es scheint | ProHoster","description":"Das Prinzip der einzelnen Verantwortung, auch bekannt als das Prinzip der Einheitlichkeit, ist ein komplizierter Begriff, der sowohl f\u00fcr Verwirrung sorgt als auch oft ein nervenaufreibendes Thema in Vorstellungsgespr\u00e4chen f\u00fcr Programmierer ist. Mein erstes ernsthaftes Kennenlernen dieses Prinzips fand zu Beginn des ersten Semesters statt, als wir jungen und unerfahrenen Studierenden in den Wald gebracht wurden, um aus uns echte Studenten zu formen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster","og:description":"Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445.","og:url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:38+00:00","article:modified_time":"2019-10-31T19:00:38+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34828","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 21:46:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:06","updated":"2026-02-09 21:46:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}