Рефакторинг кода для устранения дублирования кода в двух функциях

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

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

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


person Stephen K. Karanja    schedule 13.11.2015    source источник
comment
Этот вопрос не подходит для SO. Проверка кода может быть лучшим местом.   -  person That1Guy    schedule 13.11.2015
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что речь идет о рефакторинге рабочего кода.   -  person That1Guy    schedule 13.11.2015
comment
Вопрос кажется мне вполне актуальным. Существуют теги SO по рефакторингу и дублированию кода (я думаю, по уважительной причине), а также несколько похожих вопросов SO с весьма полезными ответами, например. это.   -  person Stephen K. Karanja    schedule 13.11.2015
comment
Теги действительно существуют по уважительной причине. Если вы столкнетесь с проблемами рефакторинга, эти теги подходят. Однако, если вы просто спрашиваете, как как рефакторить код, вопрос не по теме.   -  person That1Guy    schedule 13.11.2015
comment
Кроме того, будьте осторожны, чтобы не перепутать существование тега с тем, что он подходит для SO. Существует множество тегов, которые возможно, не должны использоваться.   -  person That1Guy    schedule 13.11.2015


Ответы (1)


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

Вы можете прочитать ответ здесь.

person Stephen K. Karanja    schedule 14.11.2015