Wie teilt man die große App am besten in Module auf?

8

Der Aufbau der App, an der ich arbeite, braucht viel Zeit. Es ist der größte, an dem ich gearbeitet habe. Ich habe versucht, die Gradle-Einstellungen zu optimieren, was hilfreich ist, aber trotzdem ist der Build ziemlich langsam.

Da die App ohne Module erstellt wurde, sind es nur eine ganze Menge Pakete und jetzt frage ich mich, wie ich einige von ihnen "extrahieren" und in separate Module stecken könnte. AFAIK die Module sollten keine Abhängigkeiten zum App-Modul haben, also habe ich mich gefragt, ob es ein Werkzeug oder eine Technik gibt, die es mir erlaubt, Code zu analysieren und mir dabei hilft, die richtigen Pakete zu finden, da es viel Code ist.

>

Wie würden Sie mein Problem angehen?

    
stoefln 09.01.2018, 12:46
quelle

3 Antworten

4

Ihre Frage ist Modularisierung des Quellcodes im Software Engineering. Es ist ein neues Thema in der Software und es gibt nur wenige Referenzen darüber. Quellcode-Modularisierung ist das Neuformieren von Clustering Konzepten für Quellcodes.

in dieser Referenz von ( siehe Referenz 1 )

  

Das Ziel des Software-Modularisierungsprozesses ist die Partitionierung von   Softwaresystem in Subsysteme, um eine abstrakte Sicht auf die    Architektur des Softwaresystems, wobei ein Subsystem aus einer Reihe von Softwareartefakten besteht, die miteinander kooperieren   ein High-Level-Attribut implementieren oder einen High-Level-Service bereitstellen   der Rest des Softwaresystems.

     

Für große und komplexe Softwaresysteme ist jedoch die Software   Modularisierung kann nicht manuell aufgrund der großen gemacht werden   Anzahl der Interaktionen zwischen verschiedenen Artefakten und die große Größe   des Quellcodes. Daher ist ein vollautomatisches oder halbautomatisches Werkzeug   benötigt, um Software Modularisierung durchzuführen.

Es gibt viele Techniken (Algorithmen) zur Modularisierung des Quellcodes ( siehe Referenz 1 >):

  1. Hierarchische Techniken:

    • Einzelne Verknüpfung, vollständige Verknüpfung, durchschnittliche Verknüpfung
    • Ward-Methode, Median-Methode, zentroide Methode
    • Kombinierte und gewichtete kombinierte Methoden
  2. Suchbasierte Techniken:

    • Hill Climbing, mehrere Hill Climbing (HC)
    • Simulated Annealing (SA)
    • Genetischer Algorithmus (GA)

Beachten Sie, dass Sie auch andere Clustering -Techniken mit diesen Namen finden können. Modularisierung ist ein bisschen anders. Sie werden zur Quellcode-Modularisierung umgestaltet.

Der gesamte Quellcode-Modularisierungsprozess wird wie folgt angezeigt:


Es gibt viele Tools , die Sie verwenden können. Sie können sie im Modularisierungsprozess verwenden:

  1. Tools zur Analyse statischer Quellcodes (um das ADG-Format usw. zu erhalten) siehe hier - (wie verstehen, Ndepend und etc.)
  2. Visualisierungs-Tools - (Graph-Visualisierung) siehe Liste hier (wie Tom Sawyer Visualisierung )

Beispiel für ein kleines Projekt, wenn Ihre Projektstruktur (die aus dem Quellcode mithilfe der statischen Analysetools generiert wurde) wie folgt aussieht:

Das Ergebnis kann folgendermaßen aussehen (nach Anwendung des Modularisierungsprozesses):

    
Gholamali-Irani 25.01.2018, 13:11
quelle
7

Dies ist hauptsächlich ein Designproblem. Da Sie angegeben haben, dass bereits eine große Menge Code im Projekt vorhanden ist, wäre ein Ansatz, das UML-Diagramm für die gesamte Projektstruktur zu analysieren. Das Ziel besteht darin, Regionen der Architektur zu identifizieren, in denen die Interaktionen eng zwischen einigen Klassen gekoppelt sind, Gruppen können auch basierend darauf gebildet werden, welche Klassen dieselben externen Abhängigkeiten aufweisen.

Mit diesem Ansatz reduzieren Sie die Komplexität des großen Projekts und entkoppeln Klassen von externen Abhängigkeiten, die sie im großen Projekt nicht verwenden. Die einzelnen Module, in die Sie das Projekt aufgeteilt haben, haben kürzere Build-Zeiten. Die Module, in die Sie das Projekt aufgeteilt haben, können dann im Hauptprojekt als Abhängigkeiten referenziert werden. Der zusätzliche Vorteil besteht darin, dass nur die geänderten Module im Hauptprojekt jedes Mal neu erstellt werden, wenn Sie Änderungen vornehmen.

Dieser Stack-Überlauf-Beitrag diskutiert viele UML-Diagrammgenerator-Plugins für Android Studio. Code Iris ist eine gute Option, die Sie über das Android Studio-Plugin-Menü installieren können. Hier sehen Sie als Beispiel die Ausgabe von Code Iris in einer Beispielanwendung FaceTracker für Android (Klicken Sie auf das Diagramm, um es zu vergrößern):

Das Diagramm zeigt die Gruppierung von Paketen und Projekten. Sie können sehen, dass verschiedene Projekte in separate grüne Felder aufgeteilt werden. Innerhalb dieser Felder befinden sich Kästchen für die Pakete und schließlich Klassen und Interaktionen. Durch die Analyse der UML können Sie zuerst herausfinden, wie Sie Ihre Klassen am besten gruppieren und individuelle Projekte erstellen können. Sobald Sie das Hauptprojekt in Module aufgeteilt haben, können Sie die Code-Iris erneut verwenden, um die Interaktionen nach Änderungen an der Struktur zu visualisieren.

    
sparkplug 24.01.2018 08:34
quelle
1

Ich würde meine Anwendung in vier Schichten aufteilen:

  1. Ebene für Objekte: In dieser Ebene initiieren Sie alle Objekte, die Sie benötigen, mit den Methoden get und set {Beispiel:

class person{ region private private int _PersonID; endregion region public public int PersonID{get{return _PersonID;}set{_PersonID=value;}} endregion }}

  1. Ebene für den Datenzugriff: Diese Ebene übernimmt den Beitrag zum Verbinden Ihrer Datenbank und alles, was mit Prozeduren, Triggern und Funktionen zu tun hat. {Dieser Abschnitt muss wirklich geschützt sein.} {Implementieren Sie keine SQL-Abfragen in Ihrem Code, erstellen Sie alle Ihre Abfragen in Ihrer Datenbank und verbinden Sie diese Prozedur, indem Sie ihre Namen in Ihren Codes aufrufen} {Beispiel: //

    class personDAO { private List _GetPersons(){//codes here} ; public List GetPersons(){ _GetPersons();} public delegate void del_GetPersons(); private del_GetPersons _del_GetPersons; public del_GetPersons Del_GetPersons { get{return _del_GetPersons;} set {_del_GetPersons=value;} } public personDAO() {//constructor del_GetPersons=GetPersons; } } }

  2. Schicht für Business-Objekt, diese Schicht delegiert Instanzen der Datenzugriffsbibliothek und ändert sie dann und fügt sie mit mehreren Ausnahmebehandlungsroutinen hinzu. "Wir verwenden Delegaten, um unsere Methodennamen, die verwendet werden, zu verbergen, indem wir die Methode an ihren Delegaten in der Konstruktorfunktion der DataAccessLibrary angleichen". Beispiel class personBO { //create instance of personDAO //create an other delegate for personBO //create private method _GetPerson(){//call personDAO.del_GetPersons()} //create public method GetPerson() {// call _GetPerson()} create public constructor function personBO{//set public method = delegates of bo} }

4.Es gibt schließlich die letzte Ebene oder Ebene, auf der der Benutzer das Recht hat, mit ihm zu interagieren. Es handelt sich dabei um mehrere verbundene Formulare, die über Front-End-Handler und versteckte Back-End-Handler abgewickelt werden mit Delegierten auch genannt).

  • Diese Struktur kann beim Erstellen Ihrer Anwendung länger dauern als andere

  • aber es ist schnell (da Delegierte es schneller machen)

  • Es ist geschützt (da es in viele Ebenen eingeordnet ist und Sie mit den versteckten Methoden arbeiten, die eine Instanz eines Objekts und nicht das Objekt selbst aufrufen).

mark dibe 26.01.2018 10:54
quelle

Tags und Links