برنامه نویسی

اگر کد شما چندین if داشته باشد چه باید کرد؟

Summarize this content to 400 words in Persian Lang
آیا به کد خود نگاه کرده اید و به مقدار زیادی اگر…دیگر اگر…دیگر توجه کرده اید، فکر کرده اید که چگونه می توانم این موضوع را با زیبایی بیشتر حل کنم؟

همه ما می دانیم که ساختار شرط چیزی است که در 99.99٪ از همه کدها وجود دارد، اما گاهی اوقات تعجب می کنیم که آیا چنین ساختارهایی باید واقعاً به این روش پیاده سازی شوند یا خیر، گاهی اوقات بلافاصله به راه های دیگری فکر نمی کنیم که برای آنها ظریف تر باشد. کد ما (اعتراف می کنم که قبلاً آن را انجام داده ام و گاهی اوقات آن را انجام می دهم).

اما اگر و دیگری چیست؟

If's و Elses همانطور که گفتم در واقع ساختارهای شرطی هستند. چنین ساختارهایی امکان انتخاب گروهی از کنش‌ها و ساختارها را فراهم می‌کنند که در صورت درست بودن یک شرط خاص اجرا می‌شوند.

if(BomHumor == true)
{
Console.WriteLine(“Bom dia!”);
}else
{
Console.WriteLine(“Quero Café!”);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیچیدگی سیکلوماتیک

راه حل این است که پیچیدگی سیکلوماتیک کد خود را درک کنید، که به شما امکان می دهد بدانید از کدام ساختارها و الگوها باید استفاده کنید. اما پیچیدگی سیکلوماتیک چیست؟

پیچیدگی سیکلوماتیک یک معیار نرم افزاری است که پیچیدگی یک برنامه کامپیوتری را بر اساس ساختار کد منبع آن نشان می دهد. این برنامه توسط توماس جی مک کیب در سال 1976 توسعه یافت و اغلب برای ارزیابی قابلیت نگهداری و پایداری یک برنامه استفاده می شود. پیچیدگی سیکلوماتیکی به شناسایی بخش‌هایی از کد کمک می‌کند که درک و نگهداری آن‌ها دشوار باشد.

پیچیدگی چرخه‌ای با شمارش تعداد مسیرهای مستقل در کد محاسبه می‌شود که به درجه ساختارهای تودرتو و کنترل جریان مربوط می‌شود، مانند شرطی‌ها (if, else)، حلقه‌ها (for, while) و سوئیچ‌ها (switch- case). ). فرمول محاسبه پیچیدگی سیکلوماتیک به شرح زیر است:M = E – N + 2Pکجا:

M پیچیدگی سیکلوماتیک است.
E تعداد یال ها در نمودار کنترل جریان است.
N تعداد گره ها در نمودار کنترل جریان است.
P تعداد اجزای متصل (به عنوان تعداد قطعات مستقل کد) است.

پس از این همه صحبت، بیایید به مثالی در سی شارپ برویم که از الگوی استراتژی استفاده می کند (زمانی دیگر با جزئیات بیشتر در مورد آن صحبت خواهیم کرد):

