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. Почему такой подход хорош для учебного проекта

  1. Прозрачность: легко объяснить, где что происходит.
  2. Повторное использование: функции можно вызывать отдельно.
  3. Расширяемость: добавить пункт меню = добавить функцию + ветку в main.
  4. Простота отладки: ошибка локализуется в конкретной функции.

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. Организация результатов выполнения

Результат каждой команды в проекте оформляется как:

  1. Выполнение операции;
  2. Понятное сообщение пользователю (print);
  3. Пауза “Нажмите Enter” для чтения результата;
  4. Возврат в меню.

Это примитивно, но для учебной консольной утилиты — оптимальный 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()

Пояснение:

  1. choice — единая точка принятия решения в интерфейсе.
  2. Каждая ветка вызывает одну специализированную функцию.
  3. pause() выравнивает UX и исключает “мгновенное исчезновение” результата.
  4. Такой шаблон легко масштабировать до 16+ пунктов без усложнения логики.

Почему это важно:

  • пользователю проще изучать проект, когда структура веток одинакова;
  • разработчику проще добавлять новые действия без переписывания старых.