"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
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.
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".
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();
}
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.
Fondamentalement, la restauration au moment de l'erreur est supposée.
Cette fois, il est censé être jetable à chaque fois, il n'y a donc pas de conception de classe. Tellement omis.
――Il est facile de ne pas se souvenir dans quel type d'état vous devriez revenir
Confirmé sur le bureau Ubuntu 18.04, CentOS 7.5.1804. Je pense que cela fonctionne sous Linux.
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);
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.
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
Recommended Posts