{"id":2872,"date":"2021-01-08T19:02:22","date_gmt":"2021-01-08T16:02:22","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2872"},"modified":"2024-12-16T22:32:25","modified_gmt":"2024-12-16T19:32:25","slug":"%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2021\/01\/08\/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82\/","title":{"rendered":"Wie ich den Kerl an der Stange vermisst habe oder eine Geschichte \u00fcber erstaunlichen Einfallsreichtum"},"content":{"rendered":"<p>In dieser Notiz werde ich \u00fcber die Bedeutung von Architekturentscheidungen bei der Entwicklung, der Unterst\u00fctzung einer Anwendung und in einer Teamentwicklungsumgebung schreiben.<\/p>\n<p><a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Rube_Goldberg%27s_%22Self-Operating_Napkin%22_(cropped).gif\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Rube_Goldberg%27s_%22Self-Operating_Napkin%22_%28cropped%29.gif\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Rube_Goldberg%27s_%22Self-Operating_Napkin%22_(cropped).gif\" target=\"_blank\" rel=\"noopener\">Selbst- Betriebsserviette Professor Lucifer Gorgonzola. Rube Goldberg<\/a><\/p>\n<p>In meiner Jugend habe ich an einer Taxi-Bestellanwendung gearbeitet. Im Programm k\u00f6nnen Sie einen Abholpunkt und einen Abgabepunkt ausw\u00e4hlen, die Fahrtkosten und die Tarifart berechnen und tats\u00e4chlich ein Taxi bestellen. Ich habe die Anwendung in der letzten Phase des Vorabstarts erhalten; nach dem Hinzuf\u00fcgen mehrerer Korrekturen wurde die Anwendung im AppStore ver\u00f6ffentlicht. Bereits zu diesem Zeitpunkt war dem gesamten Team klar, dass die Implementierung sehr schlecht war, keine Entwurfsmuster verwendet wurden, alle Komponenten des Systems eng miteinander verbunden waren und es im Allgemeinen m\u00f6glich war, es in eine gro\u00dfe kontinuierliche Klasse (Gottobjekt) zu schreiben. Es h\u00e4tte sich nichts ge\u00e4ndert, so wie die Klassen ihre Verantwortungsgrenzen durcheinander brachten und sich in ihrer Gesamtmasse in einer toten Kopplung \u00fcberlappten. Sp\u00e4ter beschloss das Management, die Anwendung unter Verwendung der richtigen Architektur von Grund auf neu zu schreiben, was auch geschah und das Endprodukt f\u00fcr mehrere Dutzend B2B-Kunden implementiert wurde.<\/p>\n<p>Ich werde jedoch einen merkw\u00fcrdigen Vorfall aus der Architektur der Vergangenheit beschreiben, von dem ich manchmal mitten in der Nacht schwei\u00dfgebadet aufwache oder mich mitten am Tag pl\u00f6tzlich daran erinnere und hysterisch zu lachen beginne. Die Sache ist die, dass ich den Kerl an der Stange beim ersten Mal nicht treffen konnte, was den Gro\u00dfteil der Bewerbung zum Scheitern brachte, aber das Wichtigste zuerst.<\/p>\n<p>Es war ein gew\u00f6hnlicher Arbeitstag, einer der Kunden erhielt die Aufgabe, das Anwendungsdesign leicht zu verfeinern &#8211; Es ist einfach, das Symbol in der Mitte des Auswahlbildschirms f\u00fcr die Abholadresse um ein paar Pixel nach oben zu verschieben. Nun, nachdem ich die Aufgabe professionell auf 10 Minuten gesch\u00e4tzt hatte, hob ich das Symbol um 20 Pixel an, v\u00f6llig ahnungslos, und beschloss, den Taxiauftrag zu \u00fcberpr\u00fcfen.<\/p>\n<p>Was? Die App zeigt den Bestellbutton nicht mehr an? Wie ist das passiert?<\/p>\n<p>Ich traute meinen Augen nicht; nachdem ich das Symbol um 20 Pixel erh\u00f6ht hatte, zeigte die Anwendung die Schaltfl\u00e4che \u201eBestellung fortsetzen\u201c nicht mehr an. Nachdem ich die \u00c4nderung r\u00fcckg\u00e4ngig gemacht hatte, sah ich die Schaltfl\u00e4che wieder. Hier stimmte etwas nicht. Nachdem ich 20 Minuten im Debugger verbracht hatte, hatte ich es ein wenig satt, die vielen Aufrufe \u00fcberlappender Klassen abzuwickeln, aber ich entdeckte, dass *das Verschieben des Bildes die Logik der Anwendung wirklich ver\u00e4ndert*<\/p>\n<p>Es drehte sich alles um das Symbol in der Mitte &#8211; Ein Mann auf einer Stange, der beim Bewegen der Karte nach oben sprang, um die Bewegung der Kamera zu animieren. Auf diese Animation folgte das Verschwinden des Knopfes unten. Anscheinend ging das Programm davon aus, dass der um 20 Pixel verschobene Mann einen Sprung machte, und versteckte daher gem\u00e4\u00df seiner internen Logik die Best\u00e4tigungsschaltfl\u00e4che.<\/p>\n<p>Wie kann das passieren? H\u00e4ngt der *Zustand* des Bildschirms wirklich nicht vom Muster der Zustandsmaschine ab, sondern von der *Darstellung* der Position des Mannes auf der Stange?<\/p>\n<p>Es stellte sich heraus, dass jedes Mal, wenn die Karte gezeichnet wurde, die Anwendung *<a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622469-hittest?sprache=objc\" target=\" _blank\" rel= \"noopener\">visuell<\/a>* in die Mitte des Bildschirms gestochen und \u00fcberpr\u00fcft, was dort war. Wenn sich ein Mann auf einer Stange befindet, bedeutet dies, dass die Kartenverschiebungsanimation beendet ist und angezeigt werden muss Taste. Wenn der Mann nicht da ist, wird die Karte verschoben und die Schaltfl\u00e4che muss ausgeblendet werden.<\/p>\n<p>Im obigen Beispiel ist alles in Ordnung, erstens ist es ein Beispiel f\u00fcr Goldberg-Maschinen (abstruse Maschinen), zweitens ein Beispiel f\u00fcr die Zur\u00fcckhaltung des Entwicklers, irgendwie mit anderen Entwicklern im Team zu interagieren (versuchen Sie, es ohne herauszufinden). Drittens k\u00f6nnen Sie alle Probleme nach SOLID, Mustern (Code-Smells), MVC-Verletzungen und vielem mehr auflisten.<\/p>\n<p>Versuchen Sie, dies nicht zu tun, entwickeln Sie sich in alle m\u00f6glichen Richtungen und helfen Sie Ihren Kollegen bei ihrer Arbeit. Frohes neues Jahr euch allen.<\/p>\n<h3>Links<\/h3>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Goldberg_Machine\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/Goldberg_Machine<\/a> <\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/SOLID<\/a> <\/p>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/refactoring\/smells\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/refactoring\/smells<\/a> <\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Model-View-Controller\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/Model -View-Controller<\/a><\/p>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/state\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/design-patterns\/state <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Notiz werde ich \u00fcber die Bedeutung von Architekturentscheidungen bei der Entwicklung, der Unterst\u00fctzung einer Anwendung und in einer Teamentwicklungsumgebung schreiben. Selbst- Betriebsserviette Professor Lucifer Gorgonzola. Rube Goldberg In meiner Jugend habe ich an einer Taxi-Bestellanwendung gearbeitet. Im Programm k\u00f6nnen Sie einen Abholpunkt und einen Abgabepunkt ausw\u00e4hlen, die Fahrtkosten und die Tarifart berechnen und<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2021\/01\/08\/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Wie ich den Kerl an der Stange vermisst habe oder eine Geschichte \u00fcber erstaunlichen Einfallsreichtum&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[171,95,170],"class_list":["post-2872","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-bugs","tag-patterns","tag-software-architecture","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"de","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2872"}],"version-history":[{"count":23,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2872\/revisions"}],"predecessor-version":[{"id":3902,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2872\/revisions\/3902"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}