10_Композиция_и_организация_результата.md - YaroslavGit28/os.sys-PY GitHub Wiki
10. Композиция и организация результата
Этот модуль показывает, как из набора простых функций собрать цельный, удобный и расширяемый учебный инструмент.
10.1. Что такое композиция в контексте проекта
Композиция здесь — это принцип:
- есть небольшие независимые функции (каждая решает узкую задачу),
- они объединяются в один рабочий сценарий через
main().
Примеры “кирпичиков”:
- операции с файловой системой (
list_dir,make_dir,remove_item,change_dir); - системные операции (
clear_screen,open_explorer,open_shell_here); - операции интерфейса (
print_header,show_menu).
10.2. Почему такой подход хорош для учебного проекта
- Прозрачность: легко объяснить, где что происходит.
- Повторное использование: функции можно вызывать отдельно.
- Расширяемость: добавить пункт меню = добавить функцию + ветку в
main. - Простота отладки: ошибка локализуется в конкретной функции.
10.3. Карта зависимостей функций
graph LR
MAIN[main] --> UI1[clear_screen]
MAIN --> UI2[print_header]
MAIN --> UI3[show_menu]
MAIN --> F1[list_dir]
MAIN --> F2[change_dir]
MAIN --> F3[make_dir]
MAIN --> F4[remove_item]
MAIN --> S1[open_explorer]
MAIN --> S2[open_shell_here]
10.4. Сравнение с “монолитным” стилем (антипример)
Антипример: всё внутри одного while
while True:
c = input("...")
if c == "1":
# много кода
elif c == "2":
# ещё много кода
# и так далее...
Проблемы:
- код быстро разрастается;
- повторяется логика;
- читать и поддерживать сложно.
Текущий подход проекта
if choice == "1":
list_dir()
elif choice == "2":
change_dir()
elif choice == "3":
make_dir()
Выигрыш:
- лаконичный
main; - каждая функция описывает 1 действие.
10.5. Организация результатов выполнения
Результат каждой команды в проекте оформляется как:
- Выполнение операции;
- Понятное сообщение пользователю (
print); - Пауза “Нажмите Enter” для чтения результата;
- Возврат в меню.
Это примитивно, но для учебной консольной утилиты — оптимальный UX.
10.6. График “цельность интерфейса”
Понятность интерфейса
^
| Разрозненные команды (терминал) **
| **
| Меню + единый сценарий ******
| ******
| Меню + отдельные функции ********
+----------------------------------------------> уровень структурирования
10.7. Практическая рекомендация
Если проект растёт, сохраняйте принцип:
- 1 функция = 1 ответственность;
- все пользовательские сценарии проходят через 1 точку управления (
main); - ОС-специфичные детали прячьте в отдельных обёртках.
10.8. Разбор кода по шагам: композиция в main()
if choice == "1":
list_dir()
pause()
elif choice == "2":
list_dir_scandir()
pause()
elif choice == "3":
change_dir()
pause()
Пояснение:
choice— единая точка принятия решения в интерфейсе.- Каждая ветка вызывает одну специализированную функцию.
pause()выравнивает UX и исключает “мгновенное исчезновение” результата.- Такой шаблон легко масштабировать до 16+ пунктов без усложнения логики.
Почему это важно:
- пользователю проще изучать проект, когда структура веток одинакова;
- разработчику проще добавлять новые действия без переписывания старых.