Что такое SOLID · Golang Backend — JobPilot

Что такое SOLID

Golang Backend · 19%
Вопрос 2927 / #
Пример ответа

Коротко: SOLID — это набор из пяти принципов объектно-ориентированного проектирования, которые я применяю для создания поддерживаемого, масштабируемого и гибкого кода, особенно в Go, где они адаптируются через интерфейсы и композицию.

Ключевые идеи:
  • Single Responsibility: каждый модуль или структура должна иметь одну причину для изменения, что упрощает тестирование и рефакторинг.
  • Open/Closed: сущности должны быть открыты для расширения, но закрыты для модификации, достигается через интерфейсы в Go.
  • Liskov Substitution: объекты должны заменяться экземплярами подтипов без нарушения работы программы, что важно для полиморфизма в Go.
Пример: В Go я реализую Open/Closed через интерфейсы: например, интерфейс PaymentProcessor с методами Process и Refund, позволяющий добавлять новые платёжные системы без изменения существующего кода.
Пример применения Single Responsibility и Dependency Inversion в Go для обработки заказов
go
package main

import "fmt"

// Order представляет заказ
type Order struct {
    ID    string
    Total float64
}

// OrderRepository интерфейс для принципа Dependency Inversion
type OrderRepository interface {
    Save(order Order) error
}

// MySQLOrderRepository реализация для MySQL
type MySQLOrderRepository struct{}

func (r MySQLOrderRepository) Save(order Order) error {
    fmt.Printf("Сохранение заказа %s в MySQL\n", order.ID)
    return nil
}

// OrderService отвечает только за бизнес-логику (Single Responsibility)
type OrderService struct {
    repo OrderRepository
}

func NewOrderService(repo OrderRepository) *OrderService {
    return &OrderService{repo: repo}
}

func (s *OrderService) CreateOrder(order Order) error {
    // Бизнес-логика, например, валидация
    if order.Total <= 0 {
        return fmt.Errorf("неверная сумма заказа")
    }
    return s.repo.Save(order)
}

func main() {
    repo := MySQLOrderRepository{}
    service := NewOrderService(repo)
    order := Order{ID: "123", Total: 100.0}
    if err := service.CreateOrder(order); err != nil {
        fmt.Println("Ошибка:", err)
    }
}
Вопросы для интервьюера:
  • Как вы применяете SOLID в Go, учитывая отсутствие наследования?Использую композицию и интерфейсы: например, Dependency Inversion через внедрение зависимостей в структуры, что делает код тестируемым и гибким.
  • Какие сложности возникают при внедрении SOLID в микросервисах на Go?Может увеличиться количество интерфейсов и структур, но это окупается лёгкостью поддержки и изоляцией сервисов, что критично для микросервисной архитектуры.
Практический совет (на неделю):
  1. Начните с Single Responsibility: разбейте крупные функции на меньшие, отвечающие за одну задачу, и используйте интерфейсы для абстракции.
  2. Практикуйте Dependency Inversion в тестах: мокируйте зависимости через интерфейсы для unit-тестирования без реальных баз данных или внешних сервисов.
Golang Backend
Общий
19%
Навигация
В чем разница между генератором и итератором
Предыдущий: В чем разница между генератором и итератором

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