Я хотел бы устранить дублирование кода в следующих двух методах, переместив общий код в отдельный метод, вызываемый обоими. В комментариях указаны блоки кода, реализация которых отличается в каждом методе.
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()
Я также буду признателен за предложения по лучшему способу обработки этого типа рефакторинга кода, чтобы устранить этот общий класс проблем с дублированием кода.