مهندسی نرم‌افزار بر پایه مؤلفه

مهندسی نرم‌افزار مبتنی بر مؤلفه  با کوته‌نوشت CBSE که به آن توسعه مبتنی بر مؤلفه  با کوته‌نوشت CBD نیز می‌گویند، شاخه‌ای از مهندسی نرم‌افزار است که به بررسی ترتیب جداسازی و تشخیص پیکرپارها براساس ارتباط عملکرد گسترده آن‌ها در محدوده موجود در سراسر یک سیستم نرم‌افزار می‌پردازد . این شیوه برای هر دو روش ساخت نرم‌افزار در کوتاه مدت و بلند مدت سودمند است و همین‌طور برای سازمان‌ها یا موسساتی که بر روی آن سرمایه‌گذاری کرده‌اند.

پیکرپارها را برای ایجاد گرایش سرویسی (خدماتی) یا سرویس‌گرایی یا همان Service Orientation در سرتاسر مهندسی نرم‌افزار به عنوان بخشی از پلتفرم آغازین در نظر گرفته می‌شوند، به عنوان مثال سرویس‌های وب (Web Service) و به‌تازگی هم که معماری سرویس گرا یا Service-Oriented Architecture (به‌طور اختصار به آن SOA نیز گفته می‌شود) که توسط آن یک پیکرپار به عنوان یک سرویس در نظر گرفته می‌شود و در نتیجه دارای ویژگی‌های بیشتری و کاربری‌های بهتری نسبت به یک پیکرپار پیدا می‌کند. پیکرپارها توانایی ایجاد یا استفاده از رویدادها (Events) را بر اساس معماری رویداد محور (Event-Driven Architecture، به‌طور اختصار به آن EDA نیز گفته می‌شود) دارند.

تعریف پیکرپار 
کلمه Component به معنی جزء و پیکرپار است و به صورت تخصصی در علوم رایانه با همان نام خود کامپاننت یا پیکرپار شناخته می‌شود. یک پیکرپار به تنهایی یک بسته نرم‌افزاری، یا یک ماژول (تک‌پاره) است، مانند محفظه‌ای که شامل مجموعه‌ای از توابع یا داده‌های مرتبط می‌شود.

همه فرایندهای سیستم در داخل پیکرپارهای مجزا قرار می‌گیرند به‌طوری‌که تمام داده‌ها و توابع در داخل هر یک از پیکرپارها از نظر مفهوم با یکدیگر ارتباط دارند (به همین ترتیب محتویات کلاس‌ها با هم مرتبط هستند). به همین دلیل است که معمولاً کامپاننت‌ها یا همان پیکرپارها ماژولار (تک‌پاره‌گون) و منسجم هستند. با توجه به اساس هماهنگی کل سیستم، پیکرپارها از طریق واسط‌ها (Interfaces) با یکدیگر ارتباط برقرار می‌کنند. زمانی که یک پیکرپار سرویسی را به دیگر اجزای سیستم ارائه می‌دهد، یک واسط (Interface) مخصوص ارائه آن خدمات و سرویس‌ها مهیا می‌کند که می‌تواند توسط پیکرپارهای دیگر بکارگرفته شود. این رابط (Interface) می‌تواند به صورت یک امضاء از پیکرپار دیده شود. سرویس گیرنده برای استفاده از آن خدمات نیازی نیست که در مورد فعالیت‌های درونی پیکرپار (در هنگام پیاده‌سازی یا implementation) اطلاعی داشته باشد. برای همین موضوع گفته می‌شود که پیکرپارها کپسول شده (encapsulated) هستند. در تصویرهای UML موجود در این مقاله واسط (Interface)های تعریف شده به وسیله خطوطی به شکل آبنبات چوبی (lollipop) به لبه‌های بیرونی پیکرپارهای دیگر متصل شده‌اند.

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

