Cercando di capire quale struttura è più pulita tra l'utilizzo di una funzione specializzata o l'utilizzo di parametri per realizzare la stessa cosa (vedi esempio di codice sotto).
Essenzialmente, posso ridurre il numero di metodi astratti nella mia interfaccia aggiungendo parametri (come nel caso BufferParameter
). Se i metodi stessi diventassero troppo grandi (in termini di parametri e / o linee di codice), allora passerei alle funzioni esplicite (come in BufferMethod
caso).
Qui suona la mia logica o dovrei preferire sempre il caso BufferMethod
?
class BufferBase(object):
__metaclass__ = ABCMeta
@abstractmethod
def clear(self):
pass
def clearall(self):
"""Only used in the 'BufferMethod' class."""
pass
class BufferParameter(BufferBase):
def clear(self, buffer_idx='all'):
"""Accepts either a buffer integer index or the string 'all'."""
if buffer_idx == "all":
for buff in self.buffers:
buff.clear()
return
self.buffers[buffer_idx].clear()
class BufferMethod(BufferBase):
def clear(self, buffer_idx):
self.buffers[buffer_idx].clear()
def clearall(self):
for buff in self.buffers:
buff.clear()
Esempi di utilizzo:
bp = BufferParameter()
bm = BufferMethod()
for b in bp.buffers:
b.write('foo')
for b in bm.buffers:
b.write('foo')
bm.append('bar', buffer_idx=6)
bp.append('bar', buffer_idx=6)
print(bm.read(buffer_idx=6))
print(bp.read(buffer_idx=6))
print(bm.read(buffer_idx='all'))
print(bp.readall())
bm.clear('all')
bp.clearall()