معیار نرم‌افزار ای‌بی‌سی

**معیار نرم‌افزار ای‌بی‌سی**  توسط جری فیتزپاتریک در سال ۱۹۹۷ برای غلبه بر کاستی‌های LOC معرفی شد. این معیار نمرهٔ ای‌بی‌سی را به عنوان یک متغیر سه‌گانه تعریف می‌کند که اندازهٔ مجموعه ای از دستورهای کد منبع (source code) را نشان می‌دهد. نمرهٔ ای‌بی‌سی با شمارش تعداد انتساب‌ها (حرف اِی (A))، تعداد تکالیف (حرف بی (B)) و تعداد شرطی‌ها (حرف سی (C)) در یک برنامه محاسبه می‌شود. نمرهٔ ای‌بی‌سی را می‌توان برای روش‌ها، توابع، کلاس‌ها، ماژول‌ها یا پرونده‌های جداگانه در یک برنامه اعمال کرد.

نمرهٔ ای‌بی‌سی با بردار سه بعدی  نشان داده می‌شود. همچنین می‌تواند به عنوان یک متغیر اسکالر (scalar) معرفی شود، که اندازه ای برداری است، و به صورت زیر محاسبه می‌شود:

:: || = \surd(A^2 + B^2 + C^2)

طبق قرارداد، مقدار ای‌بی‌سی به نزدیکترین دهم گرد می‌شود.

## تاریخچه
مفهوم اندازه‌گیری حجم یک نرم‌افزار برای اولین بار توسط موریس هالستید از دانشگاه پردو در سال ۱۹۷۵ مطرح شد. او پیشنهاد کرد که هر برنامهٔ کامپیوتری عمدتاً از نشانه‌ها یاtokens تشکیل شده‌است: عملگرها (operators) و عملوندها. او به این نتیجه رسید که تعداد عملگر و عملوندهای منحصر به فرد می‌تواند ابزاری برای اندازه‌گیری حجم برنامه باشد. با این حال، این رویکرد برای اندازه‌گیری حجم برنامه مورد استفاده قرار نگرفت.

تعداد خطوط کد (Lines of code) یا LOC یکی دیگر از معیارهای محبوب حجم برنامه بود ولی به عنوان اندازه‌گیری دقیق اندازه برنامه در نظر گرفته نشده بود، زیرا وابسته به نوع و سبک نگارش کدزنی بود.

معیار دیگری به نام معیار عملکرد یا Function Point نیز برای محاسبه تعداد مبادلات ورودی و خروجی کاربر معرفی شد. اما محاسبات این روش نه در مورد عملکرد برنامه و نه در مورد روال‌هایی که در برنامه دخیل بودند اطلاعاتی ارائه نمی‌داد.

معیار ای‌بی‌سی برای غلبه بر کاستی‌های روش‌هایی که در بالا اشاره شده تدوین شد. با این حال، از نمره معیار عملکرد می‌توان برای تکمیل نمره ای‌بی‌سی نیز استفاده کرد.

گرچه مؤلف ادعا می‌کند که این معیار حجم را اندازه‌گیری می‌کند، برخی معتقدند که معیاری برای سنجش پیچیدگی است. البته توانایی معیار ای‌بی‌سی برای سنجش پیچیدگی وابسته به تعریف ما از پیچیدگی دارد.

## تعریف
سه بخش زیر نمرهٔ معیار ای‌بی‌سی را تعریف می‌کنند:
* انتساب: ذخیره یا انتقال داده‌ها به یک متغیر.
* شاخه‌ها: یک شاخهٔ صریح و روشن که خارج از محدوده است.
* شرطی: آزمون بولی یا منطقی.

از آنجا که زبانهای پایه مانند java ,C++ ،C و غیره فقط عملیاتی مانند انتساب متغیرها، فراخوانی توابع و شرایط آزمایش دارند، نمرهٔ ای‌بی‌سی با این مولفه تعیین می‌شود.

اگر برای یک زیرروال بردار ای‌بی‌سی به عنوان  نشان داده شود، به این معنی است که زیرروال دارای ۵ انتساب، ۱۱ شاخه و ۹ شرط است. برای استانداردسازی، شمارش‌ها باید در براکت‌های زاویه ای یا  محصور شده و با همان ترتیب در نمادهای  نوشته شوند.

معمولاً مقایسه اندازه کد منبع با استفاده از مقدار اسکالر راحت تر است. تعداد هر معیار ای‌بی‌سی مشخص است، بنابراین طبق سخن جری فیتزپاتریک ما این سه بخش را متعامد می‌دانیم که اجازه می‌دهد اندازه ای‌بی‌سی مقیاسی همان‌طور که در بالا نشان داده شده محاسبه شود.

