J'ai une classe qui représente un objet assez complexe. Les objets peuvent être créés de différentes manières: construction incrémentale, en analysant des chaînes de texte dans différents formats et en analysant des fichiers binaires. Jusqu'à présent, ma stratégie était la suivante:Modèle de générateur d'objets
Demandez au constructeur (
__init__
, dans mon cas) initialiser toutes les variables internes àNone
alimentation différentes fonctions membres pour remplir l'objet
Ces fonctions renvoient-elles le nouvel objet modifié à l'appelant pour que nous puissions le faire?
sd = SuperDuper().fromString(s)
Par exemple:
class SuperDuper:
def __init__(self):
self.var1 = None
self.var2 = None
self.varN = None
## Generators
def fromStringFormat1(self, s):
#parse the string
return self
def fromStringFormat2(self, s):
#parse the string
return self
def fromAnotherLogic(self, *params):
#parse params
return self
## Modifiers (for incremental work)
def addThis(self, p):
pass
def addThat(self, p):
pass
def removeTheOtherOne(self, p):
pass
Le problème est que la classe devient très grand. Malheureusement, je ne suis pas familier avec les modèles de POO, mais je suppose qu'il existe une solution plus élégante pour ce problème. Prend les fonctions de générateur de la classe (de sorte que fromString(self, s)
devient superDuperFromString(s)
une bonne idée?
est-ce que les méthodes from *() devraient également modifier l'objet existant, ou simplement en créer un nouveau? Si le premier est le cas, alors mon code ci-dessus est exactement ce que vous voulez dire, à l'exception de la partie '__init__' –
Ils seront classmethods, donc il n'y aura aucun objet existant à modifier. –
Oh, maintenant j'ai la partie de la classe –