SlideShare a Scribd company logo
1 of 51
Download to read offline
Clean Code
Trở thành một Lập trình viên tốt hơn
Nguyễn Khắc Nhật
| Agile | Scrum | Kanban | Lean | Java | Scala | Typescript | NodeJS | Bobril | Angular
• Giảng viên
• Lập trình viên
• Chuyên gia Agile, Scrum, Kanban
• Đồng tác giả sách “Cẩm nang Scrum”
• Đồng sáng lập Học viện Agile
• Đồng sáng lập CodeGym
Bạn đã bao giờ?
• Đọc lại những dòng code của mình và tự hỏi:
• Đứa nào code vậy? Đoạn này nghĩa là thế nào đây?
• Code chỗ này nhưng lại phát sinh bug ở chỗ kia?
• Càng code thì hệ thống càng chậm?
• Thậm chí đến một lúc nó còn không chạy được
• Đọc mã nguồn của các hệ thống mã nguồn mở và không hiểu gì?
• Phải viết thêm nhiều câu chú thích trong code của mình?
• Bởi vì nếu không thì không ai hiểu chúng đang làm gì
• Cố gắng viết mã nguồn ngắn nhất có thể, bởi vì như thế mới là xịn?
• Mà không biết rằng chúng rất khó hiểu
Bạn có đang?
• Tự hào về những dòng code mà mình viết ra?
• Hay là chỉ muốn giấu diếm chúng, không muốn ai nhìn thấy?
• Cố gắng dành thời gian để trau chuốt những dòng code?
• Hay là code cho chúng chạy được là tốt rồi?
• Viết code một cách bài bản?
• Hay theo chiến thuật code-and-fix?
Những hình ảnh thường thấy
Bạn viết code như thế nào?
Quy trình thường thấy
Ban đầu
Quy trình thường thấy
Hệ thống đẹp
Quy trình thường thấy
Thêm tính năng mới
Quy trình thường thấy
Thêm một tính năng mới
Quy trình thường thấy
Thay đổi một tính năng
Thời gian trôi qua…
Kết quả thường thấy
Bạn có thấy quen thuộc không?
Kết quả thường thấy
Làm thế
nào để
code tiếp?
Bạn có thấy quen thuộc không?
Cách làm đúng
Ban đầu
Cách làm đúng
Hệ thống đẹp
Thêm tính năng mới
Cách làm đúng
Dọn dẹp sạch sẽ
Cách làm đúng
Cách làm đúng
Thêm tính năng mới
Cách làm đúng
Dọn dẹp sạch sẽ
Thời gian trôi qua…
Kết quả cần có
Kiến trúc sạch
Về năng suất thì sao?
`
Thời gian
Năng suất
`
Code bẩn
Code sạch
Clean Code là gì?
• Clean Code là tiêu chuẩn của code “tốt”
• Code như thế nào thì được coi là tốt?
Grady Booch
Object Oriented Analysis
Dave Thomas
OTI, Eclipse
Michael Feathers
Working effectively with Legacy Code
Ron Jeffries
Extreme Programming Installed
Extreme Programing Adventures in C#
• Đơn giản
• Trực tiếp
• Dễ đọc hiểu
• Có ít phụ thuộc
• Không có code lặp
• Chạy tất cả các bài kiểm thử
• Không làm mờ đi ý định của người viết
• Giống một bài văn hay
• Giống như là được viết ra bởi một người rất có tâm
Clean Code
Smell Code
• Đặt tên vô nghĩa
• Phương thức quá dài
• Lớp quá dài
• Phương thức xử lý quá nhiều việc
• Phương thức có quá nhiều tham số
• Lạm dụng quá nhiều ghi chú (comment) trong mã nguồn
• Mã nguồn bị trùng lặp
• Sử dụng các giá trị magic
Clean Code ở đâu?
Định danh Hàm Ghi chú
Định dạng
Đối tượng & Lớp
Xử lý lỗi Kiểm thử
Kiến trúc
Clean Code thì được gì?
• Cộng tác dễ dàng hơn
• Debug dễ dàng hơn
• Ít rủi ro hơn
• Năng suất hơn
• Đi được đường dài hơn
• Hạnh phúc hơn
Làm sao để có Clean Code?
• Phải nắm tiêu chuẩn
• Phải biết mục đích
• Phải làm việc với tinh thần phục vụ
• Khác với làm cho xong việc
• Phải học các pattern (nhận diện code thối)
• Phải học các dọn dẹp code (refactor)
Một số ví dụ
Đặt tên có ý nghĩa và đọc được (1)
• Không tốt:
• Tốt:
String yyyymmdstr = new SimpleDateFormat("YYYY/MM/DD").format(new Date());
String currentDate = new SimpleDateFormat("YYYY/MM/DD").format(new Date());
Đặt tên có ý nghĩa và đọc được (2)
• Không tốt • Tốt
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
Đặt tên đồng nhất khi có cùng ý nghĩa
• Không tốt:
• Tốt:
getUserInfo();
getClientData();
getCustomerRecord();
getUser();
Đặt tên để tìm kiếm được
• Không tốt:
• Tốt:
setTimeout(blastOff, 86400000);
public static final int MILLISECONDS_IN_A_DAY = 86400000;
setTimeout(blastOff, MILLISECONDS_IN_A_DAY);
Đặt tên để tự giải thích ý nghĩa
• Không tốt:
• Tốt:
Application application = new Application();
//...
if(application.getStatus() == "paid") {
//...
}
Application application = new Application();
//...
if(application.isPaid()) {
//...
}
Không thêm các ngữ cảnh thừa
• Không tốt: • Tốt:
class Car {
public String carMake = "Honda";
public String carModel = "Accord";
public String carColor = "Blue";
}
void paintCar(Car car) {
car.carColor = "Red";
}
class Car {
public String make = "Honda";
public String model = "Accord";
public String color = "Blue";
}
void paintCar(Car car) {
car.color = "Red";
}
Mỗi hàm chỉ nên làm một việc
• Không tốt: • Tốt:
public void emailClients(List<Client> clients) {
for (Client client : clients) {
Client clientRecord = repository.findOne(client.getId());
if (clientRecord.isActive()){
email(client);
}
}
}
public void emailClients(List<Client> clients) {
for (Client client : clients) {
if (isActiveClient(client)) {
email(client);
}
}
}
private boolean isActiveClient(Client client) {
Client clientRecord = repository.findOne(client.getId());
return clientRecord.isActive();
}
Tên hàm cần có ý nghĩa
• Không tốt: • Tốt:
private void addToDate(Date date, int month){
//..
}
Date date = new Date();
addToDate(date, 1);
private void addMonthToDate(Date date, int month){
//..
}
Date date = new Date();
addMonthToDate(1, date);
DEMO
Bộ các kỹ thuật liên quan
• Clean Code
• Tiêu chuẩn chất lượng
• Code Refactoring
• Cách để có được Clean Code
• Automation Test
• Đảm bảo an toàn khi refactor
• Design Pattern
• Tiêu chuẩn chất lượng cao hơn
Tham gia các cộng đồng
Coding Dojo
Coderetreat
Clean code - Trở thành một lập trình viên tốt hơn

