12_Архитектура_решения.md - YaroslavGit28/os.sys-PY GitHub Wiki

12. Архитектура решения


12.1. Архитектурная идея

Решение построено по простому принципу:

  • один модуль (file_manager.py);
  • набор функций с узкой ответственностью;
  • единая точка управления (main) через меню;
  • разделение на слои:
    • UI-слой (ввод/вывод),
    • слой файловых операций,
    • слой системных команд.

12.2. Слои системы

UI-слой

  • clear_screen(), print_header(), show_menu();
  • сбор ввода пользователя и возврат управления.

Слой файловой логики

  • list_dir(), list_dir_scandir(), change_dir();
  • make_dir(), make_dirs(), make_empty_file();
  • remove_item(), rename_item(), replace_item();
  • show_file_info(), touch_file(), check_access();
  • работа с CURRENT_DIR через os.getcwd/os.chdir.

Слой системной интеграции

  • open_explorer(), open_shell_here();
  • формирование ОС-специфичных команд;
  • запуск команд через os.system.

Слой системной диагностики

  • show_env_demo();
  • show_system_info();
  • демонстрация os.environ, os.getenv, os.getpid, os.cpu_count, os.getlogin.

12.3. Подробная диаграмма компонентов

flowchart TB
    subgraph INPUT[Ввод пользователя]
        U[Пользователь]
    end

    subgraph APP[file_manager.py]
        MAIN[main()]
        MENU[show_menu()]
        HDR[print_header()]
        CLS[clear_screen()]
        CURR[(CURRENT_DIR)]
        L[list_dir()]
        LS[list_dir_scandir()]
        C[change_dir()]
        M[make_dir()]
        MM[make_dirs()]
        MF[make_empty_file()]
        R[remove_item()]
        RN[rename_item()]
        RP[replace_item()]
        FI[show_file_info()]
        TU[touch_file()]
        AC[check_access()]
        EV[show_env_demo()]
        SI[show_system_info()]
        E[open_explorer()]
        S[open_shell_here()]
    end

    subgraph OS[ОС и внешние команды]
        CMD1[explorer/open/xdg-open]
        CMD2[start powershell]
        FS[Файловая система]
    end

    U --> MAIN
    MAIN --> CLS
    MAIN --> HDR
    MAIN --> MENU
    MAIN --> L
    MAIN --> LS
    MAIN --> C
    MAIN --> M
    MAIN --> MM
    MAIN --> MF
    MAIN --> R
    MAIN --> RN
    MAIN --> RP
    MAIN --> FI
    MAIN --> TU
    MAIN --> AC
    MAIN --> EV
    MAIN --> SI
    MAIN --> E
    MAIN --> S

    L --> CURR
    C --> CURR
    M --> CURR
    R --> CURR

    L --> FS
    LS --> FS
    C --> FS
    M --> FS
    MM --> FS
    MF --> FS
    R --> FS
    RN --> FS
    RP --> FS
    FI --> FS
    TU --> FS
    AC --> FS
    E --> CMD1
    S --> CMD2

12.4. Почему архитектура подходит учебной задаче

  1. Простая навигация по коду — всё в одном файле.
  2. Понятные зависимости — функции почти независимы, кроме общего CURRENT_DIR.
  3. Лёгкое расширение — новый пункт меню добавляется без изменения остальных.
  4. Явная демонстрация os.system — видно, где и зачем вызываются системные команды.

12.5. Вариант без Python (сравнение архитектур)

Если бы задача решалась только скриптами ОС:

  • нужен .bat/.ps1 (Windows) и отдельно .sh (Linux/macOS);
  • меню и логика развилок пишутся по-разному;
  • код труднее сделать единым.

Python-подход даёт одну архитектуру и единые принципы, даже если команды в os.system различаются.


12.6. Разбор кода по шагам: ветвление open_explorer()

if os.name == "nt":
    cmd = f'explorer "{CURRENT_DIR}"'
elif sys.platform == "darwin":
    cmd = f'open "{CURRENT_DIR}"'
else:
    cmd = f'xdg-open "{CURRENT_DIR}"'
os.system(cmd)

Пояснение:

  1. Ветки по платформе изолируют ОС-зависимость в одном месте.
  2. Команда хранится в cmd, что облегчает логирование и отладку.
  3. Кавычки вокруг пути нужны для директорий с пробелами.
  4. os.system(cmd) — конечная точка интеграции Python с shell-командой.

Архитектурный вывод:

  • такой код лучше держать в отдельной функции, а не размазывать по main;
  • если нужно заменить os.system на subprocess, изменится только этот слой.