25 mẹo viết code rõ ràng và dễ hiểu hơn
25 Mẹo để Viết Code Sạch Hơn, Nhanh Hơn và Dễ Bảo Trì Hơn
Sử dụng
Select
Thay VìForEach
để Chuyển Đổi Dữ LiệuViết:
var names = users.Select(u => u.Name);
Thay Vì:
var names = new List<sting>(); users.ForEach((u) => { names.Add(u.Name); });
Sử dụng Toán Tử Ba Ngôi cho Các Điều Kiện Đơn Giản
Viết:
string status = Grade >= 8 ? "Đạt" : "Chưa Đạt";
Thay Vì:
string status = ""; if (Grade >= 8) { status = "Đạt"; } else { status = "Chưa Đạt"; }
Sử dụng
Tuple
cho Các Cấu Trúc Dữ Liệu Đơn Giảnvar person = (Name: "John", Age: 30); Console.WriteLine(person.Name);
Viết:
var person = (Name: "John", Age: 30); Console.WriteLine(person.Name);
Thay Vì:
class Person { public string Name {get; set;} public int Age {get; set;} } var person = new Person() { Name = "John", Age = 30 }; Console.WriteLine(person.Name);
Tránh Sử dụng
ToList
Khi Không Cần Thiết
- Ngăn chặn việc cấp phát bộ nhớ dư thừa
Viết:
Thay Vì:var filteredUsers = users.Where(u => u.IsActive);
var filteredUsers = users.Where(u => u.IsActive).ToList();
- Sử dụng
Range
vàIndex
- Đơn giản hóa việc cắt lát tập hợp với toán tử
..
và^
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var lastTwo = numbers[^2..]; //output: [8,9] var lastSevenItems = numbers[2..]; //output: [3, 4, 5, 6, 7, 8, 9]
- Ưu tiên
foreach
hơnfor
để Dễ Đọc
- Giúp việc lặp sạch hơn và an toàn hơn
Viết:
Thay Vì:foreach (var user in users) { Console.WriteLine(user.Name); }
for (int i = 0; i <= users.Count; i++) { Console.WriteLine(users[i].Name); }
- Sử dụng
Returns
Sớm để Đơn Giản Hóa code
Thoát sớm khỏi hàm khi điều kiện được đáp ứng để tránh lồng sâu và đơn giản hóa mã.
if (input == null) return;
- Sử dụng
Polly
cho Retry Policies trong call External API
- Sử dụng thư viện
Polly
để thiết lập thử lại khi gọi API, giúp xử lý lỗi tạm thời.policy.Handle<HttpRequestException>().Retry(3);
Sử dụng
?.
Thay Vì Kiểm TraNull
var city = user?.Address?.City;
Sử dụng
LINQ
để Viết Truy Vấn Sạch Hơn
- Sử dụng
LINQ
để viết các truy vấn lọc và chuyển đổi dữ liệu một cách gọn gàng.var adults = users.Where(u => u.Age >= 18);
- Sử dụng
is not
Thay Vì!= null
- Sử dụng
is not null
thay vì!= null
để mã dễ đọc hơn.if (user is not null) { ... } // if (user != null) { ... }
- Sử dụng
Any()
Thay VìCount() > 0
- Sử dụng
Any()
thay vìCount() > 0
để kiểm tra tập hợp có phần tử hay không, hiệu quả hơn.if (users.Any()) { ... } //if (users.Count() > 0) { ... }
- Sử dụng
File.Exists
Trước Khi Đọc Tệp
- Ngăn chặn các ngoại lệ không được xử lý
if (File.Exists(path)) { var content = File.ReadAllText(path); }
- Sử dụng
DateTimeOffset
Thay VìDateTime
cho Time Zones
Ngăn chặn vấn đề chuyển đổi múi giờ
DateTimeOffset now = DateTimeOffset.UtcNow; //DateTime now = DateTime.UtcNow;
- Sử dụng
string.Join()
để Nối Chuỗi
var names = string.Join(", ", users.Select(u => u.Name)); // var names = ""; // users.ForEach((user) => names = ", " + user.Name)
- Sử dụng
HttpClientFactory
Thay Vìnew HttpClient
- Sử dụng
HttpClientFactory
thay vì tạo mớiHttpClient
để tránh cạn kiệt socket.var client = httpClientFactory.CreateClient(); // var client = new HttpClient();
- Sử dụng
Fluent API
để Dễ Đọc Hơn
var result = dbContext.Users .Where(u => u.Age > 18) .Select(u => u.Name) .OrderBy(u => u.Name);
- Đóng Gói Logic Nghiệp Vụ
- Giữ logic trong các lớp liên quan
class Order { bool IsValid() => totalPrice > 0; }
- Sử dụng Records cho Dữ Liệu Bất Biến
- Giảm mã lặp cho DTOs
Viết:
Thay Vì:public record Person(string Name, int Age);
public class Person { public string Name {get; set;} public int Age {get; set;} }
- Sử dụng FirstOrDefault Thay Vì First
- Giảm thiểu Exception khi không tìm thấy dữ liệu
var user = users.FirstOrDefault(u => u.Id == id);
- Sử dụng
Environment.NewLine
cho Cross-Platform Line Breaks
- Tránh hardcode '\n' hoặc '\r\n'
- Sử dụng
Environment.NewLine
để ngắt dòng, đảm bảo tương thích trên nhiều nền tảng.string message = "Hi" + Environment.NewLine + "Ali";
- Self-Documenting Code
- Code nên rõ ràng mà không cần quá nhiều chú thích
- Đặt tên function và biến rõ ràng để code tường mình hơn và không cần comment giải thích
if (user.IsActive()) { ProcessSubscription(user); }
- Sử dụng
String.Equals()
cho So Sánh Chuỗi Không Phân Biệt Hoa Thường
- Đảm bảo so sánh chuỗi chính xác mà không cần lo về hoa thường
Sử dụngif (string.Equals(userInput, "admin", StringComparison.OrdinalIgnoreCase)) { ... }
String.Equals()
vớiStringComparison.OrdinalIgnoreCase
để so sánh chuỗi không phân biệt hoa thường.
- Sử dụng
await using
cho Các Đối TượngIAsyncDisposable
- Đảm bảo tài nguyên bất đồng bộ được giải phóng đúng cách
Sử dụngawait using var connection = new SqlConnection(connectionString);
await using
với các đối tượngIAsyncDisposable
để đảm bảo tài nguyên bất đồng bộ được giải phóng.
- Sử dụng
StringBuilder
cho Việc Xử Lý Chuỗi Lớn
Sử dụng
StringBuilder
để xử lý chuỗi lớn, tránh vấn đề hiệu suất khi nối chuỗivar sb = new StringBuilder(); sb.Append("Hello").Append(" world");