จากบทความก่อนหน้านี้ ที่เอา Go-Fiber มาดุ้ยๆๆๆ เขียนโค้ดแบบ ไม่รู้่สี่รู้แปดไป พบว่า อีเหี้ยยยย เขียน unit test ยากเหลือเกิน ห่าลากกกกกกกกกกก เลยรื้อใหม่ทั้งหมด แล้วไปวาง Project Layout ใหม่ เป็นแบบ Clean Code ตามลุง Bob พบว่าชีวิตดีขึ้นเวลาเขียน unit test ประกอบกับสั่ง Keyboard ใหม่มาเขียน Code ด้วย Code เลยเป็นระเบียบมากๆ โดยพระเอกของงานนี้ก็เจ้านี่เลย ไม่ได้ค่าโฆษณานะ แสรดดด
สั่งมาจากนี่เลย keychronthailand โดยอยากได้แบบส่ง ด่วน จ ี๋ๆ ก็ทำการ Add line ไปที่ https://lin.ee/12IAInJ
ทีแรกอยากได้ K4 แม่งหมด ห่านนนนน!!! ไม่เป็นไรกด K3 มาแทน packaging สวยสด งดงามคุ้มค่าทีเดียว
เมื่อเปิดกล่องออกมาจะเจอวิธีใช้งาน
และแถม key สำหรับเปลี่ยนถ้าใช้กับ windows มาให้แงะเปลี่ยนกันด้วย
มีฝาปิดกันฝุ่นมาให้อย่างดี เหมาะกับเวลาที่เขียน Code ไม่เสร็จ แล้วค่อยมาทำวันอื่นต่อ (ไม่เกี่ยว สัส)
เชรดดด เขร้ มีไฟด้วย ไม่เคยใช้ keyboard แบบมีไฟมาก่อนเลย อยากทำงานตอนกลางคืนแล้วเนี่ย ฮาๆๆๆๆๆ
พอแกะกล่องเสร็จก็ลงมือ เขียน code project ที่แล้วใหม่หมดเลย พบว่ามีอาการพิมพ์ผิดๆๅถูกๆอยู่บ้าง เพราะไม่ชินกับ keyboard layout
โดย Project ที่แล้วเนี่ย เราจะใช้ Go-Fiber แต่เราวางโครงสร้างแบบ มั่วชิบหายวายป่วง พอถึงคราวต้องมาเขียน Test ก็เลยงึดดิคร้าบบบบ
รอบนี้เราจะเอาใหม่ โดยเราจะทำการวางโครงสร้าง Project ทั้งหมดตามลุง Bob https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
.├── app.env├── cmd│ ├── go-dev.Dockerfile│ ├── main.go│ ├── main_test.go│ └── tmp│ ├── build-errors.log│ └── main├── config│ ├── config.go│ └── config_test.go├── cover.html├── cover.out├── databases│ ├── database.go│ └── database_test.go├── deliveries│ ├── role_delivery.go│ ├── role_delivery_test.go│ ├── system_delivery.go│ └── system_delivery_test.go├── docs│ ├── Install.http│ ├── Login.http│ └── User.http├── domains│ ├── module_domain.go│ ├── role_domain.go│ └── system_domain.go├── go-dev.Dockerfile├── go.mod├── go.sum├── helpers│ ├── msg_helper.go│ └── msg_helper_test.go├── mocks│ ├── ModuleRepository.go│ ├── ModuleUseCase.go│ ├── RoleRepository.go│ ├── RoleUseCase.go│ ├── SystemRepository.go│ └── SystemUseCase.goบ├── models│ ├── model_test.go│ ├── module_model.go│ ├── permission_model.go│ ├── role_model.go│ ├── system_model.go│ └── user_model.go├── repositories│ ├── module_repository.go│ ├── module_repository_test.go│ ├── role_repository.go│ ├── role_repository_test.go│ ├── system_repository.go│ └── system_repository_test.go├── routes│ ├── installation_route.go│ ├── installation_route_test.go│ ├── role_route.go│ ├── role_route_test.go│ └── route.go└── usecases├── module_usecase.go├── module_usecase_test.go├── role_usecase.go├── role_usecase_test.go├── system_usecase.go└── system_usecase_test.go
โดยทดลองวางโครงสร้างใหม่ตาม layout ข้างบนดูซึ่งจะไม่ตรงกับ concept ของลุงซะทีเดียว เอาสะดวกผมเข้าว่า
โดย
พอทำการแยก layout ออกมาตามนี้แล้ว ทำให้สามารถเขียน unit test ให้ coverage ได้เกือบๆ 100% เลยทีเดียว
go test -coverprofile cover.out ./... && go tool cover -html=cover.out -o cover.html ✔ 10107 14:46:57ok github.com/aofiee/barroth/cmd 1.709s coverage: 45.8% of statementsok github.com/aofiee/barroth/config 0.870s coverage: 100.0% of statementsok github.com/aofiee/barroth/databases 1.195s coverage: 100.0% of statementsok github.com/aofiee/barroth/deliveries 2.323s coverage: 50.0% of statements? github.com/aofiee/barroth/domains [no test files]ok github.com/aofiee/barroth/helpers 1.417s coverage: 100.0% of statements? github.com/aofiee/barroth/mocks [no test files]ok github.com/aofiee/barroth/models 0.574s coverage: 100.0% of statementsok github.com/aofiee/barroth/repositories 2.041s coverage: 100.0% of statementsok github.com/aofiee/barroth/routes 2.483s coverage: 96.3% of statementsok github.com/aofiee/barroth/usecases 2.621s coverage: 100.0% of statements
เหมือนเดิม code ทั้งหมดที่ทดลองเขียน จะอยู่ที่ https://github.com/aofiee/golang-clean-architecture
Quick Links
Legal Stuff