Я хотел бы устранить дублирование кода в следующих двух методах, перемещая общий код в отдельный метод, вызываемый обоими. В комментариях указаны блоки кода, которые имеют различную реализацию в каждом методе.Рефакторинг кода для устранения дублирования кода в двух функциях
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()
Я также ценит предложения по лучшему способу обработки этого типа рефакторинга кода, чтобы устранить этот общий класс задач кода дублирования.
Этот вопрос не подходит для SO. [Обзор кода] (http://codereview.stackexchange.com/) может быть лучшим местом. – That1Guy
Я голосую, чтобы закрыть этот вопрос как вне темы, потому что речь идет о рефакторинге рабочего кода. – That1Guy
Вопрос кажется мне верным. Существуют теги SO при рефакторинге и дублировании кода (по уважительной причине, я думаю) плюс несколько похожих вопросов SO с довольно полезными ответами, например. [Это] (http://stackoverflow.com/questions/28562765/deduplicating-code-in-slightly-different-functions). –