[JAVA] Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données

** Introduction **

"Essayez en langage C! Modèle de conception" Cette fois, c'est le modèle Mement. En un mot, c'est une restauration DB. Si vous y réfléchissez bien, je pense que c'est un modèle utile.

Liste des modèles de conception Description du package de bibliothèque créé Le code public est ici

** Modèle de souvenir **

L'explication de wikipedia est la suivante.

Le motif memento (anglais: motif Memento, Japon: motif Memento) est l'un des modèles de conception logicielle qui permet de ramener un objet à son état antérieur (par retour arrière).

C'est simple. Même si vous regardez l'explication de Techscore et le diagramme de classes ci-dessous, Originator dispose d'un mécanisme pour revenir à l'état d'origine à l'aide de la classe Mememt qui contient l'état.

画像

En repensant au passé, je me suis demandé à quoi cela servait. Il y avait pas mal de cas d'utilisation qui semblaient utiles.

** Utilisation **

** Restauration des données **

Si vous utilisez DB, vous pouvez utiliser la fonction de restauration, mais si vous avez un système avec un mécanisme de stockage de données simple, vous n'avez pas besoin d'utiliser DB, donc si vous souhaitez le restaurer en cas d'erreur, une erreur se produira. Parfois, je le vois implémenté dans un code grinçant.

Je pensais que ce serait inévitable si je n'avais pas besoin d'utiliser DB, mais je me sens souvent motivé à "me souvenir de l'état précédent".

** Transition d'état **

Surtout lors du développement de l'écran, appuyez sur le bouton "Retour" pour revenir à l'état de l'écran d'origine. Un traitement de restauration comme celui-ci est nécessaire de différentes manières. Activez cette vue précédente et cette vue pour que ce bouton puisse être utilisé.

Quand j'ai développé une application Android comme passe-temps auparavant, quelle est la manière intelligente de le faire? Je développais en m'inquiétant tout le temps. À ce moment-là

--Une classe dédiée aux transitions de gestion de l'état de l'écran est mise en place, et lorsque les transitions d'écran, les transitions sont renvoyées comme "Suivant est quel état" et "retour est quel état".

Je faisais quelque chose comme ça. Modifiez la disposition de la vue tout en gardant à l'esprit l'état précédent. Comme ça J'ai l'impression d'avoir fait de mon mieux en tant qu'amateur, mais je suis sûr que je mourrai à cause du grand nombre de changements apportés à l'écran.

** Si vous n'utilisez pas Mement **

Classe de gestion des événements Button


//Classe de gestion d'événements pour chaque bouton
public class ActivityListenerPresenter {
    public static ActivityListenerPresenterImple mInstance;

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

    //Effectuer une transition d'écran pour chaque événement de bouton
...
    //Repoussé
    public static boolean goBack() {
        return getInstance().goBack();
    }
}

