Tải bản đầy đủ (.docx) (23 trang)

Clean code Code convention

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.98 MB, 23 trang )

I. Three Principles For Clean Code
1 Right Tool to For Job
Boundaries Matter

Ranh giới và tương tác giữa những những công nghệ khiến mọi người gặp rắc rối.
Ví dụ như chúng ta có thể đưa css hay js viết trong file html, tuy nhiên việc đó
khiến chúng khơng thể được tái sử dụng.
Mọi cơng nghệ đều có giới hạn và có mục đích sử dụng riêng. Bí quyết để chọn
đúng cơng cụ là việc xem xét khi nào những công nghệ bạn biết rõ nhất trở thành
“EVIL”. Lựa chọn công nghệ phù hợp hơn là chọn công nghệ bạn quen thuộc,ưa thích.
2 Signal to Noise Ratio
Signal


Signal là bất cứ logic nào tuân theo nguyên tắc TED:
+ Terse: Ngắn gọn
+ Expressive: Biểu cảm, thể hiện rõ ràng những gì mà mà mã đang cố gắng làm
+ Do one thing: Nó phải có trách nhiệm rõ ràng

DRY Principle: Don’t Repeat Yourself
Vấn đề của việc lặp lại:
+ Giảm signal tăng noise
+ Tăng số lượng dòng code
+ Tạo ra vấn đề khi bảo trì: Khi một lỗi được sửa tại một chỗ nó sẽ có thể vẫn tồn
tại ở những chỗ khác

3 Self-Documenting Code
Khi bạn đọc lại các đoạn code cũ, bạn không cần phải xem kỹ từng comment hay
phải chạy thử để biết ý nghĩa của đoạn code đó là gì. Self-Documenting code là bản thân
mã là lời giải thích cho những gì mà mã của bạn làm.
II Naming


1 Naming Matter
Tên có ở khắp mọi nơi trong phần mềm. Chúng ta đặt tên cho các biến, hàm, đối
số, lớp và gói của chúng ta. Chúng ta đặt tên cho các tệp nguồn của mình và các thư mục
chứa chúng. Bởi vì chúng ta đã làm rất nhiều điều đó, chúng ta nên làm tốt hơn nữa. Việc
lựa chọn tên biến có ảnh hưởng rất lớn đến khả năng đọc của mã.


Lưu ý rằng ở ví dụ trên tính đơn giản của mã khơng thay đổi. Nó vẫn có cùng một
số toán tử và hằng số, với cùng một số cấp độ lồng nhau. Nhưng mã đã trở nên rõ ràng
hơn nhiều.

2 Naming Class
-

Quy tắc đặt tên:
+ Tên của lớp phải là danh từ không phải động từ.
+ Tên phải cụ thể để lớp ở trong phạm vị nhỏ và dễ gắn kết hơn
+ Có một trách nhiệm duy nhất, như lớp ProductRespository có thể truy vấn cơ sở
dữ liệu nhưng khơng nên có thể gửi email.
+ Tránh các hậu tố chung chung


2 Method Name
Tên các phương thức phải là cụm động từ hoặc động từ như postPayment,
deletePage hoặc save.
3 Naming warning sign
Khi sử dụng những từ như And, If, Or. Nó cho thấy bạn đang cố gắng thực hiện
nhiều hơn một điều.
Một phương thức chỉ nên chịu trách nhiệm cho một hành động. Nếu phương pháp
của bạn thực hiện hai hoặc ba việc khác nhau cùng một lúc thì bạn nên cân nhắc việc tách

chức năng của phương thức này thành các phương thức khác.
Ví dụ: bạn có một phương thức saveUserAndChargeCard() để lưu người dùng vào
cơ sở dữ liệu và tính phí thẻ tín dụng của anh ta. Phương thức này chắc chắn là khơng tốt,
vì nó chứa ‘And’ trong tên và thực hiện hai hành động. Tránh sử dụng các từ như ‘và’,
‘hoặc’, v.v. trong tên phương thức. Bạn nên chia hàm này thành saveUser() và
chargeCard().


4 Silde Effect
Chức năng của bạn hứa hẹn sẽ làm một điều, nhưng nó cũng làm những
điều ẩn khác. Đơi khi nó sẽ thực hiện những thay đổi bất ngờ đối với các biến
trong lớp.

