Supposons qu'une classe a une méthode qui modifie ses internes. Si cette méthode appelle à cette méthode d'économiser sur lui-même avant de retourner ou si la sauvegarde doit-elle être laissée à l'appelant pour enregistrer explicitement une fois que la méthode de modification a été appelée?
Exemple: P>
Appeler explicitement Save: P> < pré> xxx pré>
ou la méthode permettant d'appeler sauvegarder: p> Je travaille avec Django, mais je me demandais s'il y avait une meilleure pratique dans Django ou en général pour cette situation. P> p>
4 Réponses :
L'utilisateur de votre API peut vouloir faire plusieurs modifications, enregistrer l'objet après chaque changement est tout sauf bon, donc non, n'appelez pas Enregistrer dans votre méthode. P>
C'est la façon la plus django-esque de faire des choses. L'épargne doit être explicite et sous contrôle de l'utilisateur. Vous pouvez peut-être ajouter un kwarg comme sauvegarder = true code> à la méthode si vous vouliez donner aux gens un sténographie pratique ...
L'utilisateur de votre API pourrait oublier d'appeler .Save () et ensuite être vissé. Donc, je pense que c'est mieux d'appeler sauf pour lui. Pour des cas comme ceux de Daslch mention, si cela a du sens, vous pouvez définir: afin que l'utilisateur puisse, si elle le souhaite (et stipule explicitement que), évitez la sauvegarde. P > p>
Cela semble être la solution la plus simple et la plus intuitive. En examinant les arguments, l'utilisateur saura qu'une sauvegarde se passe dans la méthode et sera également capable de le remplacer si le besoin se pose.
En fait, je suis d'accord avec Ofri et Daslch ... en fonction de quel jour de la semaine c'est. Si ce n'est que l'une des nombreuses routines de modification que vous pourriez faire à un objet particulier, il sera assez coûteux d'avoir chacun d'entre eux faire leur propre sauvegarde. D'autre part, s'il s'agit d'un événement rare et autonome, vous voulez faire la sauvegarde car il peut ne pas être évident pour l'appelant (c'est-à-dire une personne autre que vous em> que cela doit être fait. P>
Par exemple, les événements de marquage (qui utilisent de toute façon de toute façon) ne doivent pas nécessiter de sauvegarde supplémentaire () sur la partie des programmeurs. P>
Pour faire face à toutes les questions exprimées dans diverses réponses existantes, je suggère l'approche suivante: Fabriquez une méthode, appelez-la dire exemple d'utilisation ...: p> Ceci garantit que l'utilisateur n'oubliera pas d'appeler Sauvegarde code> ou modifiant code>, c'est un contexte directeur. L'entrée de cette méthode définit un drapeau privé indiquant que la modification est en cours; La sortie réinitialise les drapeaux et effectue la sauvegarde; Toutes les méthodes de modification vérifient le drapeau et soulevez une exception si non définie. Par exemple, à l'aide d'une classe de base et d'une méthode code> Enregistrer code> que les sous-classes réelles doivent remplacer: Sauver code> ni l'appeler accidentellement à une manière imbriquée (c'est le but de toutes ces exceptions) et appelle Enregistrer < / Code> Une seule fois lorsque le groupe de méthodes de modification est effectué, à portée de main et, je dirais, de manière assez naturelle. p> p>
Certaines grammaires Nitpicking: la phrase "Méthode de classe" implique une fonction décorée avec
@classmethod code>, qui est utilisée comme méthode de la classe plutôt que par une instance. Votre question devrait probablement simplement dire «la méthode de modification». «Se sauvegarder» rend ça sonnent comme si vous parlez de sauvegarder la méthode, plutôt que de l'instance; Vous devriez dire "Sauver" Self "". Enfin, vous le faites sonner comme si la méthode doit être appelée à nouveau après l'appel. Mieux pourrait être: "Si une méthode qui modifie la sauvegarde d'appels") elle-même, ou devrait sauvegarder () être explicitement appelée par la suite? "