Разделите FileStatManager на счётчики TXT/CSV, хранилище статистики, консольный интерфейс и отдельную службу файловых операций. Удаление каталога не относится к вычислению статистики и требует особых ограничений.
SOLID‑рефакторинг: преобразование FileStatManager
Разделите 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 сейчас удаляет сам каталог рекурсивно, а не только «очищает» его: ограничьте разрешённые корни, проверяйте точный путь и предпочтите восстановимое удаление. Не ловите все ошибки бесконечным циклом без диагностического контекста.