یکی از ویژگی‌های مهم دیگر پیکرپارها قابل تعویض بودن آن‌ها (substitutable) است، به این صورت که یک پیکرپار می‌تواند توسط پیکرپار دیگری جایگزین بشود (در زمان طراحی یا زمان اجرا) البته اگر نیازهای ابتدایی پیکرپار (که به وسیله واسط‌ها یا Interfaces بیان شده‌است) توسط پیکرپار جایگزین تامیین بشود. به این ترتیب پیکرپارها می‌توانند جایگزین یکدیگر بشوند یا با نسخه‌های جدیدترشان بروز شوند یا مثلاً با یک پیکرپار دومی جایگزین بشوند، بدون اینکه لحظه‌ای سیستمی که پیکرپار در آن عمل می‌کند از کار بیفتد.

همانند یک قاعده سرانگشتی می‌توان گفت که برای مهندسی جایگزینی پیکرپارها، پیکرپار B می‌تواند بلافاصله جایگزین پیکرپار A شود، اگر که پیکرپار B حداقل‌های پیکرپار A را مهیا کند، و اینکه بیش از چیزهایی (از قبیل داده‌های ورودی) که پیکرپار A استفاده می‌کرد برای انجام عمل خود از مورد اضافه دیگری استفاده نکند.

پیکرپارهای سازنده یک نرم‌افزار غالباً به صورت اشیاء یا مجموعه‌هایی از اشیاء (در برنامه‌نویسی شیء گرا یا Object-Oriented Porgramming)، در برخی موارد به شکل کدهای باینری یا دودویی یا به صورت متون، که در این صورت به یک زبان توصیفی میانی یا Interface Description Language نیاز دارند به این ترتیب ممکن است پیکرپارها به صورت خودکار از پیکرپارهای دیگر م. جود در رایانه به وجود بیایند.

زمانی که یک پیکرپار در دسترس است ویا اینکه در تمام بستر اجرایی یا در شبکه به اشتراک گذاشته شده‌است تکنیک‌هایی مانند تسلسل (Serialization) یا ترتیبی (Marshalling) بکار گرفته می‌شوند تا پیکرپارها بتوانند به هدف نهایی خود برسند و فعالیت مورد نظر را انجام دهند.

بازمصرفی (Reusability) یک ویژگی مهم از بالا بودن کیفیت پیکرپارهای نرم‌افزاری است. یک پیکرپار نرم‌افزاری باید به صورتی طراحی و پیاده‌سازی بشود که بتوان از آن در برنامه‌های مختلف به تعداد زیاد مجدداً استفاده کرد و به زبان معمول باید چندبار مصرف باشد.

این که بتوانید پیکرپارهای بازمصرف (Reusable) درست کنید نیاز به تلاش‌های قابل توجه و داشتن اطلاعات کافی برای نوشتن یک پیکرپار دارد. پیکرپارها برای استفاده به موارد زیر نیاز دارند:
 کاملاً مستند شده باشند.
 کاملاً تست شوند.
 قوی باشند (Robust)، با چک کردن اعتبار ورودی‌هایی که به آن داده می‌شود.
 قادر به برگرداندن پیام خطا یا کدها باشند.
 با آگاهی به این که از آن برای موارد پیش‌بینی نشده‌استفاده خواهد شد، طراحی شده باشد.

Clemens Szyperski و David Messerschmitt ۵ شرط‌های زیر را برای یک پیکرپار نرم‌افزاری تعیین می‌کنند:
 چندین کاره بودن
 دارا نبودن یک زمینه خاص
 قابل نوشتن با بقیه پیکرپارها
 مخفی شده مثلاً کامپیوتری که داده‌ها را ارسال می‌کند مشخص نباشد
 یک واحد مستقل استقرای و نسخه‌ای

به عبارتی ساده‌تر یک پیکرپار چیزی است که به صورت خاص نوشته شده باشد و مهم هم نیست که چه خصوصیاتی داشته باشد.

