Hart verdiente Android-Programmiererfahrungen

Dieser Beitrag, wie Kent Beck in seinem Buch Implementation Patterns sagt, "... basiert auf einer ziemlich fragilen Prämisse, dass guter Code wichtig ist ...". Aber wir alle wissen, dass sauberer Code wichtig ist, da wir uns so lange mit seinem Mangel auseinandersetzen mussten. Und Kent auch.

Kent Beck

Die Gesamtkosten für den Besitz eines Mess

Wie jeder naive Android-Entwickler, der in einem frühen Startup in Indien arbeitet, habe ich vor einigen Jahren versucht, Probleme der realen Welt zu „hacken“, die Branche zu „stören“ und das Universum zu „verbeulen“. Ohne sich weltweit um gutes Software-Design oder gute Architektur zu kümmern, begann ich, Code zu schreiben, um eine Android-App zu erstellen, die eines Tages zu einer der größten Gesundheits-Apps für Verbraucher in Indien werden würde.

Sprint nach Sprint, Hack nach Hack, Features wurden in rasendem Tempo gebaut. Bauen. Messen. Lernen. Time-to-Market war wichtig und jeder Tag war wichtig. Die Zeit verging wie im Fluge, wir wuchsen alle 6 Monate um 1 Teammitglied und die App hatte die Millionen-Download-Marke erreicht.

Downloads und Bewertungen für den Google Play Store unserer App.

Zu diesem Zeitpunkt war die App nicht mehr trivial und wurde zu einem mandantenfähigen Client, wenn das überhaupt eine Sache ist. Funktionen, die zu Beginn Stunden dauerten, dauerten Tage, manchmal Wochen. Jede Aktivität bestand aus mehr als 1000 Zeilen Spaghetti-Code, da Android sich nicht allzu sehr um die Trennung von Bedenken kümmert. Die Gesamtkosten für den Besitz eines Chaos hatten uns erheblich verlangsamt.

Das Android-Rätsel

Der Code sah hässlich aus, Aktivitäten verwalteten alles:

  • Einfädeln
  • I / O.
  • Berechnung
  • Layouts
  • Konfigurationsänderungen
  • Was nicht

Aktivitäten sind doch Controller, oder? Oder sind sie Ansichten? Ich wusste es nicht mehr.

MVC

Das großartige Redesign im Himmel

Wir mussten die App so gestalten, dass das Ändern einer Codezeile irgendwo nichts anderes kaputt machte. Die App musste, wie Onkel Bob sagt, „robust, aber nicht starr, flexibel, aber nicht zerbrechlich“ sein.

Robert

Zu diesem Zeitpunkt trat mein Mentor und Freund Kashif Razzaqui dem Team bei, um uns zu helfen, das Chaos zu lindern. Das großartige Redesign ist nie passiert, aber wir haben unseren Code verdammt noch mal überarbeitet:

  • Wir haben eine "Service" -Ebene hinzugefügt und den gesamten Nicht-UI-Code einzeln in sie verschoben.
  • Wir haben AsyncTasks geworfen und sind mit Guava zu ListenableFutures gewechselt.
  • Wir haben AsyncHttpClient für OkHttp ausgegeben.
  • Aber was noch wichtiger ist, wir haben viel gelesen: Clean Code, Clean Architecture, SOLID, DRY, The Pragmatic Programmer, Java Concurrency In Practice, Domain Driven Design usw.

Bald erkannten wir die Vorteile unserer Bemühungen. Die Produktivität stieg, wir schrieben schneller, alle waren glücklich.

Dies war, bis wir unsere Apps vereinheitlicht hatten und die Hölle los war. Nur eine zusätzliche Service-Schicht hat es nicht geschafft.

Die Kunst des sauberen Codes

Nachdem ich Onkel Bobs Videos über Clean Architecture mehrmals angesehen und viel über die Android-App-Architektur gelesen hatte, beschloss ich, mit dem MVP-Designmuster und RxJava zu experimentieren.

Einige Tage nach dem Experiment haben wir uns entschlossen, zu RxJava zu wechseln und MVP mithilfe von Clean Architecture zu implementieren. Wir haben sichergestellt, dass wir alle Schichten hinter Schnittstellen eingekapselt und Bedenken gut getrennt haben.

  • Die Ansicht, die normalerweise von einem Fragment implementiert wird, enthält einen Verweis auf den Präsentator. Das einzige, was die Ansicht tun wird, ist, jedes Mal, wenn eine Schnittstellenaktion vorliegt, eine Methode vom Presenter aufzurufen.
  • Der Präsentator ist dafür verantwortlich, als Mittler zwischen Ansicht und Modell zu fungieren. Es ruft Daten aus dem Modell ab und gibt sie formatiert an die Ansicht zurück. Im Gegensatz zur typischen MVC entscheidet sie jedoch auch darüber, was passiert, wenn Sie mit der Ansicht interagieren.
  • Das Modell ist nur das Gateway zur Domänenschicht oder Geschäftslogik.
  • Der Interactor befasst sich mit E / A und ist der Anbieter von Daten, die in der Ansicht angezeigt werden sollen.

Jetzt ist es viel einfacher, eine Ebene mit einer völlig neuen Implementierung auszutauschen. Die Neugestaltung der Benutzeroberfläche, ein wesentlicher Bestandteil der Entwicklung von Android-Apps, ist viel einfacher geworden. Die Dinge können sich endlich schnell bewegen, ohne zu brechen.

Die Pfadfinderregel

Es reicht nicht aus, Code gut zu schreiben, der Code muss im Laufe der Zeit sauber gehalten werden. Tatsache ist, dass Software eine Tendenz zur Entropie hat. Wir haben alle gesehen, wie Code im Laufe der Zeit verrottet und sich verschlechtert hat, also haben wir uns die einfache Pfadfinderregel geliehen: „Verlasse den Campingplatz sauberer, als du ihn gefunden hast.“

Wenn wir alle unseren Code etwas sauberer eingecheckt haben als beim Auschecken, konnte der Code einfach nicht verrotten. Die Bereinigung muss nicht groß sein. Ändern Sie einen Variablennamen zum Besseren, brechen Sie eine etwas zu große Funktion auf, beseitigen Sie ein kleines Stück Duplizierung und bereinigen Sie eine zusammengesetzte if-Anweisung.

Fazit

Unsere Art, eine skalierbare App zu erstellen, ist möglicherweise nicht „korrekt“ und Sie stimmen diesem Beitrag möglicherweise nicht zu. Schließlich sind sich nicht alle Kampfkünstler über die beste Kampfkunst oder die beste Technik innerhalb einer einig;)

Es gibt viele verschiedene Ansätze für MVP und viele interessante Lösungen, um es an Android anzupassen. Die einzige Tatsache, die wir nicht leugnen können, ist, dass Clean Code wichtig ist und man ihn einfach nicht unter einen Teppich kehren kann.

Dieser Beitrag ist stark von Onkel Bobs Clean Code entlehnt und stiehlt den Titel aus Kashifs Droidcon-Vortrag von 2011.

Wenn Clean Code für Sie wichtig ist, lassen Sie uns chatten :) Twitter: @_arunsasi LinkedIn: https://www.linkedin.com/in/arunsasidharan

Wenn Ihnen dieser Beitrag gefallen hat, schlagen Sie bitte das kleine Herz! ❤