Как можно улучшить качество разделения кода (декомпозицию) в Go?

Как можно улучшить навык декомпозиции в Go и в целом? Мне часто бывает сложно определить, что нужно вынести в отдельный пакет, а что достаточно вынести в отдельную структуру при проектировании своего кода. В более объектно-ориентированных языках, таких как C#, у меня либо не возникает такой проблемы, либо она возникает в меньшей степени. Буду благодарен за рекомендации курсов, ресурсов, книг или просто советов по этой теме.
  • 4 января 2024 г. 19:38
Ответы на вопрос 2
Декомпозиция кода на пакеты и структуры в Go не так сильно отличается от принципов декомпозиции в более объектно-ориентированных языках, но есть определенные нюансы, на которые стоит обратить внимание. Вот несколько советов, как улучшить качество декомпозиции кода в Go:

### 1. Опирайтесь на принципы SOLID:

- **Single Responsibility Principle (SRP):** каждая структура или пакет должны иметь только одну обязанность.
- **Open/Closed Principle (OCP):** ваш код должен быть открыт для расширения, но закрыт для модификации.
- **Liskov Substitution Principle (LSP):** объекты в программе можно заменять их подтипами, не изменяя правильность выполнения программы.
- **Interface Segregation Principle (ISP):** клиенты не должны зависеть от интерфейсов, которые они не используют.
- **Dependency Inversion Principle (DIP):** модули высокого уровня не должны зависеть от модулей низкого уровня. Все должны зависеть от абстракций.

### 2. Используйте пакеты для группировки функционала:

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

### 3. Структурируйте пакеты на основе типов зависимостей:

- Положите независимые пакеты (такие, которые не зависят от других частей вашего приложения) на более низкий уровень.
- Пакеты, зависящие от других пакетов, должны находиться на более высоком уровне.

### 4. Используйте интерфейсы:

- Интерфейсы в Go — это отличный способ обеспечить гибкость и разделение обязанностей.
- Определяйте интерфейсы там, где вы ожидаете, что поведение вашего объекта может быть разным, при этом сохраняя одинаковый контракт.

### 5. Практикуйте и рефакторите:

- Создавайте много небольших программ для практики конкретных принципов дизайна.
- Регулярно проводите рефакторинг существующего кода для улучшения его читаемости и поддерживаемости.

### 6. Изучите идиоматичную структуру Go-проектов:

- Ознакомьтесь с рекомендуемой структурой проектов, например, структурой, в которой используются `cmd` и `pkg` директории.
- Используйте логгеры, инжекцию зависимостей и другие вспомогательные инструменты, чтобы сделать свой код более модульным и тестируемым.

### 7. Обучающие ресурсы:

- **Книги:** "The Go Programming Language" Алана Донована и Брайана Кернигана, "Go in Action" Уильяма Кеннеди.
- **Официальная документация Go:** документация и туториалы на официальном сайте Go (golang.org/doc/
неприлично долго думаю над тем что нужно вынеси в отдельный пакет, а что достаточно вынести в отдельную структуру


Такая-же проблема и у меня. Я тоже долго думаю над дизайном. Но суть в том что в большинстве задач
ты и бизнес не всегда знаете куда пойдет проект дальше. И поэтому нарисовать идельный дизайн нельзя.
Я-бы даже сказал что попытка сопровождать идеальный дизайн - может затянуть внедрение проекта.

Поэтому просто откажись от декомпозиции. Пиши сначала прототип в олимпиадном стиле. Тоесть функция
main - и погнал писать как чукча. Что вижу то и пою.

И после того как ты напишешь 1000 строк например к тебе придет понимание как следует декомпозировать.
И к этому моменту у тебя будут ДОКАЗАТЕЛЬСТВА выгодности твоего дизана. И теоретические споры можно
уже исключить.
Похожие вопросы