public class CalculadoraDesconto
{
public decimal CalculoDesconto(Cliente cliente, Pedido pedido)
{
decimal desconto = 0;

if (cliente.IsPremium)
{
if (pedido.QuantiaTotal > 100)
{
desconto = pedido.QuantiaTotal * 0.1m;
}
else
{
desconto = pedido.QuantiaTotal * 0.05m;
}
}
else
{
if (pedido.QuantiaTotal > 200)
{
desconto = pedido.QuantiaTotal * 0.15m;
}
else
{
desconto = pedido.QuantiaTotal * 0.1m;
}
}

return desconto;
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال ما یک کلاس داریم که تخفیف را برای یک مشتری معمولی و یک مشتری ممتاز محاسبه می کند و این بستگی به پرداخت آنها دارد.QuantiaTotal”.

بیایید همان فرمول را برای محاسبه پیچیدگی سیکلوماتیک اعمال کنیم:

تعداد گره ها (N): در این کد نکات تصمیم گیری زیر را داریم:

اولین تصمیم، که بررسی می کند آیا مشتری ممتاز است یا خیر.تصمیم دوم، که بررسی می کند که آیا ارزش کل سفارش بیشتر از 100 است یا خیر.تصمیم سوم، که بررسی می کند که آیا ارزش کل سفارش بیشتر از 200 است یا خیر.

تعداد لبه ها (E): تعداد یال ها در نمودار کنترل جریان برابر است با تعداد انتقال بین نقاط تصمیم. هر نقطه تصمیم دو مسیر (یکی درست و یکی نادرست) ایجاد می کند، به جز نقطه تصمیم اول که تنها یک مسیر ایجاد می کند. بنابراین:

اولین تصمیم 2 مسیر ایجاد می کند.تصمیم دوم 2 مسیر ایجاد می کند.تصمیم سوم 2 مسیر ایجاد می کند.

تعداد کامپوننت ها (P): این کد دارای یک جزء واحد است زیرا هیچ قسمت قطع شده ای در جریان کنترل وجود ندارد.M = E – N + 2PM = (2 + 2 + 2) – (3) + 2(1) = 6 – 3 + 2 = 5

پیچیدگی سیکلوماتیک کد 5 است. این به این معنی است که کد دارای 5 مسیر مستقل ممکن است که سطح متوسطی از پیچیدگی را نشان می دهد. پایین نگه داشتن پیچیدگی سیکلوماتیک برای تسهیل نگهداری و تست کد مهم است.

همانطور که در مثال بالا دیدیم، پیچیدگی 5 داریم که مورد نارضایتی نیست. اما هنوز به این سوال پاسخی نداده ایم که “چگونه اگر و غیره را کاهش دهیم؟”

چگونه اگر و غیره را کاهش دهیم؟راه‌های مختلفی برای انجام این کار وجود دارد، با در نظر گرفتن شرایط شما و زمان تحویل پروژه. ما در مورد 4 استراتژی صحبت خواهیم کرد، اما این استراتژی ها بسیار جامع هستند.

1. بازگشت زودهنگام: شاخه های غیر ضروری را حذف می کند.2. جداول تصمیم: شرایط را با فرهنگ لغت یا قواعد جایگزین می کند.3. چند شکلی: منطق را بر اساس نوع مشتری تقسیم می کند.4. تفویض وظایف: منطق تخفیف را در بر می گیرد و کد را ماژولارتر می کند.

در پست های بعدی هر استراتژی را توضیح خواهیم داد و کدهای مدل سازی شده بر اساس مثال بالا ارائه خواهند شد.

آیا به کد خود نگاه کرده اید و به مقدار زیادی اگر…دیگر اگر…دیگر توجه کرده اید، فکر کرده اید که چگونه می توانم این موضوع را با زیبایی بیشتر حل کنم؟

همه ما می دانیم که ساختار شرط چیزی است که در 99.99٪ از همه کدها وجود دارد، اما گاهی اوقات تعجب می کنیم که آیا چنین ساختارهایی باید واقعاً به این روش پیاده سازی شوند یا خیر، گاهی اوقات بلافاصله به راه های دیگری فکر نمی کنیم که برای آنها ظریف تر باشد. کد ما (اعتراف می کنم که قبلاً آن را انجام داده ام و گاهی اوقات آن را انجام می دهم).

اما اگر و دیگری چیست؟

If's و Elses همانطور که گفتم در واقع ساختارهای شرطی هستند. چنین ساختارهایی امکان انتخاب گروهی از کنش‌ها و ساختارها را فراهم می‌کنند که در صورت درست بودن یک شرط خاص اجرا می‌شوند.

if(BomHumor == true)
{
   Console.WriteLine("Bom dia!");
}else
{
   Console.WriteLine("Quero Café!");
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیچیدگی سیکلوماتیک

راه حل این است که پیچیدگی سیکلوماتیک کد خود را درک کنید، که به شما امکان می دهد بدانید از کدام ساختارها و الگوها باید استفاده کنید. اما پیچیدگی سیکلوماتیک چیست؟

پیچیدگی سیکلوماتیک یک معیار نرم افزاری است که پیچیدگی یک برنامه کامپیوتری را بر اساس ساختار کد منبع آن نشان می دهد. این برنامه توسط توماس جی مک کیب در سال 1976 توسعه یافت و اغلب برای ارزیابی قابلیت نگهداری و پایداری یک برنامه استفاده می شود. پیچیدگی سیکلوماتیکی به شناسایی بخش‌هایی از کد کمک می‌کند که درک و نگهداری آن‌ها دشوار باشد.

پیچیدگی چرخه‌ای با شمارش تعداد مسیرهای مستقل در کد محاسبه می‌شود که به درجه ساختارهای تودرتو و کنترل جریان مربوط می‌شود، مانند شرطی‌ها (if, else)، حلقه‌ها (for, while) و سوئیچ‌ها (switch- case). ). فرمول محاسبه پیچیدگی سیکلوماتیک به شرح زیر است:
M = E - N + 2P
کجا:

  • M پیچیدگی سیکلوماتیک است.
  • E تعداد یال ها در نمودار کنترل جریان است.
  • N تعداد گره ها در نمودار کنترل جریان است.
  • P تعداد اجزای متصل (به عنوان تعداد قطعات مستقل کد) است.

پس از این همه صحبت، بیایید به مثالی در سی شارپ برویم که از الگوی استراتژی استفاده می کند (زمانی دیگر با جزئیات بیشتر در مورد آن صحبت خواهیم کرد):

public class CalculadoraDesconto
{
    public decimal CalculoDesconto(Cliente cliente, Pedido pedido)
    {
        decimal desconto = 0;

        if (cliente.IsPremium)
        {
            if (pedido.QuantiaTotal > 100)
            {
                desconto = pedido.QuantiaTotal * 0.1m;
            }
            else
            {
                desconto = pedido.QuantiaTotal * 0.05m;
            }
        }
        else
        {
            if (pedido.QuantiaTotal > 200)
            {
                desconto = pedido.QuantiaTotal * 0.15m;
            }
            else
            {
                desconto = pedido.QuantiaTotal * 0.1m;
            }
        }

        return desconto;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال ما یک کلاس داریم که تخفیف را برای یک مشتری معمولی و یک مشتری ممتاز محاسبه می کند و این بستگی به پرداخت آنها دارد.QuantiaTotal“.

بیایید همان فرمول را برای محاسبه پیچیدگی سیکلوماتیک اعمال کنیم:

تعداد گره ها (N): در این کد نکات تصمیم گیری زیر را داریم:

اولین تصمیم، که بررسی می کند آیا مشتری ممتاز است یا خیر.
تصمیم دوم، که بررسی می کند که آیا ارزش کل سفارش بیشتر از 100 است یا خیر.
تصمیم سوم، که بررسی می کند که آیا ارزش کل سفارش بیشتر از 200 است یا خیر.

تعداد لبه ها (E): تعداد یال ها در نمودار کنترل جریان برابر است با تعداد انتقال بین نقاط تصمیم. هر نقطه تصمیم دو مسیر (یکی درست و یکی نادرست) ایجاد می کند، به جز نقطه تصمیم اول که تنها یک مسیر ایجاد می کند. بنابراین:

اولین تصمیم 2 مسیر ایجاد می کند.
تصمیم دوم 2 مسیر ایجاد می کند.
تصمیم سوم 2 مسیر ایجاد می کند.

تعداد کامپوننت ها (P): این کد دارای یک جزء واحد است زیرا هیچ قسمت قطع شده ای در جریان کنترل وجود ندارد.
M = E - N + 2P
M = (2 + 2 + 2) - (3) + 2(1) = 6 - 3 + 2 = 5

پیچیدگی سیکلوماتیک کد 5 است. این به این معنی است که کد دارای 5 مسیر مستقل ممکن است که سطح متوسطی از پیچیدگی را نشان می دهد. پایین نگه داشتن پیچیدگی سیکلوماتیک برای تسهیل نگهداری و تست کد مهم است.

همانطور که در مثال بالا دیدیم، پیچیدگی 5 داریم که مورد نارضایتی نیست. اما هنوز به این سوال پاسخی نداده ایم که “چگونه اگر و غیره را کاهش دهیم؟”

چگونه اگر و غیره را کاهش دهیم؟
راه‌های مختلفی برای انجام این کار وجود دارد، با در نظر گرفتن شرایط شما و زمان تحویل پروژه. ما در مورد 4 استراتژی صحبت خواهیم کرد، اما این استراتژی ها بسیار جامع هستند.

1. بازگشت زودهنگام: شاخه های غیر ضروری را حذف می کند.
2. جداول تصمیم: شرایط را با فرهنگ لغت یا قواعد جایگزین می کند.
3. چند شکلی: منطق را بر اساس نوع مشتری تقسیم می کند.
4. تفویض وظایف: منطق تخفیف را در بر می گیرد و کد را ماژولارتر می کند.

در پست های بعدی هر استراتژی را توضیح خواهیم داد و کدهای مدل سازی شده بر اساس مثال بالا ارائه خواهند شد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا