[JAVA] Probieren Sie Designmuster in C-Sprache aus! Erinnerungsmuster - merken wir uns die Speicher der Daten

** Einführung **

"Versuchen Sie es in C-Sprache! Entwurfsmuster" Diesmal ist das Mement-Muster. Mit einem Wort, es ist ein DB-Rollback. Wenn Sie sorgfältig darüber nachdenken, denke ich, dass es ein nützliches Muster ist.

Liste der Entwurfsmuster Beschreibung des erstellten Bibliothekspakets Der öffentliche Code lautet hier.

** Erinnerungsmuster **

Die Erklärung von wikipedia lautet wie folgt.

Das Erinnerungsmuster (Englisch: Erinnerungsmuster, Japan: Erinnerungsmuster) ist eines der Software-Entwurfsmuster, mit dem ein Objekt in seinen vorherigen Zustand zurückversetzt werden kann (per Rollback).

Es ist einfach. Selbst wenn Sie sich die Erklärung von Techscore und das folgende Klassendiagramm ansehen, verfügt Originator über einen Mechanismus, mit dem Sie mithilfe der Mememt-Klasse, die den Status enthält, zum ursprünglichen Status zurückkehren können.

画像

Im Rückblick auf die Vergangenheit fragte ich mich, wofür es verwendet wurde. Es gab einige Anwendungsfälle, die nützlich erschienen.

** Verwendung **

** Rollback von Daten **

Wenn Sie DB verwenden, können Sie die Rollback-Funktion verwenden. Wenn Sie jedoch ein System mit einem einfachen Datenspeichermechanismus haben, müssen Sie DB nicht verwenden. Wenn Sie es also im Fehlerfall wiederherstellen möchten, tritt ein Fehler auf. Manchmal sehe ich es in einem quietschenden Code implementiert.

Ich dachte, es wäre unvermeidlich, wenn ich keine DB verwenden müsste, aber ich fühle mich oft motiviert, mich an den vorherigen Zustand zu erinnern.

** Zustandsübergang **

Drücken Sie insbesondere beim Entwickeln des Bildschirms die Taste "Zurück", um zum ursprünglichen Bildschirmstatus zurückzukehren. Eine solche Rollback-Verarbeitung ist auf verschiedene Weise erforderlich. Aktivieren Sie diese vorherige Ansicht und diese Ansicht, damit diese Schaltfläche verwendet werden kann.

Was ist der clevere Weg, um eine Android-App als Hobby zu entwickeln? Ich entwickelte mich, während ich mir die ganze Zeit Sorgen machte. Zu jener Zeit

Ich habe so etwas gemacht. Ändern Sie das Layout der Ansicht unter Berücksichtigung des vorherigen Status. So was Ich habe das Gefühl, dass ich als Amateur mein Bestes gegeben habe, aber ich bin mir sicher, dass ich aufgrund der großen Änderungen am Bildschirm sterben werde.

** Wenn Sie Mement nicht verwenden **

Button Event Management Klasse


//Ereignisverwaltungsklasse für jede Schaltfläche
public class ActivityListenerPresenter {
    public static ActivityListenerPresenterImple mInstance;

    public static ActivityListenerPresenterImple getInstance() {
        if(mInstance == null) mInstance = new ActivityListenerPresenterImple();
        return mInstance;
    }

    //Führen Sie für jedes Schaltflächenereignis einen Bildschirmübergang durch
...
    //Zurückgestoßen
    public static boolean goBack() {
        return getInstance().goBack();
    }
}

