حاسبة التعقيد السيكلومتري
تحسب واجهة برمجة التطبيقات للتعقيد السيكلومتري مقياس مكابي من بنية مخطط تدفق التحكم: تقدّم عدد الحواف وعدد العقد وعدد المكونات المتصلة، فتعيد التعقيد السيكلومتري M = E − N + 2P، أي الحد الأدنى من عدد المسارات المستقلة خطيًا عبر الشيفرة، وحدًّا أدنى لعدد حالات الاختبار اللازمة لتغطية كاملة للفروع.
شغّل الأداة مجانًا
لا يوجد كود مصدري لرفعه ولا محلل لإعداده — ثلاثة أعداد فقط من المخطط الموجود لديك بالفعل، ورقم واحد حتمي ودقيق في المقابل، يُحسب بالطريقة نفسها في متصفحك وعلى شبكتنا الطرفية العالمية في كل مرة.
ماذا يقيس التعقيد السيكلومتري
يقيس التعقيد السيكلومتري، الذي قدّمه توماس مكابي عام 1976، عدد المسارات المستقلة خطيًا عبر مخطط تدفق التحكم في البرنامج. فكل نقطة قرار — جملة if أو حلقة while أو فرع case أو تعبير شرطي — تضيف مسارًا واحدًا، لذا يعكس المقياس مدى صعوبة اختبار جزء من الشيفرة والاستدلال عليه. والقيمة 1 تعني شيفرة خطية بلا أي تفريع، أما القيمة 10 فهي الحد المشار إليه على نطاق واسع الذي يبدأ عنده تقسيم الوحدة. الرقم خاصية من خصائص المخطط لا من خصائص اللغة: فبمجرد رسم مخطط تدفق التحكم لدالة ما، يصبح تعقيدها ثابتًا، وتقيّمه حاسبة التعقيد السيكلومتري هذه مباشرةً من الأعداد الثلاثة للمخطط. ولأن المدخلات مجرد حواف وعقد ومكونات، فهي تعمل مع الشيفرة الزائفة والمخططات الانسيابية والمخططات المصدّرة من أي أداة تحليل ساكن، دون الحاجة إلى مشاركة الكود المصدري نفسه.
الصيغة M = E − N + 2P
يُحسب المقياس بالصيغة M = E − N + 2P، حيث E عدد حواف مخطط تدفق التحكم، وN عدد العقد، وP عدد المكونات المتصلة. وبالنسبة لبرنامج أو دالة واحدة يكون المخطط مكونًا متصلًا واحدًا، فتصبح P = 1 وتختزل الصيغة إلى M = E − N + 2. وعند تحليل عدة دوال غير متصلة معًا — مثل مخططات الاستدعاء لثلاث وحدات منفصلة مرسومة في رسم واحد — يحصي P كل جزء غير متصل، ويحافظ الحد +2P على اتساق النتيجة مع مجموع تعقيدات الأجزاء. كما يعيد المسار الحقل decision_points المعرف بأنه M − 1، وهو يساوي عدد المحمولات في برنامج مهيكل قِيس مخططه. يجب أن تكون المدخلات الثلاثة أعدادًا صحيحة موجبة؛ إذ يرفض الاستدعاء الكسور والصفر والأعداد السالبة والقيم غير الرقمية، لأن مثل هذه الأعداد لا يمكن أن تصف مخطط تدفق تحكم حقيقيًا، وقبولها بصمت سيخفي خطأ قياس في المراحل السابقة.
كيفية استخدام الرقم عمليًا
يحدد التعقيد الحد الأدنى لعدد حالات الاختبار اللازمة لتمرير كل مسار مستقل، لذا تستخدمه الفرق حدًّا أدنى للتغطية عند تخطيط الاختبارات: فالدالة التي فيها M = 7 لا يمكن اختبار فروعها بالكامل بثلاثة اختبارات مهما اختيرت بذكاء. ويغذي أيضًا سياسة مراجعة الشيفرة — فكثير من المؤسسات تعلّم أي دالة يتجاوز تعقيدها حدًّا متفقًا عليه — ومتابعة الدين التقني، حيث يُراقب مجموع التعقيد أو أقصاه عبر قاعدة الشيفرة إصدارًا بعد إصدار. هذه الواجهة هي الخطوة الحسابية في سير العمل ذاك: احسب الحواف والعقد والمكونات من المحلل أو الرسم لديك، وأرسلها، وستحصل على القيمة نفسها في كل مرة، لأن الحساب حتمي تمامًا بلا تقريب ولا استدلالات تقريبية. ويعمل على شبكتنا الطرفية العالمية مقابل $0.002 لكل طلب، ويعمل الكود نفسه مجانًا في متصفحك على هذه الصفحة، بحيث تتحقق من رقم يدويًا وتدفع فقط عندما تؤتمت الفحص في خط أنابيب.
حالات الاستخدام
تحديد حد أدنى لتغطية الاختبارات
حوّل أعداد المخطط من محللك الساكن إلى الحد الأدنى لحالات الاختبار اللازمة لتغطية كل مسار مستقل في دالة.
فرض ميزانية تعقيد في التكامل المستمر
أفشل البناء عندما يتجاوز التعقيد السيكلومتري لوحدة ما العتبة المتفق عليها في الفريق، محسوبًا من الحواف والعقد والمكونات.
مراجعة إجابات الواجبات والامتحانات
تحقق من نتيجة تمرين في هندسة البرمجيات يطلب رقم مكابي من مخطط انسيابي، مع عرض الصيغة في الاستجابة.
الأسئلة الشائعة
كم التكلفة؟
$0.002 لكل طلب. وهي مجانية أيضًا في متصفحك على هذه الصفحة — الكود نفسه يحسب كليهما.
ما الصيغة المستخدمة؟
صيغة مكابي الأصلية M = E − N + 2P، حيث E الحواف وN العقد وP المكونات المتصلة. وبالنسبة لبرنامج واحد P = 1، أي E − N + 2.
لماذا تُرفض مدخلاتي؟
يجب أن تكون الحواف والعقد والمكونات أعدادًا صحيحة موجبة. فالصفر والأعداد السالبة والكسور والقيم غير الرقمية لا يمكن أن تصف مخطط تدفق تحكم حقيقيًا، وتُرفض بوصفها مدخلات غير صالحة.
ما حقل decision_points؟
هو M − 1: عدد عقد المحمولات (القرار) في برنامج مهيكل مخططه لهذا التعقيد. وهو تيسير للفرق التي تعد جمل if والحلقات بدلًا من الحواف.
هل أحتاج إلى إرسال كود مصدري؟
لا. المدخلات ثلاثة أعداد من مخطط تدفق التحكم، لذا لا يغادر الكود المملوك محللك أبدًا — فلا تنتقل سوى مجاميع الحواف والعقد والمكونات.
هل النتيجة حتمية؟
نعم. إنها حسابات صحيحة دقيقة بلا تقريب ولا عشوائية ولا استدعاءات خارجية: الأعداد الثلاثة نفسها تعيد دائمًا التعقيد نفسه.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/math/cyclomatic-complexity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"edges":9,"nodes":8,"components":1}'const res = await fetch("https://api.kit.forhosting.com/math/cyclomatic-complexity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"edges": 9,
"nodes": 8,
"components": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/cyclomatic-complexity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"edges": 9,
"nodes": 8,
"components": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/cyclomatic-complexity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"edges":9,"nodes":8,"components":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"edges":9,"nodes":8,"components":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/cyclomatic-complexity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"edges": 9,
"nodes": 8,
"components": 1
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.cyclomatic_complexity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |