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 
  1. Sử dụng Select Thay Vì ForEach để Chuyển Đổi Dữ Liệu

    Viết:

    var names = users.Select(u => u.Name);
    

    Thay Vì:

    var names = new List<sting>();
    users.ForEach((u) => {
        names.Add(u.Name);
    });
    
  2. 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";
    }
    
  3. Sử dụng Tuple cho Các Cấu Trúc Dữ Liệu Đơn Giản

    var 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);
    
  4. 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:
    var filteredUsers = users.Where(u => u.IsActive);
    
    Thay Vì:
    var filteredUsers = users.Where(u => u.IsActive).ToList();
    
  1. 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]
    
  1. Ưu tiên foreach hơn for để Dễ Đọc
  • Giúp việc lặp sạch hơn và an toàn hơn
    Viết:
    foreach (var user in users) 
    {
        Console.WriteLine(user.Name);
    }
    
    Thay Vì:
    for (int i = 0; i <= users.Count; i++) 
    {
        Console.WriteLine(users[i].Name);
    }
    
  1. 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;
    
  1. 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);
    
  1. Sử dụng ?. Thay Vì Kiểm Tra Null

    var city = user?.Address?.City;
    
  2. 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);
    
  1. 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) { ... }
    
  1. 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) { ... }
    
  1. 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);
    }
    
  1. 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;
    
  1. 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)
    
  1. Sử dụng HttpClientFactory Thay Vì new HttpClient
  • Sử dụng HttpClientFactory thay vì tạo mới HttpClient để tránh cạn kiệt socket.
    var client = httpClientFactory.CreateClient();
    // var client = new HttpClient();
    
  1. 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);
    
  1. Đóng Gói Logic Nghiệp Vụ
  • Giữ logic trong các lớp liên quan
    class Order {
        bool IsValid() => totalPrice > 0;
    }
    
  1. Sử dụng Records cho Dữ Liệu Bất Biến
  • Giảm mã lặp cho DTOs
    Viết:
    public record Person(string Name, int Age);    
    
    Thay Vì:
    public class Person {
            public string Name {get; set;}
            public int Age {get; set;}
        }
    
  1. 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);
    
  1. 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";
    
  1. 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);
     }
    
  1. 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
    if (string.Equals(userInput, "admin", StringComparison.OrdinalIgnoreCase)) 
     { ... }
    
    Sử dụng String.Equals() với StringComparison.OrdinalIgnoreCase để so sánh chuỗi không phân biệt hoa thường.
  1. Sử dụng await using cho Các Đối Tượng IAsyncDisposable
  • Đảm bảo tài nguyên bất đồng bộ được giải phóng đúng cách
    await using var connection = new SqlConnection(connectionString);
    
    Sử dụng await using với các đối tượng IAsyncDisposable để đảm bảo tài nguyên bất đồng bộ được giải phóng.
  1. 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ỗi

    var sb = new StringBuilder();
    sb.Append("Hello").Append(" world");