نمرات مقیاس ای‌بی‌سی برخی از مزایای بردار را از دست می‌دهد. به جای محاسبهٔ اندازهٔ بردار، مجموع وزن بردارها می‌تواند مقایسه دقیق تری از حجم برنامه ارائه دهد. با این حال نمرات مقیاس ای‌بی‌سی نباید بدون بردارهای همراه ای‌بی‌سی ارائه شود، زیرا مقادیر اسکالر نمایانگر اندازه نیستند.

## نظریه
قواعد خاص برای شمارش مقادیر بردار ای‌بی‌سی به دلیل تفاوت معنایی بین آنها، باید برای زبانهای مختلف متفاوت تفسیر شود.

بنابراین، قوانین محاسبهٔ بردار ای‌بی‌سی بر اساس زبان کمی متفاوت است. ما در زیر قواعد محاسبهٔ متریک ای‌بی‌سی را برای C++ ,C و java تعریف می‌کنیم. بر اساس این قواعد می‌توان قوانین سایر زبانهای ضروری را تفسیر کرد.

### قواعد ای‌بی‌سی برای C
قواعد زیر تعداد انتساب‌ها، شاخه‌ها و شرایط را در معیار ای‌بی‌سی برای زبان C نشان می‌دهد:
# افزایش شمارندهٔ انتساب هنگام:
#* وقوع یک اپراتور انتساب (**=، * =، / =، ٪ =، + =، <<=،>> =، & = ،** **=، ^ =**).
#* وقوع کاهش یا افزایش متغیر (**++ ،**).
# افزایش شمارندهٔ شاخه هنگام:
#* وقوع فراخوانی عملکرد
#* وقوع هر عبارت goto که در سطح لانه سازی یا nesting هدفی عمیق‌تر از سطحی که به آن ارجاع شده داشته باشد.
# افزایش شمارندهٔ شرطی هنگام:
#* وقوع یک عملگر شرطی یا conditional operator (**<،>، <= ،> = == ** **=**)
#* وقوع کلمات کلیدی رو به رو («**دیگری»**، «**مورد**»، «**پیش فرض**»، «**؟**»)
#* وقوع یک عملگر شرطی تکی یا unary.

### قواعد ای‌بی‌سی برای ++C
قواعد زیر تعداد انتساب‌ها، شاخه‌ها، شرایط را در معیار ای‌بی‌سی برای زبان C++ نشان می‌دهد:
# افزایش شمارندهٔ انتساب هنگام:
#* وقوع یک اپراتور انتساب (منحصر کردن تعریف یک متغیر ثابت و انتساب پارامترها پیش فرض) (**=، * =، / =، ٪ =، + =، <<=،>> =، & = ،** **=، ^ =**).
#* وقوع یک عملگر افزایش یا یک عملگر کاهش (پیشوند یا پسوند) (**++ ،**).
#* مقداردهی اولیه یک متغیر یا یک عضو غیر ثابت کلاس یا class member.
# افزایش شمارندهٔ شاخه هنگام:
#* وقوع تماس تابع یا فراخوانی متد کلاس.
#* وقوع هر عبارت goto که هدفی عمیق‌تر از سطح لانه سازی داشته باشد.
#* اپراتورهای «جدید» یا «حذف».
# افزایش شمارندهٔ شرطی هنگام:
#* وقوع یک عملگر شرطی (**<،>، <= ،> = == ** **=**)
#* وقوع کلمات کلیدی زیر («**دیگری**»، «**مورد**»، «**پیش فرض**»، «**؟**»، «**سعی کنید**»، «**گرفتن**»).
#* وقوع یک عملگر شرطی تکی.

### قواعد ای‌بی‌سی برای Java
قواعد زیر تعداد انتساب‌ها، شاخه‌ها و شرط‌ها را در معیار ای‌بی‌سی برای زبان جاوا نشان می‌دهد:
# افزایش شمارندهٔ انتساب هنگام:
#* وقوع یک اپراتور انتساب (منحصر کردن تعریف یک متغیر ثابت و انتساب پارامترهای پیش فرض) (**=، * =، / =، ٪ =، + =، <<=،>> =، & = ،** **=، ^ =،>>> =**).
#* وقوع یک عملگر افزایش یا یک عملگر کاهش (پیشوند یا پسوند) (**++ ،**).
# افزایش شمارندهٔ شاخه هنگام:
#* وقوع تماس تابع یا فراخوانی متد کلاس.
#* وقایع یک اپراتور 'جدید'.
# افزایش شمارندهٔ شرطی هنگام:
#* وقوع یک عملگر شرطی (**<،>، <= ،> = == ** **=**)
#* وقوع کلمات کلیدی زیر («**دیگری**»، «**مورد**»، «**پیش فرض**»، «**؟**»، «**سعی کنید**»، «**گرفتن**»).
#* وقوع یک عملگر شرطی تکی.

