Tiêu chuẩn Kỹ thuật: Kiến trúc HOWL (Pragmatic Style)
Dự án top1server từ bỏ mọi triết lý “Clean Architecture” rườm rà. Chúng ta hướng đến sự Tàn nhẫn, Trực diện và Đặt cấu trúc dữ liệu lên làm Chúa tể. Dưới đây là những nguyên tắc bắt buộc khi đóng góp mã nguồn.
1. Trụ cột 1: Cấu trúc Dữ liệu là Vua
Đừng viết hàm if/else trước. Hãy thiết kế dữ liệu trước. Nếu Struct/Schema đủ tốt, code xử lý sẽ trở nên hiển nhiên.
Ví dụ về Thiết kế Dữ liệu:
// Tốt: Dữ liệu gom cụm rõ ràng, kiểu dữ liệu nguyên thủy
type Comment struct {
ID int
PostSlug string
Content string
CreatedAt string
}
2. Trụ cột 2: Code Phẳng (Return Early)
Kẻ thù lớn nhất của sự đọc hiểu là việc lồng ghép (Nesting). Code phải chảy theo một đường thẳng. Lỗi phát sinh? Ném ra ngay lập tức và kết thúc.
❌ Cách viết RÁC RƯỞI (Màu mè, lồng ghép):
func handlePostComment(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
content := r.FormValue("content")
if content != "" {
// Lưu vào DB
w.Write([]byte("Thành công"))
} else {
w.Write([]byte("Lỗi rỗng"))
}
} else {
w.Write([]byte("Sai method"))
}
}
✅ Cách viết CỦA TÔI (Return Early):
func handlePostComment(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
w.Write([]byte("Sai method"))
return // Bắn bỏ ngay lập tức
}
content := r.FormValue("content")
if content == "" {
w.Write([]byte("Lỗi rỗng"))
return // Bắn bỏ
}
// Happy Path (Con đường màu hồng nằm tự do dưới cùng)
DB.Exec("INSERT INTO comments (content) VALUES (?)", content)
w.Write([]byte("Thành công"))
}
3. Trụ cột 3: Chạm trực tiếp vào Kim loại (Bare-Metal)
Không tạo các lớp trừu tượng (Interface, Repository) khi chỉ có ĐÚNG MỘT cơ sở dữ liệu.
❌ Cách viết RÁC RƯỞI (Clean Architecture lố bịch):
// Phải lội qua 3 file mới gọi được DB
comment := usecase.CreateComment(...)
repo.Save(comment)
✅ Cách viết CỦA TÔI (Pragmatic / Thực dụng):
// Ném thẳng câu lệnh SQL vào mặt Database ngay trong hàm xử lý
DB.Exec("INSERT INTO comments (post_slug, content) VALUES (?, ?)", slug, content)
- Lý do: Bạn thấy ngay truy vấn sẽ làm gì. Cần Index ở đâu. Code ngắn gọn, dễ sửa. Khi cần đổi DB, vác dao vào sửa câu SQL mất 5 giây, nhanh hơn việc bảo trì mớ Interface trong 5 năm.
Cấu trúc Dự án
Dự án được tối giản hóa tới mức không thể xóa thêm một file nào nữa:
/t1s/
├── backend/ # Bộ não API
│ ├── database.go # Cấu trúc dữ liệu & Kết nối SQLite
│ └── server.go # HTTP Handler & Logic xử lý (Gộp chung)
├── content/posts/ # Nơi lưu trữ bài viết (.md)
├── layouts/ # Giao diện tĩnh (Hugo HTML)
├── nginx/ # Cấu hình Web Server
└── hugo.toml # Cấu hình Hugo
Không có usecase, không có repository. Mọi thứ là đường thẳng.
Bình luận