2016-07-27 22 views
0

Ich bin derzeit ein Anfänger Entwickler arbeitet an ein paar Nebenprojekten, die versuchen, meinen Weg in die Welt der Android-Java-Entwicklung.Design-Muster: Null verwenden, um schwere Datenbankabfragen zu minimieren

Meine Frage gilt heute jedoch für die meisten OOP-getriebenen Konzepte.

Lassen Sie mich auf den Punkt kommen. Meine Android-Anwendung hat einige Aktivitäten und Methoden, die am Ende sehr schwere Datenbankabfragen haben, das macht es ziemlich langsam vor allem, weil ich ein ORM (Sugarorm) verwende, um Dinge schneller zu machen (Entwicklungs weise) und weniger Buggy.

Ich habe bereits eine Lösung gefunden und es scheint recht gut zu funktionieren, aber ich dachte, es wäre das Beste, danach zu fragen, bevor es in die Anwendung integriert wird. Nur um zu wissen, ob das im Allgemeinen eine schlechte Übung ist oder nicht.

Leider war Google nicht sehr hilfreich, vor allem weil die Schlüsselwörter, die für die Suche nach einer ähnlichen Frage benötigt wurden, mich immer zum Null-Objektmuster führen würde: |

Beispiel für meine Implementierung:

private List<Book> mBooks; 

public List<Book> getBooks() { 
    if (this.mBooks == null) 
     this.mBooks = SugarRecord.listAll(Book.class); 
    return this.mBooks; 
} 

public List<Book> onBookListUpdated() { 
    this.mBooks = null; 
} 

Wie Sie dies gewährleistet sehen, dass die Abfrage nur einmal ausgeführt wird (zumindest bis die Liste erwartet wird, sich geändert haben).

Was ich wissen müsste ist, wenn das Sinn macht, wie viele Programmierer würden tatsächlich so etwas tun und wenn es eine Sache ist, wie heißt es?

Außerdem, wenn es "ok" zu tun ist, wäre es eine gute Idee, diese Logik in eine Klasse zu verpacken?

etwas sagen wie:

public class FastList<T> { 

    public interface iFastList<TT> { 
     List<TT> reloadList(); 
    } 

    public FastList(iFastList<T> inCallback) { 
     this.callback = inCallback; 
    } 

    private iFastList<T> callback 

    private List<T> currentList; 

    public List<T> getList() { 
     if (this.currentList == null) 
      this.currentList = this.callback.reloadList(); 
     return this.currentList; 
    } 

    public void onListChanged() { 
     this.currentList = null; 
    } 
} 

Vielen Dank im Voraus für alle, die Zeit in Anspruch nehmen zu beantworten.

+0

Sein gemeinsam. Es gibt ein paar Nachteile. Zuerst müssen Sie sicherstellen, dass Sie update aufrufen, wenn Sie etwas in der Liste ändern. Es ist leicht zu vergessen. Zweitens können Sie Probleme mit Threads haben, wenn Sie solche Globals verwenden. Aber die Vorteile sind oft die Kosten wert. –

+0

Vielen Dank für Ihre Antwort, jetzt, da ich weiß, wie es heißt, kann ich es selbst nachlesen. Danke – WiserTheBassist

Antwort

1

Lazy Intitailization seine sehr beliebt in Objective-C

- (NSMutableArray *) myArray { 
    if(!_myArray) { 
     _myArray = [[NSMutableArray alloc] init]; 
    } 
    return _myArray; 
} 
+0

Es ist sehr beliebt in jeder Sprache. Ganze Sprachen sind um faule Berechnungen herum aufgebaut, siehe Haskell und andere funktionale Sprachen. –