Có phải bạn đang thắc mắc Clean Code là gì? Làm sao biết code nào sạch code nào không?. Thế thì hãy đọc bài viết này! coder.com.vn sẽ cho bạn biết Clean Code là gì? Làm sao biết code nào sạch code nào không?
Mã tinh khiết (clean code) là gì?
Thôi quay lại lỗi lo chủ đạo là mã tinh khiết (clean code) – Vậy mã sạch sẽ là gì? vì sao developer chúng ta cần mã tinh khiết, nó liên quan gì đến chuyện trở thành một developer vượt trội hơn. Có bạn trả lời mã sạch đương nhiên là mã không bị nhơ bẩn rồi :D. Cũng đúng vậy mã như thế nào là mã không nên sạch sẽ (dùng từ dơ thấy thô thô quá :D). xem thử đoạn code dưới đây nhé:
publicobjectcalTotalCost()var list = Products.getItems();var totalCost =0;if(list != null)foreach (var item in list)
totalCost += item.getCost();if(totalCost > user.Balance)returnErrorMessage("User balance not enough");
return totalCost;
Trong đoạn code này những thứ gì bạn cảm nhận thấy nó không nên sạch sẽ lắm? Chắc một số bạn Nhìn vào kiu là: m* thằng này code dại vãi, giờ này còn ai code chuối như vậy nữa :D. Hehe chịu thôi, trước mình cũng code đần độn và thiếu nghĩa vụ như vậy ak :D.Có điều lâu lắm rồi nha giờ bớt rầu (-_-). Mình phải về quê trốn thằng maintain cả nằm trời =]] .Nên giờ chia sẽ lại cho những bạn nào còn chưa giác ngộ về clean code 😀
Trở lại cái example, đoạn code này có vô số lỗi lo về clean code
- [Meaningful names] Tên biến cực kì là đ** có chút ý nghĩa gì. Thằng code mấy dòng này nó code kết thúc chạy ok, no problem, tuyệt vời. Sau 3. tháng features mới nhiều , có liên quan tới phần code này, quay lại đọc chả hiểu nó làm cái mọe gì – phải lại đọc code, debug để biết nó làm cái gì, cường bạo hơn đọc cũng chả biết là cái gì, phắt -> tốn cực kì nhiều giời gian vô ích -> fail
- [Don’t return null] Tự dưng cái hàm
getItems
mang lại null làm cái beep gì để tốn cái công phải kiểm tra null ta, cứ chỗ nào xài là phải tốn công kiểm tra null, cũng khá là dư thừa phải không? Cái chúng ta muốn chỉ là đơn giản lấy danh sách hàng hóa và tính tổng tiên thôi mà. Thay vì return null chúng ta có thể trả về mộtempty list
. - [CLass, method does one thing well] xuất sắc, một hàm mà thực hiện được cả hai chức năng nếu như có hậu quả trả về thì biết tổng sản phẩm của người tiêu dùng này mua, còn lỗi thì biết khách hàng mua quá số tiền hiện có. tuy nhiên sau cùng thì được gì chỉ là gây khó khăn để hiểu, phải document um tùm để giải nghĩa, gây khó khăn cho mấy đồng nghiệp khác dùng method này, gặp mặt mình dẹp m** luôn viết hàm khác cho khỏe 😀
Chẳng hạn như của mình quá lộ liễu đúng không ta? Quan sát vào là thấy bà nó rầu, phân với chả tích :D. tuy nhiên đấy là một tại rất nhiều lỗi lo về mã sạch (clean code) mà khi chúng ta mong muốn trở nên một developer vượt trội hơn chúng ta cần phải quan tâm, các bậc cao nhân trong nghiệp lập trình, thì chỉ cần Quan sát code thì chúng ta đã cảm thấy cực kì phê, những thứ cao siêu đầy kinh nghiệm ẩn chứa tại những dòng code Nhìn có vẻ thật quá giản đơn.
Xem thêm: Công nghệ VAR là gì? VAR Được sử dụng như thế nào hiện nay?
Biển trời kiến thức
Kiến thức và kinh nghiệm mình cũng chỉ có hạn nên cần phải tham khảo bí kíp để biết thêm những gì ngoài kiến thức nhỏ xíu của mềnh, , đây là hai cuốn sách mà nếu như muốn uyên thâm hơn trong vấn đề clean code này các bạn nên tìm đọc:
- Clean Code (Robert C. Martin)
- The Clean Coder (cũng ông Robert C. Martin luôn)
Mình sẽ list lại cũng giống như bàn bạc thêm về những cái gì được viết trong sách, thiệt ra nói clean code là gì đó khá thực thể nhưng nó cũng khá là cảm tính kiểu như chúng ta luôn thấy bạn gái đứa khác đẹp trong khi nó nghĩ ngược lại :D. nhưng đây là những chia sẽ của các bậc tiền bối đầu ngành nên nó là những kinh nghiệm rất quý giá cho nghiệp lập trình chúng ta 🙂
1. Những chia sẽ của những bậc tiền bối về clean code
Clean code does one thing well.
(Bjarne Stroustrup)Clean code is simple and direct, clean code read like well-written prose.
(Grady Booch)Clean code can be read, clean code should be literate. It has meaningful names
(Dave Thomas)Clean code always looks like it was written by someone who cares.
(Micheal Feathers)Reduced duplication, high expressiveness, and early building of simple abstractions.
(Ron Jeffries)You know you are working on clean code when each routine you reads turns out to be pretty much what you expected.
(Ward Cunningham)
Với các chia sẽ về clean code này thì nó có thể thấm hoặc sẽ thấm với bất cứ lập trình viên nào, với mình là thế. Mình cũng chưa thể nào nói là đã hiểu hết các chia sẽ này, vì thực sự cũng không hiểu nó nói gì :D. Translate , xem thôi hehe…
2.Clean code rules
2..1 Meaningful names
2..1.1 Use intention-revealing Names
Đặt tên biến là một nghệ thuật tại lập trình đó nhé,phải đặt cái tên phải thật là ý nghĩa, dể hiễu, đọc phát hiểu ngay, đúng ngữ pháp (vs mình =]]). kiểu như Lê Văn Nhật, Lê Văn Mỹ (muốn con mình đi nước ngoài) hay Nguyễn Vàng, Nguyễn Hột Xòn (muốn con cái giàu có)…
Đừng như Nguyễn Văn A, Nguyễn Văn B mà mấy ông thầy dạy lập trình hay lấy ra làm chẳng hạn như nhé.Có lẽ cuộc đời thg Nguyễn Văn A là hay đc đem ra làm chẳng hạn như nhất cuộc đời này. Kệ nó đi 😀 Nói chung đặt Tên biến trong lập trình rất quan trọng, project thành bại một do nó mà ra.
Ví dụ:
public List GetData()
var list1 = new List();var data = ServiceRepository.GetPlainCustomers();foreach(var item in data)
if (item != null && item.IsValid)
list1.Add(item);
return list1;
Đạo xanh, 2. tháng sau hay sau này là không biết nó làm cái nồi gì luôn ak. Phắt zu thằng viết ra hàm này.
Như thế này thì vượt trội hơn nhiều đúng không, bỏ thêm vài giây để suy nghĩ tên biến, tiết kiệm được hàng giờ đồng đại dương sau này 🙂
public List GetValidCustomers()
var validCustomers = new List();var plainCustomers = ServiceRepository.GetPlainCustomers();foreach(var customer in plainCustomers)
if (customer != null && customer.IsValid)
validCustomers.Add(customer);
return validCustomers;
2.1.2 Use Pronounceable Names
//BADpublicclassCustomerprivate DateTime joinhhmmdd;private DateTime lstloghhmmdd;privatestring custId = "ID123";
//GOODpublicclassCustomerprivate DateTime JoinTime;private DateTime LastLoginTime;privatestring CustomerId = "ID123";
2.1.3 Use Searchable Names
//BADfor(int j =0; j<3 ;j++)
s += (t[j] * 4.) / 5.;
//GOODint realDaysPerIdealDay = 4; constint WORK_DAYS_PER_WEEK =5.; int sum 0; for(int i=0;i< NUMBER_OF_TASKS; i++)
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
sum+=realTaskWeeks;
Xem thêm: Hướng dẫn tự lập trình Android cơ bản từ A đến Z
Minh Nguyệt_ Tổng hợp( Tham khảo: jinhduong.github.io/coding/2016/10/24/ma-sach.html)