از استثناها برای شرایط استثنایی استفاده کنید ⚡️
یک قانون سرانگشتی که من دنبال میکنم این است که از استثناها برای شرایط استثنایی استفاده کنم. از آنجایی که شما از قبل انتظار خطاهای بالقوه را دارید، چرا آن را صریح نکنید؟
شما میتوانید تمام خطاهای اپلیکیشن را به دو گروه تقسیم کنید:
✅ خطاهایی که میدانید چگونه مدیریت کنید.
❓ خطاهایی که نمیدانید چگونه مدیریت کنید.
استثناها یک راهحل عالی برای خطاهایی هستند که نمیدانید چگونه مدیریت کنید. و شما باید آنها را در پایینترین سطح ممکن catch کرده و مدیریت کنید.
در مورد خطاهایی که میدانید چگونه مدیریت کنید چطور؟
شما میتوانید آنها را به روش تابعی با الگوی Result مدیریت کنید. این صریح است و به وضوح این نیت را بیان میکند که متد میتواند شکست بخورد. نقطه ضعف این است که فراخواننده باید به صورت دستی بررسی کند که آیا عملیات شکست خورده است یا نه.
بیان خطاها با استفاده از الگوی Result ✨
اولین چیزی که نیاز خواهید داشت، یک کلاس Error برای نمایش خطاهای اپلیکیشن است.
🔹️ Code -
نام منحصر به فرد برای خطا در اپلیکیشن.
🔹️ Description -
شامل جزئیات توسعهدهنده-پسند در مورد خطا.
public sealed record Error(string Code, string Description)
{
public static readonly Error None = new(string.Empty, string.Empty);
}
سپس، میتوانید کلاس Result را با استفاده از Error برای توصیف شکست، پیادهسازی کنید. این پیادهسازی بسیار ساده است و شما میتوانید ویژگیهای بسیار بیشتری به آن اضافه کنید. در اکثر موارد، شما همچنین به یک کلاس جنریک Result<T> نیاز دارید که یک مقدار را در داخل خود بپیچد.
در اینجا ظاهر کلاس Result آمده است: 🎁
public class Result
{
private Result(bool isSuccess, Error error)
{
if (isSuccess && error != Error.None ||
!isSuccess && error == Error.None)
{
throw new ArgumentException("Invalid error", nameof(error));
}
IsSuccess = isSuccess;
Error = error;
}
public bool IsSuccess { get; }
public bool IsFailure => !IsSuccess;
public Error Error { get; }
public static Result Success() => new(true, Error.None);
public static Result Failure(Error error) => new(false, error);
}
تنها راه برای ایجاد یک نمونه Result، استفاده از متدهای استاتیک است:
🔹️ Success -
یک نتیجه موفقیتآمیز ایجاد میکند.
🔹️ Failure -
یک نتیجه شکست با Error مشخص شده ایجاد میکند.
اگر میخواهید از ساختن کلاس Result خودتان اجتناب کنید، نگاهی به کتابخانه FluentResults 📚 بیندازید.