SOLID‑рефакторинг: преобразование FileStatManager

Разделите FileStatManager на счётчики TXT/CSV, хранилище статистики, консольный интерфейс и отдельную службу файловых операций. Удаление каталога не относится к вычислению статистики и требует особых ограничений.

Короткий ответ

Что ответить на собеседовании

Разделите FileStatManager на счётчики TXT/CSV, хранилище статистики, консольный интерфейс и отдельную службу файловых операций. Удаление каталога не относится к вычислению статистики и требует особых ограничений.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо привести класс FileStatManager в соответствие с принципами SOLID. Требуется разделить обязанности, вынести работу с файловой системой и взаимодействие с пользователем в отдельные модули, чтобы каждый класс отвечал только за свою часть функционала.

import csv
import os
import shutil

class FileStatManager:
    def __init__(self):
        self.txt_stat = FileStats('txt')
        self.csv_stat = FileStats('csv')

    def read_txt_stats(self, file_path):
        with open(file_path, 'r') as f:
            lines = f.readlines()
            self.txt_stat.increase(lines=len(lines))
        print('TXT stats were updated.')

    def read_csv_stats(self, file_path):
        with open(file_path, 'r') as f:
            reader = csv.reader(f)
            lines = list(reader)
            self.csv_stat.increase(lines=len(lines), columns=min(len(l) for l in lines))
        print('CSV stats were updated.')

    def choose_file(self):
        while True:
            file_path = input('Enter a path to a file you want to count:')
            if os.path.isfile(file_path):
                break
            else:
                print('You entered a wrong path. Try again.')

        if file_path.endswith('.txt'):
            self.read_txt_stats(file_path)
        elif file_path.endswith('.csv'):
            self.read_csv_stats(file_path)

    def clean_stats(self):
        while True:
            answer = input('Are you sure? (y/n)')
            if answer == 'y':
                self.txt_stat = FileStats('txt')
                self.csv_stat = FileStats('csv')
                print('Stats were cleaned')
                break
            elif answer == 'n':
                print('Stats were preserved')
                break

    def show_stats(self):
        print('TXT stats:')
        print(self.txt_stat)
        print('CSV stats:')
        print(self.csv_stat)

    def clean_folder(self):
        while True:
            folder_path = input('Enter a path to a folder you want to clean:')
            if os.path.isdir(folder_path):
                break
            else:
                print('You entered a wrong path. Try again.')

        while True:
            answer = input('Are you sure? (y/n)')
            if answer == 'y':
                try:
                    shutil.rmtree(folder_path)
                    print('Folder was cleaned')
                    break
                except Exception as e:
                    print('Something went wrong. Try again.')
            elif answer == 'n':
                print('Folder was preserved')
                break

Ответ

Разделите FileStatManager на счётчики TXT/CSV, хранилище статистики, консольный интерфейс и отдельную службу файловых операций. Удаление каталога не относится к вычислению статистики и требует особых ограничений.

TXT можно считать потоково, не вызывая readlines. CSV обрабатывайте через csv.reader с newline='' и явной кодировкой; пустой файл сейчас ломает min(...). Нужно определить, является ли число колонок минимумом или нарушением ожидаемой схемы.

Менеджер получает стратегии через зависимости, не читает input и не печатает сам. UI подтверждает действия и показывает ошибки. clean_folder сейчас удаляет сам каталог рекурсивно, а не только «очищает» его: ограничьте разрешённые корни, проверяйте точный путь и предпочтите восстановимое удаление. Не ловите все ошибки бесконечным циклом без диагностического контекста.

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

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

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

Подробнее