8️⃣ نکته برای نوشتن کد تمیز 🧼
کد تمیز، کدی است که خواندن، نگهداری و درک آن آسان است.
نقطه شروع 🏁
من دوست دارم هنگام یادگیری مفاهیم جدید، با یک مشکل شروع کنم.
و هر چه مشکل گویاتر باشد، بهتر است.
بنابراین ما از یک کد با نوشتار ضعیف به عنوان نقطه شروع برای بازآرایی خود استفاده خواهیم کرد.
و در هر مرحله، من مشخص خواهم کرد که مشکل فعلی چیست و چگونه آن را برطرف خواهیم کرد.
این چیزی است که من وقتی به متد Process نگاه میکنم، میبینم:
nesting
تو در توی عمیق کد - دقیقاً ۴ سطح.
چکهای پیششرط (Precondition) یکی پس از دیگری اعمال میشوند.
پرتاب استثنا (Exception) برای نمایش یک شکست.
چگونه میتوانیم این را به کد تمیز تبدیل کنیم؟ 👎
public void Process(Order? order)
{
if (order != null)
{
if (order.IsVerified)
{
if (order.Items.Count > 0)
{
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;
}
}
}
}
1️⃣: اصل بازگشت زودهنگام (Early Return Principle) 🚪
تا الان باید به طرز دردناکی واضح باشد که نسخه اولیه به دلیل دستورات if که چکهای پیششرط را اعمال میکنند، به شدت تودرتو است.
ما این مشکل را با استفاده از اصل بازگشت زودهنگام حل خواهیم کرد، که بیان میکند ما باید به محض برآورده شدن شرایط، از یک متد return کنیم.
در مورد متد Process، این به معنای حرکت از یک ساختار به شدت تودرتو به مجموعهای از guard clauses (شرطهای محافظ) است. 👍
public void Process(Order? order)
{
if (order is null)
{
return;
}
if (!order.IsVerified)
{
return;
}
if (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;
}