2015-03-06 13 views
7

Ich studierte einige Tutorials in Bezug auf die Java-Sprache. Ich fragte mich, ob ich jedes Mal abstrahieren sollte, wenn ich etwas kodiere, und auf jeder Art von Standard und Stack?Abstraktion mit Java in Android

Ich habe mit jedem Frühjahr Dienstleistungen zum Beispiel gesehen, dass, könnten wir auch abstrakt-Controller, über Schnittstellen mit EJBs auf JavaEE-Stack usw.

Ich frage mich, was das Ziel ist das denn? Soll ich dasselbe während der Entwicklung mit dem Android SDK tun?

Soll ich jede Klasse, die ich code, abstrahieren?

+0

Wenn Sie etwas neues bauen, dann sollte die root Schnittstelle sein oder weniger Sie können abstrakte Klasse verwenden. – Prashant

Antwort

5

Es ist immer eine gute Idee, modulare, wiederverwendbare Komponenten zu machen. Wenn eine App von Grund auf mit diesem Gedanken aufgebaut wird, wird es mehr und mehr skalierbar, mehr und mehr selbst erweiterbar. Die gleichen Komponenten in einer App werden wiederverwendet, wenn neuere Funktionen hinzugefügt werden, was Zeit und Aufwand spart. Und es wird einfacher, später Änderungen vorzunehmen oder Fehlerquellen zu identifizieren. Refactoring sollte niemals danach sein, sondern von Anfang an.

Nichtsdestoweniger ist es keine gute Idee, mehr und mehr Abstraktionen in mobilen Apps nur aus Gründen der "Abstraktion" zu haben. Der Grund ist natürlich, dass Smartphones nicht so leistungsfähig sind wie Server oder Desktop-Computer. Es gibt eine Leistungseinbuße, die buchstäblich jeder Klasse und jeder virtuellen Methode in einer Android-App zugeordnet ist. Es muss ein größeres Gleichgewicht zwischen "Abstraktion" und Effizienz erreicht werden, und die Leistungseinbußen werden auf den mittleren und unteren Endgeräten besser sichtbar.

von den offiziellen Dokumenten:

1.Be careful with code abstractions

2.Avoid dependency injection frameworks

3.Avoid Creating Unnecessary Objects

4.Prefer Static Over Virtual

5.Avoid Internal Getters/Setters

EDIT:

Nachdem ich kürzlich Dagger ausprobiert habe, muss ich zugeben, dass Punkt 2 inzwischen etwas veraltet ist. Was soll ich sagen ... Ich kam ziemlich spät zur Dagger Party.

2

Sie benötigen Abstraktion, wenn Sie eine Klasse haben, die Sie nicht alle ihre Methoden implementieren möchten. Jene Klassen, die es erben, werden gezwungen sein, all diese Methoden zu implementieren, sonst müssten Sie die Unterklassen ebenfalls als abstrakt deklarieren.

Darüber hinaus sollten Sie bewusst sein, Schnittstelle, Methoden der Schnittstelle muss nicht Körper und die gute Sache ist, dass Ihre Klasse so viel wie Schnittstelle implementieren kann, wie Sie möchten. Dagegen können Sie nur eine abstrakte Klasse erben. Schnittstellen sind wie Verträge. Welche Klasse sie auch implementieren, muss Körper für alle ihre Methoden zur Verfügung stellen.

Ob Sie abstrakt oder Schnittstelle oder beides benötigen, hängt wirklich von Ihrem Entwurf ab und was Sie implementieren möchten. Obwohl es eine gute Übung ist, die Klassen, die gemeinsame Methoden haben, zu zwingen, dieselbe Schnittstelle zu implementieren (wenn Sie nichts über den Körper jeder Methode wissen) oder abstrakt (wenn Sie wissen, was der Körper von einigen, allen oder keinen von ihnen ist) die Methoden)

Ein anderes Beispiel wäre, wenn Sie Abstraktion oder Schnittstelle haben, wenn Sie etwas zu ihnen addieren, müssen alle Unterklassen oder Klassen, die sie implementieren, diesen Änderungen folgen, es bedeutet, dass die Dose einfacher zu erhalten wäre.

Sehen Sie sich auch this, this und this und open/close principle an.

1

Dies kann auf viele verschiedene Arten interpretiert werden. Aus meiner Sicht wird Abstraktion in der Codierung als Entwurfsprinzip verwendet, wenn Sie eine Erweiterung oder viele Arten von Implementierungen benötigen. ZB im Frühjahr, ein Controller kann als eine abstrakte Klasse (A) definiert haben und mehrere andere Arten von Controllern (B, C, D ..) erweitern A. Als ein Benutzer von Spring-Framework, wenn Sie nicht zufrieden sind mit Bei den verfügbaren Controller-Implementierungen können Sie trotzdem Ihren eigenen Controller entwickeln, der A erweitert. Auch Spring-Entwickler können in zukünftigen Versionen problemlos neue Controller hinzufügen/erweitern.