اگر به برنامه نویسی و تکنیکهای استاندارد توسعهی نرم افزار علاقهمند باشید، ممکن است عبارت "برنامه نویسی ماژولار" به گوشتان خورده باشد. زمانی که سایز یک برنامه کوچک میباشد، به راحتی میتوانیم کلیهی جزییات آن را به یکباره حفظ کنیم؛ اما، برنامههای کاربردی دنیای واقعی، صد تا هزار برابر بزرگتر از برنامههایی هستند که احتمالاً شما تا کنون نوشته اید (یا شاید حتی روی آن کار کرده باشید). آنها به حدی بزرگ و پیچیده هستند که به خاطر سپردن تمامی جزییات این گونه برنامهها امکانپذیر نیست. همچنین، باید در نظر داشت که آنها توسط برنامه نویسان متعدد و به صورت همزمان نوشته شدهاند. اما آیا پیچیدگی و وسعت برنامههای بزرگ شما را به وحشت میاندازد و نگران هستید که مبادا جزیی از آن را از قلم بیندازید و از عهدهی خطایابی و نگهداری آن برنیایید؟ خوشبختانه دیگر جای نگرانی باقی نیست زیرا راهکاری کلیدی که برای مدیریت پیچیدگی نرم افزارهای بزرگ در سرتاسر دنیا و توسط شرکتهای برنامه نویسی استفاده میشود، تکنیکی به نام برنامه نویسی ماژولار است. در ادامهی این مقاله با برنامه نویسی ماژولار، مزایا و قوانین این روش استاندارد بیشتر آشنا میشویم.
برنامه نویسی ماژولار چیست؟
برنامه نویسی ماژولار با برنامه نویسی ساختارگرا و برنامه نویسی شیگرا ارتباط نزدیکی دارد و هدف مشترکی که در تمامی این تکنیکها وجود دارد، تسهیل ساخت برنامهها و سیستمهای بزرگ نرم افزاری با تجزیهی آن به قطعات کوچکتر است. در برنامه نویسی ماژولار کد برنامه از ماژولها یا واحدهای مختلفی تشکیل شده است که هر کدام از آنها به طور جداگانه تهیه میشوند. این امر به توسعه دهندگان مختلف این امکان را میدهد تا قطعات گسستهای از سیستم را در دست بگیرند و بدون نیاز به درک بقیه، آنها را طراحی و پیادهسازی کنند. ایدهی اصلی برنامه نویسی ماژولار این است که پس از ساخت ماژولهای مستقل و قابل تعویض، میتوان آنها را به یکدیگر متصل کرد تا یک برنامهی کامل را ایجاد کنند؛ بدون اینکه هر توسعه دهنده نیاز به درک همهی کارهای انجام شده توسط سایر توسعه دهندگان تیم، داشته باشد.
ماهیت وجودی برنامه نویسی ماژولار چیست؟
برنامه نویسی ماژولار به دلیل جنبهی انسانی توسعهی برنامه به وجود آمده است. کامپیوترها برای اجرای کد نیازی به واضحبودن کدها ندارند؛ بلکه محدودیتهای شناختی انسانهاست که برنامه نویسان را وادار میکند که در قطعات کوچکتر کد بنویسند.
مزایای استفاده از تکنیک برنامه نویسی ماژولار
همانطور که پیشتر گفتیم، گاهی اوقات، پروژههای بزرگ برنامه نویسان بسیاری را درگیر نوشتن هزاران خط کد میکنند. با کمک برنامه نویسی ماژولار، پیگیری موارد خاص کد، رفع اشکال، سازماندهی و مدیریت و جلوگیری از نوشتن کدهای تکراری در قسمتهای مختلف برنامه با نوشتن کدهایی با قابلیت استفاده مجدد آسانتر میشود. در ادامه مهمترین مزایای ماژولار کردن برنامه را بررسی میکنیم.
اشکالزدایی آسانتر
هنگام اشکالزدایی برنامههای بزرگ، پی بردن به این که باگ موردنظر چه زمانی و چگونه رخ میدهد، دشوار و رمزآلود است. اشکالزدایی در این گونه برنامهها ممکن است زمان زیادی به طول بینجامد زیرا در صورت ماژولار نبودن برنامه، برنامه نویسان ناچارند که کد تمامی خطهای برنامه را بررسی کنند تا منبع ایجاد باگ را بیابند. اما در صورتی که برنامه از ماژولهای مختلفی تشکیل شده باشد، اگر مشکل خاصی در عملکرد برنامه ایجاد شود، برنامه نویسان به راحتی متوجه میشوند که باید کجا به دنبال باگ مورد نظر جستوجو کنند و این کار در زمان کوتاهی انجام خواهد شد.
قابلیت استفادهی مجدد
کدهای ماژولار قابلیت استفادهی مجدد از کد را به برنامه نویسان میدهند. در صورت طبقه بندی اعمال خاص در قالب توابع یا کلاسهای خاص، برنامه نویسان میتوانند هر وقت که لازم باشد دوباره آن عمل را انجام دهند و از آن کد خاص استفاده کنند. اگر کد برنامههای بزرگ به قسمتهای مشخصی سازماندهی نشده باشند، ارجاع به آن، جداسازی یا تکمیل آن کد، دشوارتر و حتی غیرممکن خواهد بود.
خوانایی کد
کد ماژولار یک کد بسیار سازمان یافته است. اما منظور از سازماندهی کد با در نظر گرفتن وظایف چیست؟ این بدان معناست که برنامه نویسان میتوانند با در نظر گرفتن کارهایی که انجام میدهند، هر قسمت از کد را سازماندهی کنند. در نتیجه، آنها میتوانند براساس طرح کلی سازمان خود، کد مورد نظر خود را به راحتی پیدا کرده یا به آن اشاره کنند. اما این همه چیز نیست، سایر برنامه نویسانی که روی کد کار میکنند نیز هنگام خواندن کد، شانس پیروی از طرح اصلی سازمان را دارند. این روش برنامه نویسی، کد شما را برای قابلیت استفاده در بین چندین توسعه دهنده بهینهسازی کرده و سطح سختی آن را کاهش میدهد.
قابلیت اطمینان
تمام مزایایی که تاکنون ذکر کردیم زمانی که در کنار یکدیگر قرار میگیرند، مزیت دیگری به نام قابلیت اطمینان را ایجاد میکنند. کدی که خواناست و اشکالزدایی، نگهداری و اشتراکگذاری آن به راحتی انجام میشود، در آینده با خطاهای کمتری مواجه خواهد شد. قابلیت اطمینان در مورد پروژههای بزرگی که صدها توسعه دهنده روی آن کار میکنند، ضروری است. همهی توسعه دهندگان باید بتوانند با کدهایی که توسط سایر توسعه دهندگان نوشته میشود، به راحتی و سادگی ارتباط برقرار کرده و کار کنند. در واقع میتوان گفت که ماژولارسازی کد و ایجاد قابلیت اطمینان هنگام توسعهی نرم افزارهای پیچیده و بزرگ یک ضرورت است.
قابلیت نگهداری
همانطور که گفتیم استراتژی برنامه نویسی ماژولار، فرآیند توسعهی نرم افزار را به بخشهای قابل کنترلتری تقسیم میکند. گاهی اوقات، هنگام ساخت نرم افزارهای بزرگ، تمرکز روی تکتک بخشهای برنامه دشوار است؛ اما اگر به وظایف کوچکتر فردی تقسیم شود، روند توسعه و نگهداری آن چندان پیچیده و هزینهبر نخواهد بود و اصلاح خطاها و افزودن ویژگیهای جدید به نرم افزار فرآیندی آسان خواهد بود. در واقع به لطف برنامه نویسی ماژولار، برنامه نویسان هنگام نگهداری نرم افزار دچار سردرگمی نمیشوند.
کیفیت و تست نرم افزار
یکی دیگر از مزایای ماژولارسازی برنامه، ارتقاء کیفیت بخشهای تشکیلدهندهی برنامه است. برنامه نویسان در این شرایط، نیازی به نگرانی درمورد برنامهی کلی ندارند و تنها بر کیفیت اجزای خود تمرکز میکنند. در پایان و هنگامی که کد تمامی قسمتها با یکدیگر ترکیب میشوند نیز احتمال بروز خطا کمتر خواهد بود. ماژولار بودن یک نرم افزار، زمان موردنیاز برای تست آن را نیز کاهش میدهد و با تست ماژولهای جدید، نیازی به تست ماژولهای قبلی نیست.
برنامه نویسی گروهی
برنامه نویسی ماژولار با تقسیم کار بین برنامه نویسان متعددی که به صورت موازی فعالیت میکنند، امکان برنامه نویسی گروهی و پیشروی سریعتر فرآیند توسعه را فراهم میکند. در این روش، مدیر پروژه وظایف خاصی را برای هر برنامه نویس مشخص میکند و در پایان اجزای مختلف را برای ایجاد یک برنامهی کامل به یکدیگر متصل میکند.
خصوصیات نرم افزارهای ماژولار – ماژول خوشساخت
بسیاری از برنامه نویسان، استفاده از تکنیک برنامه نویسی ماژولار را به علت مزایایی که پیشتر در مورد آنها صحبت کردیم، ترجیح میدهند. برخی خصوصیات نرم افزارهای ماژولار عبارتند از:
پیش از کدنویسی، برنامهریزی و طراحی برنامه توسط مدیر پروژه یا تحلیلگر سیستم انجام میشود.
کدها در چندین فایل ذخیره میشود.
کدها طولانی نیستند.
کدها به راحتی قابل درک و ساده هستند.
کدهای هر بخش، به راحتی قابل استفاده در برنامههای دیگر نیز هستند.
کنترل کردن متغیرها بسیار ساده است.
نام متغیرها و ماژولها، منطقی و مرتبط انتخاب میشود.
توسعه دهنده میتواند یک متد واحد را ایجاد کرده و از آن در قسمتهای مختلف برنامه، بدون نیاز به کدنویسی مجدد، استفاده کند.
بیشتر بدانیم: Clean Code چیست؟ آشنایی با اصول کدنویسی تمیز در برنامه نویسی
یک مثال از برنامه نویسی ماژولار
زبان C به عنوان یک زبان ساختیافته شناخته میشود؛ چرا که یک مشکل بزرگ را حل کرده است. زبان برنامه نویسی C، مسئله را به ماژولهای کوچکتری که تابع(function) یا رویهی(procedure) نامیده میشوند، تقسیم کرده است و هر کدام از آنها مسئولیت بخش خاصی از برنامه را بر عهده دارند. برنامهای که یک مسئلهی بزرگ را حل میکند، مجموعهای از چندین تابع است. در واقع، ماژولها جزییات اجرا را با یکدیگر به اشتراک میگذارند اما آن را از دنیای خارج از برنامه پنهان میکنند. فرض کنید، ما میخواهیم یک نوع داده Stack را اعلام کنیم و در عین حال میخواهیم اجرا و همچنین ساختار داده را از کاربران پنهان کنیم. ما میتوانیم این کار را با تعریف یک پرونده عمومی به نام stack.h که شامل دادههای عمومی نوع داده Stack و توابع پشتیبانی شده از نوع داده استک است، انجام دهیم. در پرونده هدر فقط باید تعاریف ثابتها، ساختارها، متغیرها و توابع با نام ماژول را درج کنیم. بدین ترتیب شناسایی منبع تعاریف در برنامههای بزرگتر با ماژولهای متعدد، آسان میشود. stack.h:
extern stack_var1;
extern int stack_do_something(void);
اکنون میتوانیم یک پرونده با نام stack.c ایجاد کنیم که شامل پیادهسازی نوع داده stack است:
#include
int stack_var1;
static int stack_var2;
int stack_do_something(void)
{
stack_var1 = 2;
stack_var2 = 5;
}
پروندهی اصلی که میتواند شامل ماژول استک باشد:
#include
int main(int argc, char*argv[]){
while(1){
stack_do_something();
}
}
جمعبندی: ایدهی اصلی برنامه نویسی ماژولار، تقسیم وظایف یک برنامهی بزرگ به چندین زیربرنامهی کوچکتر و مستقل است که هر کدام از آنها توسط توسعه دهندگان مختلف و به صورت همزمان توسعه داده میشوند. برنامه نویسی ماژولار تا حد زیادی با مفهوم OOP (برنامه نویسی شی گرا) توازن دارد و فرآیند اشکالزدایی و نگهدای برنامههای بزرگ را تا حد زیادی ساده میکند. ماژولارسازی نرم افزار برای درک بهتر برنامه نویسان و محدودیتهای شناختی انسانها انجام میشود که مجبور هستند برای خوانایی، کیفیت، نگهداری و اشکالزدایی بهتر برنامهی خود، کدها را به قطعات کوچکتری تبدیل کنند و کامپیوترها برای درک کد نیازی به تقسیم آن به بخشهای کوچکتر ندارند. تجربهی شما از برنامه نویسی ماژولار چیست؟ آیا استفاده از این تکنیک را برای توسعهی پروژههای بزرگ مناسب میدانید؟ نظرات خود را با ما به اشتراک بگذارید.
۱۱ دیدگاه
jak۰۹ آذر ۱۴۰۲، ۰۶:۲۸
prefect
۱۲ آذر ۱۴۰۱، ۱۹:۱۱
سپاس فراوان بابت تهیه این مقاله
KING RAGNAR۰۴ شهریور ۱۴۰۰، ۰۴:۴۵
مرگ از زندگی بهتر است زیرا به دیدار عزیان از دست رفته میرویم...
نازنین کریمی مقدم۱۳ شهریور ۱۴۰۰، ۱۸:۵۱
درود
تا وقتی دنیا این همه چیزای قشنگ داره و زنده ایم، زندگی کنیم :) مرگ همیشه هست اما زندگی کوتاهه.
mom۲۳ بهمن ۱۳۹۹، ۰۳:۳۷
ماژولها رو چطوری میشه به هم متصل کرد؟ چطور با هم ارتباط برقرار میکنند؟
آیا اینجا همون بحث میکروسرویس پیش میاد؟
یعنی برای اتصال ماژولها به هم باید در بستر شبکه با معماری میکروسرویس این کار رو انجام بدیم؟
نازنین کریمی مقدم۲۳ بهمن ۱۳۹۹، ۱۹:۱۶
درود. سوال خیلی خوبی پرسیدید.
حقیقتا خیلی بستگی به زبان برنامه نویسی داره. برای مثال در جاوا اسکریپت، تایپ اسکریپت و یا دات نت و... که معماری MVC وجود داره، کار خیلی راحتتر هست و اغلب از ماژولها تودرتو استفاده میشه. درسته که همیشه این خطر وجود داره که با تغییر یک ماژول کار ماژول دیگه مختل بشه، اما مزایایی که داره بیشتر از معایبشه. پس در کل معماری میکروسرویس رو نادیده میگیرند و از معماری MVC استفاده میکنند (برای مثال به راحتی تگ سلکتور یک کامپوننت رو درون فایل یک کامپوننت دیگر میگذارند) و نهایتا سعی میکنند توابع را با call back و... مدیریت کنند تا تداخلی ایجاد نشه.
اما کار برای زبانی مثل جاوای پایه که به صورت بنیادین از این معماریها استفاده نمیکنه و کلاس بیس هست سخت تره. قبلا برای مدیریت در چنین موقعیتهایی از میکروسرویسها استفاده میشد اما چندسالی هست که حداقل در محیطهای کاری، از فریمورکهای جاوا مثل اسپرینگ و... استفاده میکنند.
am۰۹ آذر ۱۳۹۹، ۱۴:۱۷
خیلی مطلب مفیدی بود متشکرم.
امیرحسین صحرانورد۲۰ آبان ۱۳۹۹، ۱۴:۲۵
واقعا مطلب مفیدی بود.
یه سوال ! چطور تو برنامه هامون ماژولها رو تشخیص بدیم ؟ مثلا یک فروشگاه آنلاین، ماژولهای ما میتونه چی باشه ؟
نازنین کریمی مقدم۲۷ آبان ۱۳۹۹، ۱۱:۱۶
سلام. ممنون که با ما همراه هستید.
خب همونطور که در مقاله گفتیم ماژول برای این ایجاد میشه که کارها تقسیم بشه و کدهای تکراری در هر بخش از کد نداشته باشیم. همین مفهوم ماژول بسته به زبان برنامه نویسی ممکنه کامپوننت و کانتینر و .... هم نامیده بشه که تفاوتهای ریزی با هم دارند اما هدف همه شون یکی هست.
طبق تجربه ای که دارم میتونم اینطوری جوابتون رو بدم که برای اینکه بفهمید یک برنامه دقیقا چه ماژولهایی داره، باید قبلا یک پروژه رو از صفر تا صد پیاده سازی کنید که لم کار دستتون بیاد. اما یک نکته طلایی در تشخیص اینکه کد در چه ماژولی هست وجود داره. این سوال رو از خودتون بپرسید که:
<strong>آیا این کدی که الان دارم مینویسم ممکنه برای بخش دیگه ای از برنامه هم استفاده بشه؟ اگه جواب مثبت بود، یعنی این کد شما باید ماژول بشه.</strong>
برای مثال در پیاده سازی فروشگاه آنلاین، شما یک ماژول برای ارسال پیام تعریف میکنید که برای بخش سفارش، بخش تکمیل خرید، بخش کاربر و... استفاده میشه.