More Related Content

What's hot

Tài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoTài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoZendVN
 
Bài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmBài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmHoài Phạm
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtMôi Trường Việt
 
Ứng dụng công cụ test tự động kiểm thử website
Ứng dụng công cụ test tự động kiểm thử websiteỨng dụng công cụ test tự động kiểm thử website
Ứng dụng công cụ test tự động kiểm thử websiteDotnet Open Group
 
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀM
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀMTÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀM
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀMNguyễn Anh
 
Kỹ năng ra quyết định
Kỹ năng ra quyết địnhKỹ năng ra quyết định
Kỹ năng ra quyết địnhTạ Minh Tân
 
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGTrường Phạm
 
Bài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu SốBài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu Sốviethung094
 
Lập trình Python GUI vs PySide
Lập trình Python GUI vs PySideLập trình Python GUI vs PySide
Lập trình Python GUI vs PySideChien Dang
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Linh Nguyen
 
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTSlide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTHiệu Nguyễn
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinVõ Phúc
 
Oop unit 13 tổng quan về uml
Oop unit 13 tổng quan về umlOop unit 13 tổng quan về uml
Oop unit 13 tổng quan về umlTráng Hà Viết
 
Công nghệ phần mềm chuong 1
Công nghệ phần mềm chuong 1Công nghệ phần mềm chuong 1
Công nghệ phần mềm chuong 1laducqb
 
Tài liệu tổng kểt môn mạng máy tính
Tài liệu tổng kểt môn mạng máy tínhTài liệu tổng kểt môn mạng máy tính
Tài liệu tổng kểt môn mạng máy tínhJojo Kim
 
Giao trinh c++ aptech
Giao trinh c++ aptechGiao trinh c++ aptech
Giao trinh c++ aptechTấn Nhật
 
Đồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmĐồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmNguyễn Anh
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Nhóc Nhóc
 
chuong 3. quan he
chuong 3. quan hechuong 3. quan he
chuong 3. quan hekikihoho
 

What's hot (20)

Tài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoTài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng cao
 
Bài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmBài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần Mềm
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 
Ứng dụng công cụ test tự động kiểm thử website
Ứng dụng công cụ test tự động kiểm thử websiteỨng dụng công cụ test tự động kiểm thử website
Ứng dụng công cụ test tự động kiểm thử website
 
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀM
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀMTÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀM
TÌM HIỂU CÁC KỸ THUẬT KIỂM THỬ PHẦN MỀM
 
Kỹ năng ra quyết định
Kỹ năng ra quyết địnhKỹ năng ra quyết định
Kỹ năng ra quyết định
 
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
 
Bài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu SốBài Tập Xử Lí Tín Hiệu Số
Bài Tập Xử Lí Tín Hiệu Số
 
Lập trình Python GUI vs PySide
Lập trình Python GUI vs PySideLập trình Python GUI vs PySide
Lập trình Python GUI vs PySide
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)
 
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTSlide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tin
 
Oop unit 13 tổng quan về uml
Oop unit 13 tổng quan về umlOop unit 13 tổng quan về uml
Oop unit 13 tổng quan về uml
 
Công nghệ phần mềm chuong 1
Công nghệ phần mềm chuong 1Công nghệ phần mềm chuong 1
Công nghệ phần mềm chuong 1
 
Tài liệu tổng kểt môn mạng máy tính
Tài liệu tổng kểt môn mạng máy tínhTài liệu tổng kểt môn mạng máy tính
Tài liệu tổng kểt môn mạng máy tính
 
Giao trinh c++ aptech
Giao trinh c++ aptechGiao trinh c++ aptech
Giao trinh c++ aptech
 
Chia subnetmask
Chia subnetmaskChia subnetmask
Chia subnetmask
 
Đồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềmĐồ án kiểm thử phần mềm
Đồ án kiểm thử phần mềm
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05
 
chuong 3. quan he
chuong 3. quan hechuong 3. quan he
chuong 3. quan he
 

Similar to Clean code - Trở thành một lập trình viên tốt hơn

Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?Nhật Nguyễn Khắc
 
How to write good code
How to write good code How to write good code
How to write good code Minh Hoang
 
An Introduction to get a Job in Tech Industry in Japan
An Introduction to get a Job in Tech Industry in JapanAn Introduction to get a Job in Tech Industry in Japan
An Introduction to get a Job in Tech Industry in JapanTrung Vu
 