Classe de gestion des événements Button(Ce côté de montage


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

    private void goNext(ActivityListenerState state) {
        //Acquisition de statut
        mActivityStateAction = getActivityStateAction(state);
        //Afficher l'écran en fonction de l'état
        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;
    }

    //Faites de votre mieux pour mettre en œuvre ce que le précédent sera dans chaque état
    private interface ActivityStateAction{
        //Changement de vue réel
        public void showCurrent();
        //Faites de votre mieux pour revenir à la précédente
        public ActivityListenerState getPrev();
    }

Par exemple, en utilisant l'idée de mement, il aurait été possible de mémoriser l'état précédent au moment de la transition d'état et de le restaurer même sans getPrev. Ce ne sera pas simple comme ça, mais celui-ci semble avoir un meilleur volume de code et une meilleure lisibilité.

** Attentes lors de l'utilisation de Mement **

Classe de gestion des événements Button(Ce côté de montage


public class ActivityListenerPresenterImple {
...
   public boolean goBack() {
        //Acquisition de statut
        mActivityStateAction = setMementPrevActivityStateAction()
        //Afficher l'écran en fonction de l'état
        mActivityStateAction.showCurrent();
        return true;
    }

    private void goNext(ActivityListenerState state) {
        //Conserver l'état précédent
        mementPrevActivityStateAction(mActivityStateAction);
        //Acquisition de statut
        mActivityStateAction = getActivityStateAction(state);
        //Afficher l'écran en fonction de l'état
        mActivityStateAction.showCurrent();
    }

///getActivityStateAction reste inchangé

    //L'interface de chaque état n'est-elle pas seulement bonne avec showCurrent?
    private interface ActivityStateAction{
        //Changement de vue réel
        public void showCurrent();
        //public ActivityListenerState getPrev();
    }

Bibliothèque

J'ai essayé d'en faire une bibliothèque s'il y a des souvenirs et des cas d'utilisation où vous pouvez voir les scènes que vous voulez quand vous y pensez. Le contenu que je fais est presque le même que au moment du prototype.

Aperçu

Fondamentalement, la restauration au moment de l'erreur est supposée.

** Conception de classe **

Cette fois, il est censé être jetable à chaque fois, il n'y a donc pas de conception de classe. Tellement omis.

bon point

――Il est facile de ne pas se souvenir dans quel type d'état vous devriez revenir

** Mauvais points **

Environnement d'exploitation

Confirmé sur le bureau Ubuntu 18.04, CentOS 7.5.1804. Je pense que cela fonctionne sous Linux.

** Détails **

** Définition API **

mement.h


/*Définition du registre des souvenirs*/
struct mement_register_t;
typedef struct mement_register_t *MementRegister;

/*Définition de la fonction implémentée par l'utilisateur. La valeur par défaut est memcpy et free ne rien faire(Instance de corps détruite avec le registre des souvenirs*/
struct mement_method_t {
        /*Puisque l'instance de mement est dans la bibliothèque, son constructeur*/
        void (*constructor) (void *instance, void * base, size_t base_length);

        /*copie de souvenir*/
        void (*copy) (void *broken_instance, void * base, size_t base_length);

        /*Libération de souvenir. L'entité de base est acquise avec Mement Register, elle n'est donc pas libérée.*/
        void (*free) (void * base, size_t base_length);
};

typedef struct mement_method_t mement_method_t;

/*enregistrement de souvenir*/
MementRegister mement_register(void * base, size_t base_length, mement_method_t                                                                                                                                                                              * method);
/*désinscrire mement*/
void mement_unregister(MementRegister this);
/*Souvenirs de souvenirs*/
void mement_remember(MementRegister this, void * broken_instance, int is_unregister_mement);

** Comment utiliser: **

  1. Enregistrez des souvenirs avec mement_register
  2. Rappelez-vous avec mement_remember. Si is_unregister_mement est différent de zéro, oubliez-le à ce stade.
  3. Utilisez mement_unregister pour oublier les souvenirs que vous n'avez pas oubliés avec mement_remember.

code

Il est situé ci-dessous. https://github.com/developer-kikikaikai/design_pattern_for_c/tree/master/mement

Vous n'avez pas besoin d'un échantillon, non? Souvenez-vous simplement des données que vous déteniez. Veuillez vous référer au code de mement / test si nécessaire.

Finalement

Enregistrez vos souvenirs pour vous en souvenir. Je pense que c'est une idée simple mais excellente. J'ai fait une erreur dans l'opération git de mement et j'ai supprimé tout le code, y compris le test.

Il est important de garder une trace

référence

18. Modèle Memento

Recommended Posts

Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 10)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 7)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 3)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 9)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 6)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 4)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 2)
Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 1)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 11)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 12)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 8)
[Order method] Définit l'ordre des données dans Rails
Langage Java du point de vue de Kotlin et C #
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
Réécrire les affectations de langage C de l'université avec Node.js