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 — критерий удобства расширения, а не требование создать максимум классов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее