# Диаграмма классов Universal Git Analyzer OOP

## Основные классы

```text
UniversalGitAnalyzerApp
 ├── storage: StorageManager
 ├── git_analyzer: GitAnalyzer
 ├── current_user
 ├── current_repo
 ├── current_index
 └── current_data

StorageManager
 ├── data_file
 ├── register_user(login, password)
 ├── check_user(login, password)
 ├── get_repositories(login)
 ├── add_repository(login, link)
 └── delete_repository(login, link)

UserProfile
 ├── login
 ├── password_hash
 ├── repositories
 └── to_dict()

GitAnalyzer
 ├── languages
 ├── ignore_dirs
 ├── normalize_link(link)
 ├── clone_repo(link)
 ├── get_commits(repo_dir)
 ├── get_visible_branches_at_commit(repo_dir, selected_commit)
 ├── analyze_files_for_branches(repo_dir, selected_commit)
 ├── analyze_repository(link, selected_index)
 └── format_analysis(data)

RepositoryInfo
 ├── link
 ├── repo_name
 ├── default_branch
 ├── branches
 ├── commits
 ├── total_files
 └── total_lines

CommitInfo
 ├── hash
 ├── short
 ├── author
 ├── date
 ├── timestamp
 └── message

BranchInfo
 ├── name
 ├── ref
 ├── total_files
 └── total_lines
```

## Связи

```text
UniversalGitAnalyzerApp --> StorageManager
UniversalGitAnalyzerApp --> GitAnalyzer
StorageManager --> UserProfile
GitAnalyzer --> RepositoryInfo
RepositoryInfo --> CommitInfo
RepositoryInfo --> BranchInfo
```

## Объекты системы во время работы

Пример объектов, которые появляются при запуске:

```text
app = UniversalGitAnalyzerApp()
storage = StorageManager()
git_analyzer = GitAnalyzer()
user = UserProfile("egor", password_hash, repositories)
repository = RepositoryInfo(link, repo_name, default_branch, branches, commits)
commit = CommitInfo(hash, short, author, date, timestamp, message)
branch = BranchInfo(name, ref, total_files, total_lines)
```

## Что сказать на защите

В OOP-версии приложение разделено на классы:

- `UniversalGitAnalyzerApp` отвечает за интерфейс.
- `StorageManager` отвечает за локальное хранение пользователей и ссылок.
- `GitAnalyzer` отвечает за анализ Git-репозитория.
- `UserProfile`, `RepositoryInfo`, `CommitInfo`, `BranchInfo` являются объектами предметной области.

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