Slide effect là cuộc gọi đến Session.initialize(), tất nhiên. Chức năng
checkPassword, theo tên của nó, nói rằng nó sẽ kiểm tra mật khẩu. Tên khơng ngụ ý
rằng nó khởi tạo phiên. Vì vậy, người gọi tin rằng chức năng sẽ khơng có nguy cơ xóa
dữ liệu phiên hiện có khi người đó quyết định kiểm tra tính hợp lệ của người dùng.
5 Abbreviations
Đây khơng phải những năm 80, ngày nay dung lượng lưu trữ rất lớn các IDE
đã rất mạnh. Các từ viết tắt khiến mã trở nên khó hiểu. Vì vậy đừng ngần ngại đưa
vào tên đầy đủ.


6 Boolean
Biến boolean nên nghe như một câu hỏi đúng sai.

7 Symmetry


Đôi khi chúng ta đối mặt với những mặt đối lập trong mã. Và điều quan

trọng là khi chúng ta chọn các tên biến đối lập, chúng phải rõ ràng.

III Conditional
1 Boolean Comparisons
Việc so sánh rõ ràng biến boolean với true, false hồn tồn khơng cần thiết.

2 Boolean Assignments


Boolean nên được gán ngầm. Bây giờ, trên trái chúng ta có thể thấy rằng
mỗi Boolean là được gán giá trị một cách rõ ràng đúng hay sai. Điều này là khơng
cần thiết vì bạn có thể thấy trong phiên bản sạch này có một số lợi thế rõ ràng để
kiểu phân công ngầm bên phải dễ hiểu hơn và nó giảm số dịng code.
3 Positive Conditionals
Việc viết điều kiện phủ định làm tăng việc phải suy nghĩ và giảm khả năng đọc.

4 Ternary Elegance
Tốn tử ba ngơi cung cấp cú pháp thanh lịch ngắn gọn, giảm thiểu số dòng code.

5 Stringly Typed
Tránh sử dụng kiểu Stringly Typed, thay vào đó có thể sử dụng enum.


Việc sử dụng String Typed tiềm ẩn vấn đề khi chúng ta có thể gặp phải lỗi đánh máy.
-

Sử dụng enum mang tới các lợi ích:
+ Giảm thiểu việc gõ vì có thể được IDE gợi ý
+ Dễ hiểu
+ Tìm kiếm dễ dàng


6 Magic Numbers
Những con số không truyền đạt ý nghĩa có nó hay ý định của người viết nên đặt
một hằng số để cho biết ý nghĩa của chúng.

7 Complex Conditionals

Với những câu điều liện phức tạp thật khó để biết chúng trả lời cho điều gì. Để
quản lý sự phức tạp và làm rõ ý định chúng ta có thể thực hiện theo cách:
 Sử dụng biến trung gian:


 Đóng gói qua funtion

8 Polymorphism vs Enums
Ưu tiên sử dụng đa hình hơn enums. Việc sử dụng đa hình có thể mở rộng dễ dàng
hơn.


Ở ví dụ trên thay vì phải kiểm tra type qua enum sau đó thực hiện hành vi phù hợp
thì sử dụng đa hình sẽ giúp mỗi loại user có thể tự định nghĩa hành vi của hình.
9 Table Driven Method
Trường hợp các giá trị thay đổi lên tục sử dụng bảng cơ sở dữ liệu thay vì mã hóa
cứng với các cấu trúc phức tạp


IV Function
1 When to create a funtion
Function giúp chúng ta tổ chức lại mã thành các thành phần logic nhỏ hơn. Có 4 lý
do để tạo function:

+ Tránh trùng lặp
+ Thụt lề
+ Truyền đạt ý định tốt hơn
+ Duy trì 1 nhiệm vụ duy nhất
2 Avoid duplicate

Việc trùng lặp khiến mã khó bảo trì đặc biết là sửa lỗi. Sẽ có nhiều hơn 1 nơi để
bào trì, sửa chữa.


Chúng ta sẽ nhận thấy rằng có một thuật tốn được lặp lại bốn lần, một lần cho
mỗi trường hợp SetUp, SuiteSetUp, TearDown và SuiteTearDown. Không dễ dàng phát
hiện ra sự trùng lặp này vì bốn trường hợp được trộn lẫn với mã khác. Tuy nhiên, sự


