Разделите подсчёт метрик, выбор метрик для формата и представление результата. Агрегатор не должен знать, какие расширения поддерживают строки или столбцы.
SOLID‑рефакторинг: переработка класса FileStats
Разделите подсчёт метрик, выбор метрик для формата и представление результата. Агрегатор не должен знать, какие расширения поддерживают строки или столбцы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо изменить класс FileStats так, чтобы он полностью соответствовал принципам SOLID. Требуется разделить ответственность между отдельными компонентами и избавиться от проверок, зависящих от расширений файлов, внутри методов.
class FileStats:
def __init__(self, *extensions):
self.file_count = 0
self.extensions = extensions
self.line_total = 0
self.column_total = 0
def increase(self, **kwargs):
self.file_count += 1
if 'txt' in self.extensions or 'csv' in self.extensions:
self.line_total += kwargs.get('lines', 0)
if 'csv' in self.extensions:
self.column_total += kwargs.get('columns', 0)
def __str__(self):
result = f'Files count = {self.file_count}'
if 'txt' in self.extensions or 'csv' in self.extensions:
result += f'\ntotal lines = {self.line_total}'
if 'csv' in self.extensions:
result += f'\ntotal columns = {self.column_total};'
return result
Ответ
Разделите подсчёт метрик, выбор метрик для формата и представление результата. Агрегатор не должен знать, какие расширения поддерживают строки или столбцы.
Создайте общий контракт метрики, например update(file_info) и value. FileCount, LineCount и ColumnCount реализуют его независимо. FileStats получает список метрик в конструкторе, передаёт им сведения о каждом обработанном файле и возвращает словарь результатов. Отдельный formatter отвечает за текстовый вывод.
Соответствие расширения набору метрик задаётся во внешней конфигурации или фабрике: TXT использует количество файлов и строк, CSV дополнительно столбцы. Новая метрика добавляется без изменения агрегатора. Важно заранее определить смысл суммы столбцов и поведение при отсутствующих данных. SOLID — критерий удобства расширения, а не требование создать максимум классов.