Button Event Management Klasse(Diese Montageseite


public class ActivityListenerPresenterImple {
...
   public boolean goBack() {
        //Statuserfassung
        ActivityListenerState prevState = mActivityStateAction.getPrev();
        Log.v(TAG_LOG, "Prev state=" + prevState);
        goNext(prevState);
        return true;
    }

    private void goNext(ActivityListenerState state) {
        //Statuserfassung
        mActivityStateAction = getActivityStateAction(state);
        //Zeigen Sie den Bildschirm entsprechend dem Status an
        mActivityStateAction.showCurrent();
    }

    private ActivityStateAction getActivityStateAction(ActivityListenerState state) {
        Log.v(TAG_LOG, "getActivityStateAction=" + state);
        ActivityStateAction action=null;
        switch(state) {
            case MYVIDEO_LIST:
                action = new ActivityStateActionMYVIDEO_LIST();
                break;
            case MYVIDEO_RUN:
                action = new ActivityStateActionMYVIDEO_RUN();
                break;
            ...
        }
        return action;
    }

    //Geben Sie Ihr Bestes, um umzusetzen, wie hoch die Prävalenz in jedem Bundesstaat sein wird
    private interface ActivityStateAction{
        //Tatsächliche Ansichtsumschaltung
        public void showCurrent();
        //Gib dein Bestes, um zu prev zurückzukehren
        public ActivityListenerState getPrev();
    }

(


public class ActivityListenerPresenterImple {
...
   public boolean goBack() {
        //
        mActivityStateAction = setMementPrevActivityStateAction()
        //Dies mag nicht einfach sein, aber dieses scheint ein besseres Codevolumen und eine bessere Lesbarkeit zu haben. ** Vorhersage bei Verwendung von Mement ** Ereignisverwaltungsklasse für Schaltflächen Diese Implementierungsseite zeigt einen Bildschirm entsprechend dem Status der Statuserfassung an
        mActivityStateAction.showCurrent();
        return true;
    }

    private void goNext(ActivityListenerState state) {
        //Behalten Sie den vorherigen Status bei
        mementPrevActivityStateAction(mActivityStateAction);
        //Statuserfassung
        mActivityStateAction = getActivityStateAction(state);
        //Zeigen Sie den Bildschirm entsprechend dem Status an
        mActivityStateAction.showCurrent();
    }

///getActivityStateAction bleibt unverändert

    //Ist die Schnittstelle jedes Zustands nicht nur mit showCurrent gut?
    private interface ActivityStateAction{
        //Tatsächliche Ansichtsumschaltung
        public void showCurrent();
        //public ActivityListenerState getPrev();
    }

Bibliothek

Ich habe versucht, es in eine Bibliothek zu verwandeln, wenn es Erinnerungs- und Anwendungsfälle gibt, in denen Sie die gewünschten Szenen sehen können, wenn Sie darüber nachdenken. Der Inhalt, den ich mache, ist fast der gleiche wie zum Zeitpunkt des Prototyps.

Überblick

--Speicher (Instanzinformationen) in der Bibliothek aufzeichnen. »Sie können die Erinnerungen ausgraben, an die Sie sich erinnern.

Grundsätzlich wird ein Rollback zum Zeitpunkt des Fehlers angenommen.

** Klassendesign **

Dieses Mal soll es jedes Mal wegwerfbar sein, daher gibt es kein Klassendesign. Also weggelassen.

guter Punkt

――Es ist leicht, sich nicht daran zu erinnern, in welchen Zustand Sie zurückkehren sollten

** Schlechte Punkte **

** Betriebsumgebung **

Bestätigt unter Ubuntu 18.04 Desktop, CentOS 7.5.1804. Ich denke, es funktioniert unter Linux.

** Einzelheiten **

** API-Definition **

mement.h


/*Definition des Erinnerungsregisters*/
struct mement_register_t;
typedef struct mement_register_t *MementRegister;

/*Benutzerimplementierte Funktionsdefinition. Der Standardwert ist memcpy und free nichts tun(Körperinstanz mit Mement Register zerstört*/
struct mement_method_t {
        /*Da sich die Instanz von mement in der Bibliothek befindet, ist ihr Konstruktor*/
        void (*constructor) (void *instance, void * base, size_t base_length);

        /*Kopie des Erinnerungsstücks*/
        void (*copy) (void *broken_instance, void * base, size_t base_length);

        /*Freigabe des Erinnerungsstücks. Die Basiseinheit wird zusammen mit dem Mement Register erworben, sodass sie nicht freigegeben wird.*/
        void (*free) (void * base, size_t base_length);
};

typedef struct mement_method_t mement_method_t;

/*Registrierung*/
MementRegister mement_register(void * base, size_t base_length, mement_method_t                                                                                                                                                                              * method);
/*Anmeldung abmelden*/
void mement_unregister(MementRegister this);
/*Erinnerungserinnerungen*/
void mement_remember(MementRegister this, void * broken_instance, int is_unregister_mement);

** Wie benutzt man: **

  1. Registrieren Sie Speicher mit mement_register
  2. Denken Sie mit mement_remember daran. Wenn is_unregister_mement ungleich Null ist, vergessen Sie es an dieser Stelle.
  3. Verwenden Sie mement_unregister, um die Erinnerungen zu vergessen, die Sie mit mement_remember nicht vergessen haben.

Code

Es befindet sich unten. https://github.com/developer-kikikaikai/design_pattern_for_c/tree/master/mement

Du brauchst keine Probe, oder? Denken Sie nur an die Daten, die Sie gespeichert haben. Bitte beachten Sie ggf. den Code des Instruments / Tests.

Schließlich

Notieren Sie Ihre Erinnerungen, damit Sie sich an sie erinnern können. Ich denke, es ist eine einfache, aber ausgezeichnete Idee. Ich habe einen Fehler in der Git-Operation von Mement gemacht und den gesamten Code einschließlich des Tests gelöscht.

Es ist wichtig, Aufzeichnungen zu führen

Referenz

18. Erinnerungsmuster

Recommended Posts

Probieren Sie Designmuster in C-Sprache aus! Erinnerungsmuster - merken wir uns die Speicher der Daten
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 10)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 7)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 3)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 9)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 6)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 4)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 5)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 2)
Zusammenfassung von "In Java-Sprache erlernte Entwurfsmuster (Multi-Thread-Edition)" (Teil 1)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 11)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 12)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 8)
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
Java-Sprache aus der Sicht von Kotlin und C #
Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit
Schreiben Sie die Zuweisungen der Universität C mit Node.js neu