2015-11-13 6 views
-1

Я хотел бы устранить дублирование кода в следующих двух методах, перемещая общий код в отдельный метод, вызываемый обоими. В комментариях указаны блоки кода, которые имеют различную реализацию в каждом методе.Рефакторинг кода для устранения дублирования кода в двух функциях

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() 

Я имею в виду решение, которое имеет общий абстрактный метод, который может быть вызван из compute_totals_h и compute_totals_v с каждым методом проходных функций для обработки его реализации. Я не могу понять, как это сделать, правильно передавая аргументы для каждой реализации. Это будет выглядеть примерно так:

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() 

Я также ценит предложения по лучшему способу обработки этого типа рефакторинга кода, чтобы устранить этот общий класс задач кода дублирования.

+0

Этот вопрос не подходит для SO. [Обзор кода] (http://codereview.stackexchange.com/) может быть лучшим местом. – That1Guy

+1

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что речь идет о рефакторинге рабочего кода. – That1Guy

+0

Вопрос кажется мне верным. Существуют теги SO при рефакторинге и дублировании кода (по уважительной причине, я думаю) плюс несколько похожих вопросов SO с довольно полезными ответами, например. [Это] (http://stackoverflow.com/questions/28562765/deduplicating-code-in-slightly-different-functions). –

ответ

0

Как я посоветовал, я разместил этот вопрос на Code Review и получил отличный подробный ответ.

Вы можете прочитать ответ here.