trùng lặp là một vấn đề vì nó làm mã dài dòng và sẽ yêu cầu sửa đổi gấp bốn lần nếu
thuật toán phải thay đổi hay xuất hiện 1 lỗi.
3 Excessive Indentation

-

Tụt đầu dòng quá sâu thể hiện mã có độ phức tạp cao, giảm thiểu khả năng đọc.
Giải pháp:
 Extract method: đưa khối vào một method

 Return early


Phương pháp này có 4 cấp độ thụt lề làm giảm khả năng đọc, chúng ta sẽ xem sét
áp dụng Return early trả về kết quả ngay lập tức nếu điều kiện không thỏa mãn.



 Fail fast: là trường hợp có nghĩa là bạn ném một ngoại lệ là ngay khi một tình
huống bất ngờ khơng thể được xử lý xảy ra.

Như ví dụ trên thay vì sử dụng các khối lồng nhau thì ta sẽ xử lý ngoại lệ
trước

3 Convey Intent
Chúng ta có thể dùng function để làm rõ hơn ý tưởng muốn truyền đại, ví
dụ dưới đây đưa các câu điều kiện vào một function để làm rõ chúng đang thực
hiện điều gì.


4 Do one thing
-

Hỗ trợ người đọc: Hàm được đặt tên tốt sẽ giúp tóm tắt chức năng bên trong
Tái sử dụng code

5 Parameter
Cố gắng giữ function ở trong 0 – 2 parameter. Nếu có quá nhiều parameter có thể
đưa vào 1 object
6 Exception


Chúng ta hay nhầm lẫn cho cấu trúc của mã và trộn xử lý lỗi với xử lý bình
thường.

Ở ví dụ trên hàm delete() sẽ xử lý tất cả các lỗi, nó dễ dàng để hiểu. Hàm

deletePageAndAllReferences() sẽ chỉ tập trung vào việc xóa page, bỏ qua việc xử lý
lỗi. Điều này cung cấp một sự tách biệt cho mã và làm cho mã dễ dàng hơn để hiểu và
sửa đổi.

V.Class
1 When to Create
Lớp như phần tiêu đề của cuốn sách sẽ giúp người đọc hình dung được nội dung
bên trong


2 Class Organization
Theo quy ước Java tiêu chuẩn, một lớp phải bắt đầu bằng một danh sách các biến.
Các hằng số tĩnh cơng khai nên xuất hiện trước. Sau đó là các biến tĩnh riêng, tiếp theo là
biến riêng thông thường.

3 Classes Should Be Small!
Quy tắc đầu tiên của các lớp là chúng phải nhỏ. Quy tắc thứ hai của các lớp là
chúng phải nhỏ hơn thế. Nhưng nhỏ thế nào? Ở phương thức chúng ta đo bằng số dòng
vật lý, ở lớp chúng ta đo bằng trách nhiệm của lớp.

-

Cohension:
o Các lớp nên có một số lượng nhỏ các biến. Mỗi phương thức của một lớp
nên thao tác với một hoặc nhiều biến đó. Nói chung, một phương thức càng
thao tác nhiều biến thì phương thức đó càng gắn kết với lớp của nó. Một
lớp trong đó mỗi biến được sử dụng bởi mỗi phương thức là gắn kết tối đa.
o Nói chung, khơng nên và cũng khơng thể tạo các lớp gắn kết tối đa như vậy,
mặt khác chúng ta muốn sự gắn kết cao. Khi tính liên kết cao, có nghĩa là
các phương thức và biến của lớp là đồng phụ thuộc và gắn kết với nhau như

một tổng thể logic.


4 Principle of Proximity
Sắp xếp từ trên xuống dưới khi đọc.

VI Comment
1 Redundant Comment
Comment dư thừa là comment không mang lại thêm thông tin, lặp lại tên biến, tên
phương thức.


2 Intent comment
Thay vì sử dụng comment cố gắng thể hiện ý định trong mã.


3 zoombie code
Loại bỏ code được comment lại.

4 Dividers and Brace Trackers
Thay vì comment để đánh dấu kết thúc thì nên đưa vào function




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×