Trong quá trình làm dự án .NET, chúng tôi nhận ra một điều khá rõ: phần lớn mã nguồn rối không phải vì thiếu kiến thức, mà vì những thói quen nhỏ lặp đi lặp lại. Một biến đặt tên mơ hồ, một khối if lồng ba tầng, một đoạn LINQ viết dài tới mức không ai dám đụng vào. Bài này tổng hợp những mẹo C# ngắn gọn mà bạn có thể áp dụng ngay, không cần đổi kiến trúc hay học thêm framework nào.
Vì sao mã nguồn sạch lại quan trọng?
Mã nguồn sạch không phải là thứ để khoe trong code review. Nó giúp bạn tìm lỗi nhanh hơn khi debug, và giúp đồng đội hiểu logic mà không phải hỏi lại. Chúng tôi từng có một dự án API mà mỗi lần sửa một endpoint lại kéo theo hai lỗi mới ở chỗ khác. Lý do nằm ở việc các hàm xử lý quá nhiều việc cùng lúc.
Khi mã đủ rõ ràng, bạn đọc một hàm là hiểu nó làm gì. Điều đó tiết kiệm thời gian nhiều hơn bạn tưởng, đặc biệt khi dự án bước vào giai đoạn bảo trì.
Dùng pattern matching thay cho chuỗi if-else
C# hiện đại cung cấp pattern matching giúp viết điều kiện gọn hơn đáng kể. Thay vì kiểm tra kiểu rồi ép kiểu thủ công, bạn có thể gộp hai bước vào một dòng.
Ví dụ với một hàm tính phí vận chuyển theo loại đơn hàng:
decimal Tinh(Don don) => don switch
{
{ Loai: LoaiDon.Nhanh, TrongLuong: <= 1 } => 15000m,
{ Loai: LoaiDon.Nhanh } => 25000m,
_ => 10000m
};
Đoạn này ngắn hơn chuỗi if-else tương đương, và mỗi nhánh nằm trên một dòng riêng nên dễ đọc khi cần thêm trường hợp mới. Chúng tôi thường áp dụng cho các hàm có từ ba nhánh trở lên.
Tận dụng null-coalescing và null-conditional
Kiểm tra null là việc làm hằng ngày nhưng thường viết rất dài dòng. Toán tử ?. và ?? giúp bạn rút gọn đáng kể.
Thay vì viết ba dòng kiểm tra một thuộc tính lồng nhau, bạn có thể viết var ten = khachHang?.DiaChi?.Thanh_pho ?? "Chưa rõ";. Tuy nhiên đừng lạm dụng để che giấu lỗi logic. Nếu một giá trị bắt buộc phải có, hãy để nó ném ngoại lệ rõ ràng thay vì âm thầm trả về chuỗi mặc định.
Viết LINQ đủ ngắn để đọc một lần là hiểu
LINQ là công cụ mạnh nhưng dễ bị viết quá dài. Một chuỗi Where, Select, OrderBy, GroupBy nối liền nhau trên một dòng sẽ khiến người đọc phải dừng lại giải mã.
Mẹo của chúng tôi là tách bước trung gian bằng biến có tên rõ nghĩa. Thay vì gộp tất cả, hãy viết var conHang = sanPham.Where(p => p.TonKho > 0); rồi mới xử lý tiếp. Chi phí gần như bằng không, nhưng khi debug bạn có thể đặt breakpoint vào từng bước.
Dùng biến cục bộ với từ khoá var khi kiểu đã rõ
Khi vế phải đã nói rõ kiểu dữ liệu, var giúp code gọn mà vẫn an toàn về kiểu. Ví dụ var danhSach = new List<string>(); là đủ rõ. Nhưng với giá trị trả về không rõ ràng, nên giữ kiểu tường minh để người đọc không phải đoán.
Một vài lỗi thường gặp khi áp dụng mẹo
Chúng tôi từng thấy đồng nghiệp rút gọn code quá tay, nhồi cả chuỗi LINQ và pattern matching vào một biểu thức. Kết quả ngắn thật, nhưng không ai đọc nổi. Ngắn gọn chỉ có giá trị khi vẫn dễ hiểu. Nếu bạn phải dừng lại ba phút mới hiểu một dòng, hãy tách nó ra.
Ngoài ra, đừng bỏ qua công cụ phân tích có sẵn. Visual Studio và các analyzer của Roslyn có thể gợi ý những chỗ có thể rút gọn an toàn. Kết hợp với code review, bạn sẽ giữ được chất lượng mà không tốn nhiều công sức.
Kết luận
Mẹo C# ngắn gọn không nằm ở việc viết ít dòng nhất có thể, mà ở việc viết sao cho người đọc hiểu nhanh nhất. Pattern matching, toán tử null, LINQ có tổ chức và biến đặt tên rõ ràng là bốn thói quen đáng bắt đầu ngay hôm nay. Nếu bạn muốn đi sâu hơn về cách xử lý lỗi gọn gàng, hãy đọc thêm bài về cách xử lý exception đúng cách. Và nếu bạn đang làm việc với truy vấn dữ liệu, so sánh LINQ method syntax và query syntax sẽ giúp bạn chọn đúng cú pháp cho từng tình huống.


