Ecco due creatori di oggetti che ho creato:
def make_assassination(i):
neighbors = []
def test(graph):
for n in graph.neighbors(i):
neighbors.append(n)
graph.remove_edge(i, n)
def reset(graph):
for n in neighbors:
graph.add_edge(n, i)
return {'test': test, 'reset': reset, 'strategy': lambda : 'assassinate(%d)' % len(neighbors)}
def make_toggle(i, j):
return {'edge': (i, j),
'strategy': lambda : '',
'test': lambda graph : toggle_edge(graph, i, j),
'reset': lambda graph : toggle_edge(graph, i, j)
}
Entrambi restituiscono un oggetto (dizionario) con le chiavi "test", "reset" e una "strategia" lambda. Un oggetto vuole anche aggiungere una chiave "edge".
Stavo pensando a come convertirlo in qualcosa di più orientato alla classe o tipizzato. Sarebbe come:
class Action(self, **kwargs):
self.test = test
self.reset = reset
self.strategy = strategy
Quindi non sono sicuro di come superare il margine extra.
Penso che esista una strategia in cui la classe può fare qualcosa di simile all'estensione del dizionario, oppure le "classi" secondarie possono accedere al dizionario sottostante dell'azione e modificarlo. Provenendo da uno sfondo Java, questo sembra entrare nell'interno dell'oggetto più di quanto io sia sicuro sia un buon design.
Un'altra opzione è per un kwarg "extra_stuff". Anche un po 'antipattern.
C'è anche un argomento che dovrei lasciare come dizionario grezzo. In effetti non sono nemmeno sicuro se c'è un vantaggio nell'usare un class
.
Quali di questi modelli sono design accettabile?