2015-11-13 3 views
-1

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.

+0

Cette question ne convient pas pour SO. [Code Review] (http://codereview.stackexchange.com/) pourrait être un meilleur endroit. – That1Guy

+1

Je vote pour clore cette question hors-sujet car il s'agit de refactoriser le code de travail. – That1Guy

+0

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). –

Répondre

0

Comme indiqué, j'ai posté cette question sur Code Review et j'ai reçu une réponse détaillée et détaillée.

Vous pouvez lire la réponse here.