2️⃣: ادغام دستورات If برای بهبود خوانایی 🔄
اصل بازگشت زودهنگام، متد Process را خواناتر میکند.
اما نیازی نیست که یک guard clause پس از دیگری داشته باشیم.
بنابراین میتوانیم همه آنها را در یک دستور if ادغام کنیم.
رفتار متد Process بدون تغییر باقی میماند، اما ما مقدار زیادی کد اضافی را حذف میکنیم.
public void Process(Order? order)
{
if (order is null
!order.IsVerified
order.Items.Count == 0)
{
return;
}
if (order.Items.Count > 15)
{
throw new Exception(
"The order " + order.Id + " has too many items");
}
if (order.Status != "ReadyToProcess")
{
throw new Exception(
"The order " + order.Id + " isn't ready to process");
}
order.IsProcessed = true;
}
3️⃣: استفاده از LINQ برای کد خلاصهتر ✨
یک بهبود سریع میتواند استفاده از LINQ برای خلاصهتر و گویاتر کردن کد باشد.
به جای بررسی Items.Count == 0، من ترجیح میدهم از متد Any در LINQ استفاده کنم.
شما میتوانید استدلال کنید که LINQ عملکرد بدتری دارد، اما من همیشه برای خوانایی بهینهسازی میکنم.
عملیات بسیار پرهزینهتری در یک اپلیکیشن نسبت به یک فراخوانی متد ساده وجود دارد.
public void Process(Order? order)
{
if (order is null
!order.IsVerified
!order.Items.Any()) // استفاده از Any()
{
return;
}
if (order.Items.Count > 15)
{
throw new Exception(
"The order " + order.Id + " has too many items");
}
if (order.Status != "ReadyToProcess")
{
throw new Exception(
"The order " + order.Id + " isn't ready to process");
}
order.IsProcessed = true;
}
4️⃣: عبارت بولین با متد توصیفی 🗣
ادغام چندین شرط در یک دستور if به معنای نوشتن کد کمتر است، اما میتواند خوانایی را در شرایط پیچیده کاهش دهد.
با این حال، شما میتوانید این مشکل را برطرف کرده و خوانایی را با استفاده از یک متغیر یا متد با نام توصیفی بهبود ببخشید.
من استفاده از متدها را ترجیح میدهم، بنابراین متد IsProcessable را برای نمایش چک پیششرط معرفی خواهم کرد.
public void Process(Order? order)
{
if (!IsProcessable(order))
{
return;
}
if (order.Items.Count > 15)
{
throw new Exception(
"The order " + order.Id + " has too many items");
}
if (order.Status != "ReadyToProcess")
{
throw new Exception(
"The order " + order.Id + " isn't ready to process");
}
order.IsProcessed = true;
}
static bool IsProcessable(Order? order)
{
return order is not null &&
order.IsVerified &&
order.Items.Any();
}