Je voudrais éliminer la duplication de code dans les deux méthodes suivantes en déplaçant le code commun dans une méthode séparée pouvant être appelée par les deux. Les commentaires indiquent les blocs de code qui ont une implémentation différente dans chaque méthode.Réécriture de code pour éliminer la duplication de code dans deux fonctions
def compute_totals_h(self, size, bad_codes):
with open(self._in_file_path, self._FILE_READ_MODE) as f:
# initialize reader
reader = csv.reader(f)
field_names = reader.next()
for i, code in enumerate(field_names):
code = code.strip(string.punctuation).upper()
field_names[i] = code
for code in field_names:
if (len(code) <= size) and (code not in bad_codes):
self._totals[code] = 0
for row in reader:
# get totals
for i, val in enumerate(row):
code = field_names[i]
if (code in self._totals):
self._totals[code] += string_utils.to_int(val)
self._write_totals()
def compute_totals_v(self, code_field, est_field):
with open(self._in_file_path, self._FILE_READ_MODE) as f:
# initialize reader
reader = csv.DictReader(f)
for row in reader:
# get totals
code = row[code_field].strip(string.punctuation).upper()
est = string_utils.to_int(row[est_field])
if code in self._totals:
self._totals[code] += est
else:
self._totals[code] = est
self._write_totals()
Je pense à une solution qui a une méthode abstraite commune qui peut être appelé à partir compute_totals_h
et compute_totals_v
avec chacune des fonctions de passage de méthode pour gérer sa mise en œuvre. Je ne peux pas comprendre comment faire ceci en passant correctement les arguments pour chaque implémentation. Il ressemblerait à quelque chose comme:
def compute_totals(self, initialize_reader, get_totals):
with open(self._in_file_path, self._FILE_READ_MODE) as f:
reader = initialize_reader(f)
for row in reader:
get_totals(row)
self._write_totals()
Je vais aussi apprécier des suggestions sur une meilleure façon de gérer ce type de code refactoring pour éliminer cette classe générale des problèmes de duplication de code.
Cette question ne convient pas pour SO. [Code Review] (http://codereview.stackexchange.com/) pourrait être un meilleur endroit. – That1Guy
Je vote pour clore cette question hors-sujet car il s'agit de refactoriser le code de travail. – That1Guy
La question me semble assez valable. Il existe des balises SO sur le refactoring et la duplication de code (pour une bonne raison je pense) plus plusieurs questions similaires SO avec des réponses très utiles, par exemple. [ceci] (http://stackoverflow.com/questions/28562765/deduplicating-code-in-slightly-different-functions). –