Một số mẹo viết code ngắn :D

Nghe trên mạng có câu “những người lười là những nhân viên tốt nhất để thuê”. Lười ở đây là tìm tòi cách ngắn nhất để làm việc chứ không phải là lười làm đâu nhé :)). Trong lập trình có câu don’t repeat yourself (DRY) để chỉ kiểu lười hữu ích này.

Sau đây là một số mẹo để mọi người viết code ngắn hơn, tớ sẽ lấy ví dụ ở objective-c, các ngôn ngữ khác thì theo tương tự. Ví dụ có đoạn code sau:

[self.tableView registerNib:[UINib nibWithNibName:@"Cell1" bundle:nil] forCellReuseIdentifier:@"Cell1"];
[self.tableView registerNib:[UINib nibWithNibName:@"Cell2" bundle:nil] forCellReuseIdentifier:@"Cell2"];
[self.tableView registerNib:[UINib nibWithNibName:@"Cell3" bundle:nil] forCellReuseIdentifier:@"Cell3"];
[self.tableView registerNib:[UINib nibWithNibName:@"Cell4" bundle:nil] forCellReuseIdentifier:@"Cell4"];
...

Mọi người thấy dòng code trên lặp đi lặp lại một logic, gỉa sử có nhiều loại cell khác nhau thì việc viết đi viết lại dòng code trên thật nhàm chán và rườm rà. :smiley: Mình lười nên sẽ tìm cách viết gọn hơn như sau:

NSArray *arrCellName = @[@"Cell1",@"Cell2",@"Cell3",@"Cell4"];
for( NSString *cellName in arrCellName) {
     [self.tableView registerNib:[UINib nibWithNibName:cellName bundle:nil] forCellReuseIdentifier:cellName];
}

Như vậy thêm loại cell mới nào ta chỉ cần nhét nó vào mảng là xong. Trong các kỹ năng refactor thì có hẳn nickname riêng cho cách này substitute.

Tiếp theo là loại bỏ switch case, gỉa sử ta có đoạn code sau:

switch(type) {
	case type1:
		result = @"value1";
	        break;
	case type2:
		result = @"value2";
		break;
	case type3:
		result = @"value3";
		break;
	case type4:
		result = @"value4";
		break;
	case type5:
		result = @"value5";
		break;
	default:
		result = @"valueDefault";
		break;
}
	return result;

Tớ không thích dùng switch case thế nên hay viết ngắn gọn lại kiểu này:

NSDictionary *map = @{
    @(type1) : @"value1",
    @(type2) : @"value2",
    @(type3) : @"value3",
    @(type4) : @"value4",
    @(type5) : @"value5",
}

return map[type] ? : @"valueDefault";

Kỹ năng này sử dụng dữ liệu kiểu key - value làm việc, sau có thêm type nào mới nhét vào dictinary là xong, trong c++ thì kiểu key - value chính là map đó :slight_smile: , javascript thì khỏi nói :stuck_out_tongue:

Hãy cố gắng DRY, không thì có lúc CRY đó :smiley:

9 Likes

Bài viết khá hữu ích :smiley: sẽ BookMark lại

Mình xin bàn thêm chút về ví dụ đầu tiên. Đồng ý dùng for tiện hơn và dễ quản lý hơn.
Nhưng liệu có chạy nhanh hơn k :smiley:

Mình k chuyên phần này (kiểu if true nhanh hay if 1 nhanh hơn) nhưng chắc là cũng phải nghía qua nếu muốn “lười” :smiley:

Ví dụ 2 mình thấy hay còn ví dụ 1 thà viết 1 lần

[self.tableView registerNib:[UINib nibWithNibName:@"Cell1" bundle:nil] forCellReuseIdentifier:@"Cell1"];

Sau đó copy-paste chỉnh sửa lại 1 chút còn nhanh hơn à:grin:

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