Cách viết clean code

Anh có thể giải thích rõ hơn giúp em được không, em suy nghĩ mãi mà vẫn không hiểu 2 ý này.

if( username != "" ) {
 // blah blah
} else {
   // blah blah
}

Em thấy viết kiểu này đọc từ trái sang phải thuận miệng hơn :sweat_smile: “Nếu username khác rỗng thì,…” tập trung nhấn mạnh vào username còn “” chỉ là phụ. Tại sao lại viết ngược lại vậy anh @SITUVN.gcd ?

if( "" != username ) {
     // blah blah
    } else {
       // blah blah
    }
1 Like

Cốt tránh lỗi = và == thôi.

6 Likes

Function 1 dòng như vậy ổn mà cậu? :smile:
Có một số lý do tốt cho function đó:

  • Code của cậu dễ đọc hơn (ở đoạn gọi function).
  • Cậu có thể tái sử dụng function đó.

Tất nhiên, cậu chỉ nên sử dụng function 1 dòng kiểu này thay cho điều kiện trong 1 số TH:

  • Điều kiện đó lặp đi lặp lại trong source code.
    Khi đó, tách function ra là quyết định hợp lý.
  • Điều kiện ở dòng if tương đối phức tạp và khó hiểu.
    Việc tách function với 1 tên dễ hiểu sẽ giúp code readability của cậu tăng lên rất nhiều.

Cậu không nhất thiết phải luôn luôn tách function như vậy, đặc biệt khi code của cậu đủ dễ hiểu rồi. Trong code ví dụ của cậu, điều kiện này hơi khó hiểu (kiểm tra username có rỗng không nghĩa là gì?), nên tách hàm mới với tên dễ hiểu là quyết định hợp lý.

Hope it helps!

9 Likes

Cậu đúng đó, viết cách trên dễ đọc hơn một chút.
Cách dưới được gọi là Yoda notation, thường dùng trong C/C++ để tránh bug này:

// This will be always true
if (value = 1) { // assignment
  ...
}
// Compiler will scream in case of using Yoda notation
if (1 = value) { // cannot assign
  ...
}

Nếu cậu không code ngôn ngữ coi 0 = false, !0 = true như C/Cpp, cậu không cần dùng Yoda notation.

Hope it helps!

9 Likes
  1. Ai rảnh đâu mà viết lại tên class cho từng field :V :V
  2. Biến trước. Ai đặt giá trị trước là ko biết/ko thèm bật/đọc warnings, thói hư tật xấu :V
  3. Nên viết đủ, chỉ tránh đặt tên có nghĩa phủ định là được. Vd incomprehensibilities uncopyrightable tìm từ khác mà xài, tự dưng thêm cái phủ định vô làm gì khó đọc lắm :V
  4. Nên dùng. Có else là nên dùng ngoặc nhọn :V Trừ phi if ko có else và 1 dòng thì có thể ko cần.
10 Likes

Khi code javascript thì các bác có thường sử dụng trailing commas như này không ạ?

Có chứ cậu.
Làm thế cậu sẽ:

  • Thêm 1 dòng mới dễ dàng hơn, khi cậu không phải thêm dấu ‘,’ vào cuối dòng trước.
  • Pull request diff sẽ gọn hơn, khi cậu không phải sửa dòng trước.

Hope it helps!

10 Likes

Project thực tế lúc đi làm người ta code arrow function trong javascript thường dùng kiểu nào vậy ạ?


Kiểu này

const func = () => { 
 // 
 }

hay kiểu này

const func = _ => {
//
}

2 cách mà bạn nói có khác biệt.

Hàm không chứa tham số có tên.

Hàm chứa 1 tham số có tên là _.

Thích dùng cách nào thì dùng.
Thế này cũng được:

const func = $=> { 
 // 
 }
const func = ă=> { 
 // 
 }
a = [1,2,3,4];
console.log(a.reduce((_,$)=>_+=$));
5 Likes

Thôi toang rồi :cold_face:, đọc phát giật hết cả mình, trước giờ em toàn dùng _ cho function không có tham số, lúc trước em nhớ có đọc trên một blog nào đó bảo const func = () => { }const func = _ => { } giống nhau @@ ai ngờ đọc nhầm blog lậu, bản chất nó cũng là một tham số bình thường chỉ là không dùng ký tự alphabet

const func = _ => {
    return _ + 1;
}
console.log(func(12)) //13

Nhưng dùng sao cũng cảm ơn anh nhiều, anh không nói em cũng không để ý.

3 Likes

Nó giống như là 1 tips để mình có thể giả vờ bỏ qua nó thôi :stuck_out_tongue:

4 Likes

Thế thì viết cặp ngoặc () cho đúng bản chất :smiley:

Cái món _ này chỉ dùng khi destructuring thôi.

6 Likes

Ý anh là bỏ qua phần tử không cần thiết như này?

const arr = [1,2,3];
const { _, _, c} = arr;
console.log(c) //3

1 Like

mà khoan, dấu underscore _ này có bị trùng với thư viện lodash không nhỉ?

Còn cách đặt tên biến cho trường hợp này thì sao vậy anh/chị?
VD : fetch API danh sách item, server trả về mảng JSON object

[
	{
		color: "red",
		value: "#f00"
	},
	{
		color: "green",
		value: "#0f0"
	},
	{
		color: "blue",
		value: "#00f"
	},
	{
		color: "cyan",
		value: "#0ff"
	},
]

thì đặt tên biến như thế nào cho đúng ạ? (Em hỏi chung chung vậy thôi, không phân biệt ngôn ngữ)

1. const arrayItem = fetchMyData(); 
2. const arrItem = fetchMyData();
3. const items =  = fetchMyData();
4. const itemList = fetchMyData();
5. const listItem =  = fetchMyData();

Theo như tớ thấy, không cách đặt tên nào cậu đưa hợp lý cả :sweat_smile:

Về cơ bản, cậu không nên sử dụng các từ quá trừu tượng để đặt tên biến. “item”, “data”, “object”, “element”, “list”, “map”, “stack”, “myBeautifulData”, “yourAwesomeObject”… hoàn toàn không giúp ích gì cho người đọc code hiểu biến đó chứa gì (ai chẳng biết mảng đó chứa item? :sweat_smile:)
List cậu đưa ra là các object chỉ màu sắc, vậy nên “colorList” hay “colors” có thể là tên tốt hơn, chỉ rõ thông tin nội dung của biến. Cậu cũng có thể thêm một số từ chỉ mục đích của biến, chẳng hạn, nếu biến của cậu được dùng để lưu các màu nền default mà hệ thống hỗ trợ, “defaultBackgroundColors” hay gì đó tương tự là ứng cứ viên tốt.

Hope it helps!

7 Likes

Anh ơi cho em hỏi thêm 1 câu nữa!

Khi đi làm thực tế, arrow function có 1 tham số thì có cần dùng cặp ngoặc không?

const func = param => {
    //
}

hay

const func = (param) => {
    //
}

Tùy project, team code như thế nào thì theo vậy. Project có linter, prettier commit là nó format cho luôn, khỏi nghĩ nhiều.

7 Likes

Vậy trường hợp tham số method thì sao anh.

public Product getProductDetail( int productId) {}

hay tham số chỉ cần viết id, ai gọi hàm getProductDetail thì tự hiểu id đó là productId

public Product getProductDetail( int id) {}

trừ trường hợp có nhiều id thì ghi productId, orderId rõ ràng còn 1 id thì chắc khỏi :V

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?