Hành trình trở thành web đì ve lốp pơ
Hành trình trở thành web đì ve lốp pơHành trình trở thành web đì ve lốp pơ
Hành trình trở thành web đì ve lốp pơHuy Hoàng Phạm
 
Itlc2015
Itlc2015Itlc2015
Itlc2015Huy Do
 
Nhập môn BDD
Nhập môn BDDNhập môn BDD
Nhập môn BDDNgoc Dao
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain softwareVKhang Yang
 
[Cntt] bài giảng java khtn hcm
[Cntt] bài giảng java   khtn hcm[Cntt] bài giảng java   khtn hcm
[Cntt] bài giảng java khtn hcmHong Phuoc Nguyen
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?ITguru.vn
 
Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892HaiNguyen870
 
Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)Hong Le Van
 
Câu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfCâu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfGrowup Work
 
Seminar clean code
Seminar clean codeSeminar clean code
Seminar clean codeNguyen Thieu
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Da To
 

Similar to Clean code - Trở thành một lập trình viên tốt hơn (20)

Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?Livestream - Học lập trình là học gì?
Livestream - Học lập trình là học gì?
 
How to write good code
How to write good code How to write good code
How to write good code
 
An Introduction to get a Job in Tech Industry in Japan
An Introduction to get a Job in Tech Industry in JapanAn Introduction to get a Job in Tech Industry in Japan
An Introduction to get a Job in Tech Industry in Japan
 
Hành trình trở thành web đì ve lốp pơ
Hành trình trở thành web đì ve lốp pơHành trình trở thành web đì ve lốp pơ
Hành trình trở thành web đì ve lốp pơ
 
Itlc2015
Itlc2015Itlc2015
Itlc2015
 
Nhập môn BDD
Nhập môn BDDNhập môn BDD
Nhập môn BDD
 
Automation Testing & TDD
Automation Testing & TDDAutomation Testing & TDD
Automation Testing & TDD
 
Tdd in action
Tdd in actionTdd in action
Tdd in action
 
Slide offline SEO Hà Nội Cùng ThuyCuong
Slide offline SEO Hà Nội Cùng ThuyCuongSlide offline SEO Hà Nội Cùng ThuyCuong
Slide offline SEO Hà Nội Cùng ThuyCuong
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain software
 
[Cntt] bài giảng java khtn hcm
[Cntt] bài giảng java   khtn hcm[Cntt] bài giảng java   khtn hcm
[Cntt] bài giảng java khtn hcm
 
Pbc day-01-introduction
Pbc day-01-introductionPbc day-01-introduction
Pbc day-01-introduction
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
 
Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892Chuanmanguon 151124092923-lva1-app6892
Chuanmanguon 151124092923-lva1-app6892
 
Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)Coding Standard (Chuẩn Mã Nguồn)
Coding Standard (Chuẩn Mã Nguồn)
 
Code convention
Code conventionCode convention
Code convention
 
Câu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfCâu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdf
 
Seminar clean code
Seminar clean codeSeminar clean code
Seminar clean code
 
Introduction to coding dojo
Introduction to coding dojoIntroduction to coding dojo
Introduction to coding dojo
 
Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++Ngon ngu lap_trinh_c++
Ngon ngu lap_trinh_c++
 

More from Nhật Nguyễn Khắc

Livestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trìnhLivestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trìnhNhật Nguyễn Khắc
 
Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020Nhật Nguyễn Khắc
 
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018Nhật Nguyễn Khắc
 

More from Nhật Nguyễn Khắc (7)

Reflective Learning
Reflective LearningReflective Learning
Reflective Learning
 
Livestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trìnhLivestream - Nhật ký học lập trình
Livestream - Nhật ký học lập trình
 
Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020Hội thảo nghề nghiệp tại CodeGym 6/6/2020
Hội thảo nghề nghiệp tại CodeGym 6/6/2020
 
