Làm phẳng các câu lệnh điều kiện lồng nhau
Thuộc phần Logic và luồng chương trình trong hành trình C# của Coddy. Bài học 22 trên 66.
Các câu lệnh điều kiện lồng nhau có thể khiến code của bạn khó đọc và bảo trì. Làm phẳng chúng giúp code dễ đọc hơn nhờ giảm mức thụt lề.
Đây là ví dụ về các câu lệnh điều kiện lồng nhau nhiều cấp:
if (userLoggedIn)
{
if (userHasPermission)
{
if (fileExists)
{
// Xử lý tệp
ProcessFile();
}
else
{
Console.WriteLine("File not found");
}
}
else
{
Console.WriteLine("No permission");
}
}
else
{
Console.WriteLine("Not logged in");
}
Ta có thể làm phẳng đoạn này bằng cách trả về sớm hoặc dùng các câu lệnh bảo vệ:
if (!userLoggedIn)
{
Console.WriteLine("Not logged in");
return;
}
if (!userHasPermission)
{
Console.WriteLine("No permission");
return;
}
if (!fileExists)
{
Console.WriteLine("File not found");
return;
}
// Xử lý tệp
ProcessFile();
Hãy chú ý rằng code đã làm phẳng có ít thụt lề hơn và dễ theo dõi hơn.
Thử thách
DễKhi kiểm tra điều kiện nhận học bổng, các câu lệnh điều kiện lồng nhau sâu khiến code khó đọc và bảo trì. Trong thử thách này, bạn sẽ chuyển cấu trúc câu lệnh điều kiện lồng nhau rối rắm thành code gọn gàng, dễ đọc bằng cách sử dụng mệnh đề bảo vệ.
Mệnh đề bảo vệ là câu lệnh return sớm để xử lý ngay một điều kiện cụ thể, nhờ đó phần còn lại của hàm tập trung vào “trường hợp thuận lợi”.
Nhiệm vụ của bạn là hoàn thiện các mệnh đề bảo vệ được triển khai một phần trong phương thức CheckScholarshipEligibility theo các quy tắc sau:
- Nếu tuổi nhỏ hơn 17, trả về "Not eligible due to age requirement" ngay lập tức
- Nếu GPA ≥ 3.5 VÀ học sinh có thư giới thiệu, cấp học bổng toàn phần
- Nếu GPA ≥ 3.8, cấp học bổng toàn phần, kể cả khi không có thư giới thiệu
- Nếu GPA ≥ 3.0 VÀ học sinh có thư giới thiệu, cấp học bổng một phần
- Nếu GPA nằm trong khoảng từ 3.5 đến 3.8, cấp học bổng một phần
- Với mọi trường hợp khác, trả về "Not eligible for scholarship"
Tự làm thử
using System;
class Program
{
public static void CheckScholarshipEligibility(int age, double gpa, bool hasRecommendation)
{
// Điều kiện kiểm tra sớm về độ tuổi
if (age < 17)
{
Console.WriteLine("Not eligible due to age requirement.");
return;
}
// Điều kiện kiểm tra sớm cho học bổng toàn phần khi có thư giới thiệu
if (/* Hoàn thành điều kiện này */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Điều kiện kiểm tra sớm cho học bổng toàn phần khi GPA xuất sắc
if (/* Hoàn thành điều kiện này */)
{
Console.WriteLine("Full scholarship granted!");
return;
}
// Điều kiện kiểm tra sớm cho học bổng bán phần khi có thư giới thiệu
if (/* Hoàn thành điều kiện này */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Điều kiện kiểm tra sớm cho học bổng bán phần khi GPA tốt
if (/* Hoàn thành điều kiện này */)
{
Console.WriteLine("Partial scholarship granted.");
return;
}
// Trường hợp mặc định: không đủ điều kiện
Console.WriteLine("Not eligible for scholarship.");
}
static void Main(string[] args)
{
// Các test case để nhận phản hồi ngay
Console.WriteLine("Test Case 1: Age 16, GPA 4.0, Has Recommendation: True");
CheckScholarshipEligibility(16, 4.0, true);
Console.WriteLine("\nTest Case 2: Age 18, GPA 3.9, Has Recommendation: False");
CheckScholarshipEligibility(18, 3.9, false);
Console.WriteLine("\nTest Case 3: Age 17, GPA 3.6, Has Recommendation: True");
CheckScholarshipEligibility(17, 3.6, true);
Console.WriteLine("\nTest Case 4: Age 19, GPA 3.2, Has Recommendation: True");
CheckScholarshipEligibility(19, 3.2, true);
Console.WriteLine("\nTest Case 5: Age 18, GPA 2.8, Has Recommendation: False");
CheckScholarshipEligibility(18, 2.8, false);
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Mảng nhiều chiều
Cơ bản về mảng 2 chiềuKhai báo và khởi tạo mảng 2 chiềuTruy cập phần tử mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuMảng răng cưaCác phép toán ma trận thường gặpÔn tập: mảng nhiều chiều4Kỹ thuật điều khiển luồng
Lệnh trả về sớmMệnh đề bảo vệCâu lệnh nhảy (goto)Break và continueLàm phẳng các câu lệnh điều kiện lồng nhau7Toán tử logic nâng cao
Đánh giá ngắn mạchToán tử logic có điều kiệnĐộ ưu tiên của toán tửÔn tập: toán tử nâng cao2Ra quyết định nâng cao
Nhiều điều kiệnLogic Boolean phức tạpSo sánh if và switchCâu lệnh switch lồng nhauÔn tập về ra quyết định nâng cao5Xử lý ngoại lệ
Cơ bản về try-catchCác loại ngoại lệNhiều khối catchLàm việc với tệpKhối finallyUsing hay try-finallyNgoại lệ tùy chỉnhÔn tập: xử lý lỗi8Hệ thống phân tích dữ liệu
Thiết lập thu thập dữ liệuLogic nhập dữ liệu3Cải tiến vòng lặp
Hiệu suất vòng lặpLặp qua dữ liệu phức tạpTừng kiểu vòng lặpTái cấu trúc vòng lặpÔn tập: vòng lặp tối ưu6Xử lý null
Cơ bản về tham chiếu nullKiểu giá trị có thể nullCác mẫu kiểm tra nullLập trình phòng vệÔn tập về an toàn với nullTự luyện tập: Trình biên dịch C# online