در دهه ۱۹۶۰ ما کتابخانه‌های زیر روال را بنا کردیم که در مهندسی آنتن‌سازی و کاربردهای علمی مورد استفاده قرار می‌گرفته‌است.
در این کتابخانه‌ها الگوریتم‌های پیشرفته به صورت مؤثر استفاده می‌شده‌است ولی قلمرو محدودی از کاربردها داشت. امروزه پیکرپارهای چندبار مصرفی هم مراحل و هم اطلاعات را شامل می‌شوند. این عمل مهندس نرم‌افزار را قادر به ساخت کاربردهای جدید از قسمت‌های دوباره استفاده شده می‌کند.
پیکرپارهای نرم‌افزاری از زبان‌های برنامه‌نویسی که دارای لغات محدود، گرامر صریح و قانون‌های ترکیب و معناشناسی می‌باشند تشکیل می‌شود. در پایین‌ترین سطح، زبان ساختار سخت‌افزار را منعکس می‌کند. در سطح متوسط یا میانی، یک زبان برنامه‌نویسی مثل سی یا اسمال تاک برای ساخت شرح رویه برنامه استفاده می‌شود؛ و در بالاترین سطح زبان از نمادهای گرافیکی یا نشان‌های دیگر برای ارائه نیاز برای راه حل استفاده می‌کند. اینجا ساختارهای اجرائی خود به خود به وجود می‌آیند.
وقتی یک برنامه‌نویس خوب برنامه قابل نگهداری، با اسناد برنامه می‌نویسد. یک ماشین می‌تواند یک استفاده عالی از حافظه و سرعت بالا در اجرا را بدهد؛ ولی زبان متوسط برنامه‌نویس و برنامه را وابسته به ماشین می‌کند. این‌ها زبان‌های روندی می‌باشند. در زبان‌های غیر روندی یک برنامه با مشخص کردن نتیجه احتیاج به دست یابی به آن را داراست. نرم‌افزار پشتیبانی این خصوصیات را به کدهای قابل اجرا در ماشین تبدیل می‌کند.
این بر مبنای تئوری‌های اشیای نرم‌افزار، معماری نرم‌افزار، استخوان بندی نرم‌افزار و الگوهای طراحی و تئوری‌های برنامه‌نویسی شیءگرا و برنامه‌نویسی طراحانه آن ساخته شده‌است. این ادعا می‌کند که پیکرپارهای نرم‌افزاری مثل نظر پیکرپارهای سخت‌افزاری برای مثال در مخابرات می‌تواند در نهایت مورد استفاده قرار بگیرد.

تاریخ 
نظریهٔ «نرم‌افزار باید پیکرپارای باشد از پیکرپارهای از پیش‌ساخته شده» برای اولین بار در دستور داگلاس مکتوری در کنفرانس ناتو که موضوع آن مهندسی نرم‌افزار بود در سال ۱۹۶۸ به اسم تولید انبوه نرم‌افزار به چاپ رسید. این کنفرانس برای مقابله با مثلاً بحران نرم‌افزاری برگزار شد.
فرمان و فیلترهای گنجایشی ثانویه او در سیستم‌عامل یونیکس اولین اجرا در پیدایش این نظر بود.
مفهوم مدرن پیکرپار نرم‌افزار به‌طور گسترده با براد کوکس که آن‌ها را ای‌سی‌های نرم‌افزاری می‌نامید و شروع به تولید و فروش آن‌ها با اختراع برنامه ابجکتیو-سی کرد ارائه شد.
آی‌بی‌ام در اوایل ۱۹۹۰ با سیستم مدل شی‌گرایی پیشرو این زمینه شد. بعضی‌ها می‌گویند که مایکروسافت با گسترش واقعی پیکرپارهای نرم‌افزاری با اوال‌ای و کام هموار کرده‌است که امروزه چندین مدل از پیکرپارهای نرم‌افزاری موفق موجود است.

