"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.
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.
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.
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();
}
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.
--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.
Dieses Mal soll es jedes Mal wegwerfbar sein, daher gibt es kein Klassendesign. Also weggelassen.
――Es ist leicht, sich nicht daran zu erinnern, in welchen Zustand Sie zurückkehren sollten
Bestätigt unter Ubuntu 18.04 Desktop, CentOS 7.5.1804. Ich denke, es funktioniert unter Linux.
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);
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.
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
Recommended Posts