Bu derste, Go dilinde Clean Architecture (Temiz Mimari) prensiplerini nasıl uygulayabileceğinizi öğreneceksiniz. Clean Architecture, yazılım projelerinde bağımlılıkları minimize ederek daha sürdürülebilir ve test edilebilir kod yazmayı amaçlar.
Clean Architecture, Robert C. Martin (Uncle Bob) tarafından ortaya atılan bir yazılım mimarisi prensibidir. Bu prensip, yazılım projelerinde bağımlılıkları minimize ederek daha sürdürülebilir ve test edilebilir kod yazmayı amaçlar. Clean Architecture, dört ana katmandan oluşur:
Varlıklar, iş kurallarını ve nesnelerini içerir. Bu katman, uygulamanın en iç katmanıdır ve diğer katmanlardan bağımsızdır.
Kullanım durumları, uygulamanın iş mantığını içerir. Bu katman, varlıklar katmanına bağımlıdır ancak arayüz adaptörleri ve çerçeveler katmanına bağımlı değildir.
Arayüz adaptörleri, veri ve iş mantığı arasındaki dönüşümleri içerir. Bu katman, kullanım durumları katmanına bağımlıdır ve çerçeveler katmanına veri sağlar.
Çerçeveler ve sürücüler, dış bağımlılıkları içerir. Bu katman, en dış katmandır ve diğer katmanlara bağımlıdır.
Go dilinde Clean Architecture uygulamak için, her katmanı ayrı bir paket olarak organize edebilirsiniz. Örneğin:
/entities
/user.go
/usecases
/user_usecase.go
/interfaces
/user_controller.go
/user_presenter.go
/frameworks
/database
/user_repository.go
/web
/router.go
Aşağıda, Go dilinde Clean Architecture prensiplerini uygulayan basit bir kullanıcı yönetim sistemi örneği bulunmaktadır.
package entities
type User struct {
ID int
Name string
Email string
}
package usecases
import "example.com/project/entities"
type UserUseCase struct {
UserRepository UserRepository
}
func (uc *UserUseCase) CreateUser(name, email string) (*entities.User, error) {
user := &entities.User{
Name: name,
Email: email,
}
err := uc.UserRepository.Save(user)
if err != nil {
return nil, err
}
return user, nil
}
type UserRepository interface {
Save(user *entities.User) error
}
package interfaces
import (
"example.com/project/usecases"
"net/http"
)
type UserController struct {
UserUseCase usecases.UserUseCase
}
func (uc *UserController) CreateUser(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("name")
email := r.FormValue("email")
user, err := uc.UserUseCase.CreateUser(name, email)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
w.Write([]byte("User created: " + user.Name))
}
package database
import (
"example.com/project/entities"
"errors"
)
type UserRepository struct {
users map[int]*entities.User
}
func NewUserRepository() *UserRepository {
return &UserRepository{
users: make(map[int]*entities.User),
}
}
func (repo *UserRepository) Save(user *entities.User) error {
if user.ID == 0 {
user.ID = len(repo.users) + 1
}
repo.users[user.ID] = user
return nil
}
package web
import (
"example.com/project/interfaces"
"net/http"
)
func NewRouter(userController *interfaces.UserController) *http.ServeMux {
router := http.NewServeMux()
router.HandleFunc("/users", userController.CreateUser)
return router
}
Bu örnek proje, Go dilinde Clean Architecture prensiplerini uygulayarak basit bir kullanıcı yönetim sistemi oluşturur. Bu yapı, kodun daha sürdürülebilir, test edilebilir ve genişletilebilir olmasını sağlar.