تفاوت‌ها با برنامه‌نویسی شیءگرا 
نظریه در برنامه‌نویسی شیءگرا به این گونه‌است که نرم‌افزار باید با توجه به مدل‌های موضوع‌های حقیقی و فرضی که ارائه می‌کند نوشته شود. برنامه‌نویسی شیءگرا و ترتیبات مرتبط با طراحی شیءگرا و آنالیز شیءگرا روی ساختن فعل و انفعالات واقعی تمرکز کرده و سعی می‌کند فعل‌ها و اسم‌هایی بسازد که بتوان آن‌ها را به صورت مستقیم و شهودی برای کاربران نهایی و برنامه هائی که آن‌ها را به صورت کد برای کاربران نهائی تبدیل می‌کنند استفاده کرد.
در مقایسه نرم‌افزارهای پیکرپار ای چنین فرضیاتی درست نمی‌کنند و بجای آن می‌گوید که نرم‌افزارها باید از پیکرپارهای از پیش‌ساخته شده به هم چسبیده استفاده کرد مثل رشته‌های الکترونیک و مکانیک. با قبول اینکه توضیحات خوب پیکرپارها برعکس موضوعات و اشیاء می‌تواند در مقابل شناخت حضوری و شهودی باشد.
حتی بعضی از همسالان پیکرپارهای نرم‌افزاری را یک الگوی جدید برنامه‌نویسی می‌دانند: برنامه‌نویسی شیءگرا.
بعضی‌ها بر این عقیده آن که این تفاوت‌ها را دانشمندان کامپیوتر پیشین ساخته‌اند. با نظریه Donald Knuth دربارهٔ برنامه‌نویسی بر مبنای سواد که به صورت خوشبینانه همگرایی بین مدل هلی رسمی و شهودی را فرض می‌کند، نظریه دیکسترا در مقاله The Cruelty of Really Teaching Computer Science، (بیرحمی تدریس واقعی علم کامپیوتر) بیان می‌کند که برنامه‌ریزی فقط یک شاخه ساده از ریاضیات است.
در دو حالت، این دو عقیده و نظر باعث بحث‌های آکادمیک زیادی در مورد مزایا و معایب این دو دیدگاه و راهبرهای ممکن برای ترکیب این دو گردید. از نظر بعضی‌ها این دو رقیب یکدیگر نبوده و فقط دو راه حل متفاوت با دیدگاه‌های متفاوت برای حل یک موضوع هستند.
برای نوشتن یک برنامه احتیاج به تلاش‌های بسیار زیاد و آگاهی فراوان است که بتوانند بارها استفاده شود. هر جز نیاز به:
کاملاً مستند باشد
بیشتر آزمایش شود
قادر به چک کردن ورودی‌های بزرگ باشد
بتواند پیام‌های خطای مفید را به موقع نشان دهد.
با یک آگاهی که این برنامه می‌تواند برای استفاده‌های پیش‌بینی نشده‌استفاده شود.
یک مکانیزم برای جبران کردن تلاش کسانی که روی این برنامه سرمایه‌گذاری کرده‌اند.

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

منابع 

 Brad J. Cox, Andrew J. Novobilski: Object-Oriented Programming: An Evolutionary Approach. 2nd ed. Addison-Wesley, Reading 1991 
 Bertrand Meyer: Object-Oriented Software Construction. 2nd ed. Prentice Hall، ۱۹۹۷.
 Clemens Szyperski: Component Software: Beyond Object-Oriented Programming. 2nd ed. Addison-Wesley Professional, Boston 2002 
 George T. Heineman, William T. Councill, Component-Based Software Engineering: Putting the Pieces Together. Addison-Wesley Professional, Reading 2001 

مهندسی نرم‌افزار بر پایه مولفه
برنامه‌نویسی شیءگرا
معماری نرم‌افزار
مهندسی نرم‌افزار