## برنامه‌های کاربردی
### استقلال از سبک کدزنی
از آنجا که معیار نمره ای‌بی‌سی بر اساس این ایده ساخته شده‌است که وظایفی مانند ذخیره داده، انشعاب و آزمایش شرطی در آن موجود باشند، این معیار مستقل از سبک برنامه‌نویسی کاربر است.

### تخمین زمان پروژه
محاسبهٔ نمرهٔ ای‌بی‌سی در تخمین زمان مورد نیاز برای تکمیل پروژه کمک می‌کند. این می‌تواند با تخمین تقریبی نمره ای‌بی‌سی برای پروژه و با محاسبهٔ نمرهٔ ای‌بی‌سی برنامه در یک روز خاص انجام شود. با تقسیم نمرهٔ ای‌بی‌سی پروژه بر نمرهٔ ای‌بی‌سی حاصل در یک روز، می‌توان مدت زمان لازم برای اتمام پروژه را بدست آورد.

### محاسبهٔ نرخ اشکال
نرخ اشکال در ابتدا به صورت *تعداد مشکل تفسیم بر خطوط کد محاسبه می‌شد*. با این حال، LOC معیار قابل اعتمادی برای اندازه برنامه نیست زیرا به سبک کدگذاری بستگی دارد. یک روش دقیق تر برای اندازه‌گیری میزان اشکال و شمارش *تعداد اشکال تقسیم بر نمرهٔ ای‌بی‌سی است*.

### مقایسهٔ برنامه
برنامه‌های نوشته شده به زبان‌های مختلف را می‌توان با کمک نمرات ای‌بی‌سی مقایسه کرد زیرا بیشتر زبان‌ها از انتساب‌ها، شاخه‌ها و عبارات شرطی استفاده می‌کنند.

اطلاعات مربوط به شمارش پارامترهای منفرد (تعداد تخصیص‌ها، شاخه‌ها و شرایط) می‌تواند به طبقه‌بندی برنامه به عنوان «داده قوی» یا «عملکرد قوی» یا «منطق قوی» کمک کند. فرم برداری از نمره ای‌بی‌سی می‌تواند بینشی در مورد اصول رانندگی در پشت برنامه ایجاد کند، در حالی که جزئیات در فرم اسکالر نمره گم می‌شوند.

### معیار خطی
نمرات ای‌بی‌سی خطی هستند، بنابراین می‌توان هر پرونده، ماژول، کلاس و عملکرد یا روش را نمره گذاری کرد. به عنوان مثال، نمرهٔ ای‌بی‌سی (حالت برداری) برای یک ماژول مجموع نمرات زیر ماژول‌های آن است. با این حال، نمرات مقیاس ای‌بی‌سی غیر خطی هستند.

## جستارهای وابسته
* پیچیدگی نرم‌افزار یا Software complexity
* ابزار محاسبهٔ پیچیدگی هالستید یا Halstead complexity measures
* پیچیدگی سیکلوماتیک
* پیچیدگی همگام سازی
* معیار نرم‌افزار

## پانویس

## منابع
* *جری فیتزپاتریک (1997). [https://www.softwarerenovation.com/ABCMetric.pdf "Applying the ABC metric to C, C++ and Java"]. گزارش ++C.*
* نرمن ای. فنتون (1991) *[https://www.agileconnection.com/sites/default/files/article/file/2014/Software%20Metrics-%20Successes,%20Failures,%20and%20New%20Directions.pdf "Software Metrics: Successes, Failures and New Directions"]. چپمن و هال.*
* باربارا کیچنهام (دسامبر 1995) *"Towards a Framework for Software Measurement Validation". مبادلات IEEE بر [[مهندسی نرم‌افزار]]. *'21*' (12): 929–944. [[:en:Digital_object_identifier|doi]]:[https://ieeexplore.ieee.org/document/489070 10.1109/32.489070.] [[:en:Semantic_Scholar#S2CID|S2CID]] [https://api.semanticscholar.org/CorpusID:۸۶۰۸۵۸۲ ۸۶۰۸۵۸۲].*

## پیوند به بیرون
* استفاده از ABC Metric در C, ++C و Java 
* ای‌بی‌سی متریک 
* قوانین اندازه و پیچیدگی
* رمزگشایی معیارهای کد روبی
* معیار ای‌بی‌سی
رده:مهندسی نرم‌افزار
رده:ویکی‌سازی رباتیک
رده:معیارهای نرم‌افزارسنجی