Практики разбивки проекта на пакеты
От: a9000  
Дата: 31.12.23 09:15
Оценка:
Добрый день! Есть проект на Go, проект разрастается, и стало неудобно когда все файлы в IDE в одном длинном списке. Хочется разбить на папки.
А, насколько я понимаю, это также подразумевает разбивку на пакеты (или нет?).

Сейчас есть main, содержащий глобальную структуру Application, в которой хранятся всякие общие для всего проекта сущности
Объект соединения с БД
Объект с разными настройками программы, читаемыми из конфига
Объект соединения с удаленным сервисом, предоставляющим данные по API
Объект собственного веб-сервера
Объект прокси
и т.п.

Есть группа файлов, которая занимается только работой с БД (выполняет запросы и возвращает массивы с результатами)

Есть группа файлов, которая занимается запросами к удаленному серверу с помощью его API и складыванием результатов в БД

Есть группа файлов, которая занимается формированием собственного веб-интерфейса; она также использует объект БД

Есть файлы, содержащие общие вспомогательные функции

Хочется все это разделить. Но к примеру база должна быть доступна всем "пакетам". Передавать ее каждый раз как аргумент?
Re: Практики разбивки проекта на пакеты
От: Doom100500 Израиль  
Дата: 02.01.24 08:30
Оценка:
Здравствуйте, a9000, Вы писали:

A>Добрый день! Есть проект на Go, проект разрастается, и стало неудобно когда все файлы в IDE в одном длинном списке. Хочется разбить на папки.

A>А, насколько я понимаю, это также подразумевает разбивку на пакеты (или нет?).

Да, это подразумевает разбиение на пакеты, и, как следствие, заставляет задуматься о публичных интерфейсах, доступных снаружи, приватной имплементации. Что, в свою очередь, приведёт к тому, что публичные интерфейсы можно будет мокать в тестах. Одни прелести вобщем.

A>Сейчас есть main, содержащий глобальную структуру Application, в которой хранятся всякие общие для всего проекта сущности

A>Объект соединения с БД
A>Объект с разными настройками программы, читаемыми из конфига
A>Объект соединения с удаленным сервисом, предоставляющим данные по API
A>Объект собственного веб-сервера
A>Объект прокси
A>и т.п.

A>Есть группа файлов, которая занимается только работой с БД (выполняет запросы и возвращает массивы с результатами)


A>Есть группа файлов, которая занимается запросами к удаленному серверу с помощью его API и складыванием результатов в БД


A>Есть группа файлов, которая занимается формированием собственного веб-интерфейса; она также использует объект БД


A>Есть файлы, содержащие общие вспомогательные функции


A>Хочется все это разделить. Но к примеру база должна быть доступна всем "пакетам". Передавать ее каждый раз как аргумент?


// В поддиректории svc где-то в иерархии 
// пишу без IDE, могут быть ошибки
package users

import (
    "context"
    "myprject/internal/database"
)

func New(db database.MyDatabase) Svc {
    return &svc{db: db}
}

type Svc interface {
    UserInfo(ctx context.Context, id string) (*User, error)
}

type svc struct {
    db database.MyDatabase
// .....
}

func (s *svc) UserInfo(ctx context.Context, id string) (*User, error) {
    u, err := s.db.GetUser(ctx, id)
    if err != nil {
        return nil, err
    }
    return s.userFromModel(u)
}

//где-то в поддиректории database:

package database

import (
    "context"
    "myprject/internal/model"
)

func New(connectionString string, .......) (MyDatabase, error) {
    // ......
    return &db{/*......*/}, nil
}

type MyDatabase interface {
    GetUser() (*model.User, error)
}

type db struct {
    // 
}

// где-то в начале иерархии

package main

import (
    "context"
    "log"
    "myprject/internal/database"
    "myprject/internal/services/users"
)

func main() {
    db, err := database.New(config.connectionString, ......)
    if err != nil {
        log.Fatal(err)
    }
    usersSvc := users.New(db)
 
    u, err := usersSvc.UserInfo(context.TODO(), uid)
    if err != nil {
         log.Fatal(err)
    }
    log.Println(u.String())
}
Спасибо за внимание
Отредактировано 02.01.2024 8:31 Doom100500 . Предыдущая версия .
Re: Практики разбивки проекта на пакеты
От: savitar  
Дата: 05.01.24 18:21
Оценка:
Здравствуйте, a9000, Вы писали:

A>...


https://github.com/golang-standards/project-layout
Re[2]: Практики разбивки проекта на пакеты
От: Разраб  
Дата: 17.01.24 06:53
Оценка:
Здравствуйте, savitar, Вы писали:

S>Здравствуйте, a9000, Вы писали:


A>>...


S>https://github.com/golang-standards/project-layout


Некоторые проекты на Go имеют директорию src, но это обычно происходит,
когда разработкой занялся человек, пришедший из мира Java,
где такой подход весьма распространен.
Постарайтесь не использовать этот Java паттерн.

Вы же не хотите, чтобы ваш код на Go или Go проект выглядел, будто написан на Java.

☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.