WHY DO WE REPORT?
WHY DO WE REPORT?WHY DO WE REPORT?
WHY DO WE REPORT?
 
Live stream: Học lập trình
Live stream: Học lập trìnhLive stream: Học lập trình
Live stream: Học lập trình
 
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
Agile Education - Classroms need Agility - Agile Vietnam Conference 2018
 
Clean code coding like a professional
Clean code   coding like a professionalClean code   coding like a professional
Clean code coding like a professional
 

Clean code - Trở thành một lập trình viên tốt hơn

  • 1. Clean Code Trở thành một Lập trình viên tốt hơn Nguyễn Khắc Nhật
  • 2. | Agile | Scrum | Kanban | Lean | Java | Scala | Typescript | NodeJS | Bobril | Angular • Giảng viên • Lập trình viên • Chuyên gia Agile, Scrum, Kanban • Đồng tác giả sách “Cẩm nang Scrum” • Đồng sáng lập Học viện Agile • Đồng sáng lập CodeGym
  • 3. Bạn đã bao giờ? • Đọc lại những dòng code của mình và tự hỏi: • Đứa nào code vậy? Đoạn này nghĩa là thế nào đây? • Code chỗ này nhưng lại phát sinh bug ở chỗ kia? • Càng code thì hệ thống càng chậm? • Thậm chí đến một lúc nó còn không chạy được • Đọc mã nguồn của các hệ thống mã nguồn mở và không hiểu gì? • Phải viết thêm nhiều câu chú thích trong code của mình? • Bởi vì nếu không thì không ai hiểu chúng đang làm gì • Cố gắng viết mã nguồn ngắn nhất có thể, bởi vì như thế mới là xịn? • Mà không biết rằng chúng rất khó hiểu
  • 4. Bạn có đang? • Tự hào về những dòng code mà mình viết ra? • Hay là chỉ muốn giấu diếm chúng, không muốn ai nhìn thấy? • Cố gắng dành thời gian để trau chuốt những dòng code? • Hay là code cho chúng chạy được là tốt rồi? • Viết code một cách bài bản? • Hay theo chiến thuật code-and-fix?
  • 5. Những hình ảnh thường thấy
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. Bạn viết code như thế nào?
  • 12. Quy trình thường thấy Ban đầu
  • 13. Quy trình thường thấy Hệ thống đẹp
  • 14. Quy trình thường thấy Thêm tính năng mới
  • 15. Quy trình thường thấy Thêm một tính năng mới
  • 16. Quy trình thường thấy Thay đổi một tính năng
  • 18. Kết quả thường thấy Bạn có thấy quen thuộc không?
  • 19. Kết quả thường thấy Làm thế nào để code tiếp? Bạn có thấy quen thuộc không?
  • 21. Cách làm đúng Hệ thống đẹp
  • 22. Thêm tính năng mới Cách làm đúng
  • 23. Dọn dẹp sạch sẽ Cách làm đúng
  • 24. Cách làm đúng Thêm tính năng mới
  • 25. Cách làm đúng Dọn dẹp sạch sẽ
  • 27. Kết quả cần có Kiến trúc sạch
  • 28. Về năng suất thì sao? ` Thời gian Năng suất ` Code bẩn Code sạch
  • 30. • Clean Code là tiêu chuẩn của code “tốt” • Code như thế nào thì được coi là tốt?
  • 31. Grady Booch Object Oriented Analysis Dave Thomas OTI, Eclipse Michael Feathers Working effectively with Legacy Code Ron Jeffries Extreme Programming Installed Extreme Programing Adventures in C#
  • 32. • Đơn giản • Trực tiếp • Dễ đọc hiểu • Có ít phụ thuộc • Không có code lặp • Chạy tất cả các bài kiểm thử • Không làm mờ đi ý định của người viết • Giống một bài văn hay • Giống như là được viết ra bởi một người rất có tâm Clean Code
  • 33. Smell Code • Đặt tên vô nghĩa • Phương thức quá dài • Lớp quá dài • Phương thức xử lý quá nhiều việc • Phương thức có quá nhiều tham số • Lạm dụng quá nhiều ghi chú (comment) trong mã nguồn • Mã nguồn bị trùng lặp • Sử dụng các giá trị magic
  • 34. Clean Code ở đâu? Định danh Hàm Ghi chú Định dạng Đối tượng & Lớp Xử lý lỗi Kiểm thử Kiến trúc
  • 35. Clean Code thì được gì? • Cộng tác dễ dàng hơn • Debug dễ dàng hơn • Ít rủi ro hơn • Năng suất hơn • Đi được đường dài hơn • Hạnh phúc hơn
  • 36. Làm sao để có Clean Code? • Phải nắm tiêu chuẩn • Phải biết mục đích • Phải làm việc với tinh thần phục vụ • Khác với làm cho xong việc • Phải học các pattern (nhận diện code thối) • Phải học các dọn dẹp code (refactor)
  • 38. Đặt tên có ý nghĩa và đọc được (1) • Không tốt: • Tốt: String yyyymmdstr = new SimpleDateFormat("YYYY/MM/DD").format(new Date()); String currentDate = new SimpleDateFormat("YYYY/MM/DD").format(new Date());
  • 39. Đặt tên có ý nghĩa và đọc được (2) • Không tốt • Tốt public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; } public List<int[]> getFlaggedCells() { List<int[]> flaggedCells = new ArrayList<int[]>(); for (int[] cell : gameBoard) if (cell[STATUS_VALUE] == FLAGGED) flaggedCells.add(cell); return flaggedCells; }
  • 40. Đặt tên đồng nhất khi có cùng ý nghĩa • Không tốt: • Tốt: getUserInfo(); getClientData(); getCustomerRecord(); getUser();
  • 41. Đặt tên để tìm kiếm được • Không tốt: • Tốt: setTimeout(blastOff, 86400000); public static final int MILLISECONDS_IN_A_DAY = 86400000; setTimeout(blastOff, MILLISECONDS_IN_A_DAY);
  • 42. Đặt tên để tự giải thích ý nghĩa • Không tốt: • Tốt: Application application = new Application(); //... if(application.getStatus() == "paid") { //... } Application application = new Application(); //... if(application.isPaid()) { //... }
  • 43. Không thêm các ngữ cảnh thừa • Không tốt: • Tốt: class Car { public String carMake = "Honda"; public String carModel = "Accord"; public String carColor = "Blue"; } void paintCar(Car car) { car.carColor = "Red"; } class Car { public String make = "Honda"; public String model = "Accord"; public String color = "Blue"; } void paintCar(Car car) { car.color = "Red"; }
  • 44. Mỗi hàm chỉ nên làm một việc • Không tốt: • Tốt: public void emailClients(List<Client> clients) { for (Client client : clients) { Client clientRecord = repository.findOne(client.getId()); if (clientRecord.isActive()){ email(client); } } } public void emailClients(List<Client> clients) { for (Client client : clients) { if (isActiveClient(client)) { email(client); } } } private boolean isActiveClient(Client client) { Client clientRecord = repository.findOne(client.getId()); return clientRecord.isActive(); }
  • 45. Tên hàm cần có ý nghĩa • Không tốt: • Tốt: private void addToDate(Date date, int month){ //.. } Date date = new Date(); addToDate(date, 1); private void addMonthToDate(Date date, int month){ //.. } Date date = new Date(); addMonthToDate(1, date);
  • 46. DEMO
  • 47. Bộ các kỹ thuật liên quan • Clean Code • Tiêu chuẩn chất lượng • Code Refactoring • Cách để có được Clean Code • Automation Test • Đảm bảo an toàn khi refactor • Design Pattern • Tiêu chuẩn chất lượng cao hơn
  • 48. Tham gia các cộng đồng