برنامه نویسی ماژولار چیست؟
زمان تقریبی مطالعه این مقاله: ۸ دقیقه
سلام به دوستان عزیز میکرولرنی 😊😊😊
بعد از ۵ سال که از انتشار این مقاله گذشته تصمیم گرفتم در ۱۲ اردیبهشت ۱۴۰۰ آپدیتش کنم و نکات مفیدی به اون اضافه کنم. حتما متوجه شدید که موضوع این مقاله برنامه نویسی ماژولار هست. مفهومی که شاید خیلی از ماها به عنوان یک برنامه نویس چیز زیادی از اون ندونیم. پس اگه دلتون میخواد درباره ماژولهای نرم افزاری اطلاعات به دست بیارید و بفهمید که چطوری میشه ماژولار کدنویسی کرد با این مقاله جذاب و آپدیت شده از میکرولرن، مرجع برنامه نویسی همراه باشید.
فهرست مطالب
بررسی کلی
اگر در حال خواندن این مقاله هستید، به احتمال زیاد یک برنامه نویس یا دست کم علاقهمند به برنامه نویسی هستید. آیا یک برنامه نویس حرفهای(Senior) هستید یا آماتور(Junior)؟ البته آماتور بودن اشکالی ندارد، چرا که همه برنامه نویسان حرفهای روزی آماتور بودهاند. اما مشکل در این است که آماتور بمانید. در این مقاله می خواهم یکی از روشهای حرفهای شدن را معرفی کنم.
یکی از کارهایی که شما را به سمت حرفهای شدن پیش میبرد، برنامه نویسی به سبک ماژولار است. اما بگذارید در همین اول مقاله یک تعریف از برنامه نویسی ماژولار ارائه کنم. برنامه نویسی ماژولار یک تکنیک طراحی نرم افزار است که طی آن، عملکرد یک برنامه به ماژولهای مستقل و قابل تعویض تفکیک میشود. هر کدام از این ماژولها شامل همه موارد لازم است تا بتواند یک بخش از برنامه اصلی را اجرا کند.
با ارائه این تعریف که ممکن است کمی هم برای شما مبهم به نظر برسد، وارد توضیحاتی میشویم تا موضوع را بهتر درک کنید.
شرایط استفاده از کدنویسی ماژولار
در این بخش به شرایطی اشاره میکنیم که حتما باید در آن از سبک کدنویسی ماژولار کمک گرفته شود. شرایطی که در آن بدون استفاده از این روش، به مشکلات بسیاری بر میخوریم.
رقابت در بازار
برنامهنویسی که مجبور باشد برای هر پروژه جدید تمام کدها را بنویسد نمیتواند در بازار رقابت کند، چرا که برای هر پروژه باید از صفر کدنویسی کرده و در نتیجه زمان اجرای پروژهها طولانی شده و از رقبا عقب میافتد. ممکن است این تصور برای شما پیش بیاید که هر پروژه متفاوت از پروژه دیگر است و باید برای آن کد نویسی جداگانهای انجام داد. بله همین طور است اما بسیاری از قسمتهای کوچک در پروژههای مختلف وجود دارد که به هم دیگر شباهت دارند. به عبارت دیگر اگر یک بار کدی را نوشته باشید به راحتی میتوانید در پروژههای بعدی با کمی تغییر از آن استفاده کنید.
تحولات درون سازمانها
کارکنان یک مجموعه تغییر میکنند و حتی اگر ثابت باشند، حافظهی انسان بازهی زمانی محدودی را به خاطر میآورد. هر سیستمی نیاز به ارتقا و به روز رسانی دارد و اگر برنامهی آن به شیوهی درستی نوشته و مستند سازی نشده باشد، درک و تغییر آن مشکل میشود.
همچنین گاهی لازم است پروژههای بزرگ به اجزای کوچکتری خرد شوند و هر بخش را فرد و یا تیم مستقلی پیادهسازی کند. با استفاده از سبک برنامه نویسی ماژولار، میتوانیم اجزای نرم افزاری و کتابخانههایی ایجاد کنیم که به سادگی قابل تغییر و قابل استفاده در پروژههای دیگر هستند.
ویژگیهای زبان برنامه نویسی
اما باید زبان برنامه نویسی هم قابلیت استفاده مجدد از کدها را داشته باشد. زبانی که استفاده میکنید، باید توانایی ایجاد کتابخانههای انعطلاف پذیر را داشته باشد تا برنامه نویس بتواند از کتابخانههایی که آزمایش (test)، اشکال زدایی (debug) و تایید (verify) شدهاند در پروژههای آینده استفاده کند.
بنابراین برنامهی خوب، برنامهای است که امکان درک و تغییر آن در هر زمان وجود داشته باشد (نه فقط به وسیلهی طراح اولیه، بلکه به وسیله افراد دیگر). علاوه بر موارد فوق لازم است به این نکته توجه شود که در اجرای پروژههای بزرگ و پیچیده اگر از سبک برنامه نویسی مناسبی استفاده نشود، نگهداری و اشکال زدایی برنامه بسیار مشکل میشود، هزینهها افزایش مییابد و امکان موفقیت طرح به حداقل میرسد.
اکنون که تعریف برنامه نویسی ماژولار و شرایطی که در آن، این روش کدنویسی استفاده میشود را درک کردید؛ میتوانیم کمی عمیقتر بحث کنیم.
شیوهی اجرا
اکنون زمان آن رسیده تا با ارائه مثالهایی ساده، به شما شیوهی اجرای برنامه نویسی ماژولار را نشان دهیم. معمولا کوچکترین جزئی که در یک برنامه وظایف مهمی را اجرا میکند تابع نام دارد. تابع یک وظیفه اختصاصی دارد. بنابراین دادههایی را از قسمتی از برنامه دریافت کرده، پردازش میکند و به قسمت دیگری از برنامه تحویل میدهد.
همانطور که تا حدودی به آن اشاره کردیم، این وظایف در برنامهها و پروژههای مختلف تکرار میشوند. پس میتوانیم یک بار آنها را در یک برنامه تعریف کرده و بنویسم. سپس بارها مورد استفاده قرار دهیم. اکنون میخوایم تعریف اولیه یک تابع نمونه را بنویسیم. برای اجتناب از پیچیدگی از زبان برنامه نویسی C استفاده میکنیم. ابتدا به شکل زیر، در یک فایل با نام sample.c یک تابع را پیاده سازی میکنیم:
...include#
;char sample_var
char sample_function(void)
}
function body//
{
سپس در فایلی به نام sample.h که همان هدر فایل است، تعاریف لازمه را درج میکنیم تا زمانی که ماژولها زیاد شدند، شناسایی منابع تعاریف ما سادهتر باشد.
;extern sample_var
;()extern sample_function
پس از تعریف تابع sample_function در برنامه، میتوانیم هرجایی که در محدودهی این تابع باشد از آن استفاده کنیم. بنابراین در تابع main اقدام به استفاده از آن خواهیم کرد.
...include#
int main(void)
}
;char var
;()var = sample_function
function body//
{
تا اینجا یک ماژول خیلی ساده ساختیم و در تابع اصلی از آن استفاده کردیم. اکنون میتوانیم آن را از طریق کتابخانه یا روشهای دیگر به سایر برنامهها انتقال داده و از آن استفاده کنیم. دقت کنید که فردی که از این ماژول استفاده میکند، لزوما نباید از محتوا و عملکرد آن خبر داشته باشد.
بلکه همین که بداند آرگومانهایی که باید به پارامترهای ماژول بدهد چیست و در نهایت چه عملیاتی روی آنها انجام میشود کافی است. در واقع برنامه نویس میداند که چه خروجی باید از ماژول انتظار داشته باشد.
با استفاده از فایل های سورس (source) و هدر (header) در زبان C توانستیم تا حدودی به شیوهی ماژولار برنامه نویسی کنیم. شما میتوانید در پست کتابخانه نویسی در زبان C با مفهوم برنامه نویسی ماژولار در این زبان آشنا شده و به صورت عملی کتابخانه نویسی را تمرین کنید.
برتریهای برنامه نویسی ماژولار
زمانی که در یک کار واقعی برنامه نویسی درگیر میشوید؛ شرایط با کدنویسیهای تک نفره و فری لنسری بسیار متفاوت خواهد بود. چرا که در این شرایط با یک کد بسیار حجیم و با ابعاد مختلف درگیر خواهید بود که از عهده انجام یک فرد خارج است. چنین کدی توسط گروه نوشته شده و باید قابلیت خطای یابی و رفع خطای آن از قبل پیش بینی و پیاده سازی شده باشد.
هم چنین باید اعضای مختلف بتوانند کدهای خودشان را با هم ترکیب کرده و نرم افزار نهایی را تولید کنند. البته در آینده هم باید این نرم افزار حفظ و نگهداری شده و ارتقا داده شود. اینها تنها گوشهای از مزیتهای این سبک برنامه نویسی است. در ادامه چند مورد را عمیقتر ارزیابی خواهیم کرد.
قابلیت خوانا بودن برنامه
برنامههای ماژولار ابتدا سازماندهی میشوند و هر برنامه نویس بخش خاصی از کد را مینویسد. بنابراین هرکس روی وظیفهی تخصصی خودش متمرکز است. هم چنین سایر برنامه نویسان هم در صورتی که لازم باشد در بخشهای دیگر فعالیت کنند، با استفاده از این شیوه قادر به فهم وظیفه کد و ادامه کار افراد قبلی خواهند بود. بنابراین ابهام در فهم کد به حداقل خواهد رسید.
خطای یابی روان
تکنیک ماژولار کمک بزرگی به خطای یابی و رفع خطاها میکند. چرا که در زمان رخ دادن خطا، با صرف حداقل زمان و هزینه میتوان به منبع خطا دسترسی پیدا کرده و نسبت به رفع آن اقدام کرد. در صورتی که برنامه ماژولار نوشته نشده باشد، باید در میان انبوهی از خطوط کد به دنبال خطا گشت که کاری غیر بهینه است.
نگهداری از برنامه
وقتی یک سازمان اقدام به نوشتن برنامهای میکند، قطعا به فکر نگهداری و به روزرسانیهای آن در آینده نیز است. چرا که در طی زمان نیازهای جدیدی برای مشتریان تعریف شده و به روزرسانی الزامی است. در برنامههای ماژولار کاملا مشخص است که چه ماژولهایی باید تغییر کرده و آپدیت شوند. این در حالی است که خیلی از قسمتهای کد نیازی به هیچ گونه تغییر ندارند. حالا این ویژگی را با برنامه غیر ماژولار مقایسه کنید. برای یک به روزرسانی ساده ممکن است مجبور باشید بخش بزرگی از کد را تعویض کنید.
کدنویسی تیمی
وقتی ماژولار کد بزنید به راحتی تقسیم وظایف شده و مدیر پروژه هر کسی را برای بخشی در نظر میگیرد. بنابراین افراد ماژولهای مرتبط با حوزه خودشان را نوشته و در نهایت توسط افراد با سابقه سازمان، این ماژولها ترکیب شده و نرم افزار نهایی تولید میشود.
مفهوم ماژول نرم افزاری
در این بخش مفهوم ماژول نرم افزاری را با جزئیات توضیح میدهیم. ماژول به معنای مولفه و یا جزئی از برنامه است که خود شامل تعدادی تابع مرتبط با یکدیگر است. معمولا مجموع توابعی که داخل یک ماژول قرار میگیرند عملکرد خاصی را پیاده سازی میکنند. برخی از ماژولها فرآیندی را بر روی داده انجام میدهند.
در این نوع ماژولها، بخشی از برنامه به عنوان مشتری، سرویسی را از ماژول درخواست میکند و ماژول آن درخواست را پاسخ میدهد. برخی از ماژولها نیز ارتباط برنامه با یک سخت افزار داخلی (مانند پورت های سریال، مبدل آنالوگ به دیجیتال و …) یا خارجی (مانند نمایشگر LCD، صفحه کلید، سنسور و …) را برقرار میکنند.
هر ماژول شامل دو بخش پیاده سازی و واسط (Interface) است. در بخش پیاده سازی، بدنهی توابع قرار میگیرند و شامل چگونگی انجام یک موضوع است. در بخش واسط نحوهی استفاده از توابع، در اختیار کاربر (مشتری سرویس) قرار میگیرد. این بخش، شامل اطلاعاتی است که برای استفاده از یک موضوع مورد نیاز است.
یکی از دلایل اساسی استفاده از ماژول این است که بتوان بخش های لازم از یک موضوع را مشخص و بخشهای غیر ضروری را پنهان کرد. به پنهان سازی جزئیات غیر ضروری، Abstraction گفته می شود. از این مفهوم در طراحی بسیاری از وسایل استفاده میشود.
به عنوان مثال زمانی که یک خودرو را می رانیم لزوما نیاز نیست که از نحوهی عملکرد موتور و سایر اجزا آن آگاهی داشته باشیم، بلکه کافی است که واسط استفاده موتور(شامل پدال های کلاچ، ترمز و گاز) در اختیارمان باشد و نحوه ی به کارگیری این واسط را بدانیم. در برنامه نویسی نیز، Abstraction مفهوم بسیار ارزشمندی است که در زبان های شی گرا (مانند java و ++C) به شکل عالی و در زبان های ماژولار به شکل ابتدایی از آن پشتیبانی شده است.
سخن پایانی
خب میکرولرنیهای عزیز رسیدیم به پایان یک مقاله عالی. هرچی که لازم بود را براتون گفتم تا متوجه بشید که چقدر مهمه که ماژولار کد بزنید. مهم نیست دارید برای میکروکنترلر و سخت افزار کد میزنید یا برای وب یا حتی هوش مصنوعی. در هر حوزهای که کار میکنید این نکته را رعایت کنید و جوری کد بزنید که تا مدتها بتونید از این کدها استفاده کنید.
اگه مقاله براتون قابل درک نبود اصلا نگران نباشید، چون لازمه چند بار دیگه با دقت بخونید و خلاصه برداری کنید. یادتون نره که ما را به دوستان خودتون هم معرفی کنید، مطالبمون حتما برای اونها هم مفیده.
درباره احسان عبداللهی
مدیر و موسس میکرولرن | برنامه نویسی پاسخی ظریف به یک نیاز در دنیای واقعی هست.
نوشته های بیشتر از احسان عبداللهیمطالب زیر را حتما مطالعه کنید
دوره های آموزشی مرتبط
آموزش جنگو
آموزش پایتون
آموزش الگوریتم و فلوچارت – تفکر برنامه نویسی
آموزش برنامه نویسی C برای میکروکنترلر
آموزش الکترونیک دیجیتال
11 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام آقای عبداللهی
واقعا سایت خوبی دارید و مقالاتتون خیلی ساده و روان و کامل هستند.
ممنون از شما انشاءالله که با قوت به همین مسیر ادامه بدید.
چقدر خوب نوشته بودید. به جای طولانی کردن مطلب و گیج کردن ما، مختصر و مفید اون چیزی را که باید گفتید.
مرسی از میکرولرن
سلام.گل پسر کارت درسته.دمت گرم.چهره شما بینهایت آشناست واسم.نمیدونم همکلاسی یا جای دیگه...ولی هرچی هست کارت درسته.تاحالا تو هیچ سایت فارسی پیام نزاشتم،چون مطالبشون بدردم نخورده،ولی شما خصوصأ lcd کاراکتری رو تقریبأ کامل و مفید گفتین…سربلند و سالم باشین.مرسی.محمد هاشمی
سلام
بسیار ممنون از شما برای آموزشی که ارائه کردید. سلامت، شاد، پیروز باشید
سلام اقا احسان ضمن تشکر از شما واقعا سایت عالی و پرباری دارین امیدوارم قسمت اموزش arm هم به اموزش هاتون اضافه کنید
سلام به شما دوست عزیز 🙂
ممنون از لطف شما. حتما همینطوره و آموزش های بسیاری برای شما دوستان در راهه که در زمان مناسب اطلاع رسانی میشه.
ما خیلی خوشحال میشیم که نظرات و پیشنهادهای خودتون برای ارتقا سطح مطالب موجود در میکرولرن رو به ما اطلاع بدید
آقا خیلی عاالی بود ممنونم
ممنون دوست عزیز. اگه سوالی داشتید حتما در بخش نظرات بپرسید 🙂
واقعا دستخوش خیلی عالیه
سایت خیلی مفیدی دارید مخصوصا الکترونیکش
لطفا اموزها رو ادامه بدید
نظر لطف شما هست دوست عزیز. حتما آموزش ها با کیفیت بیشتر از قبل ادامه پیدا می کنه. 🙂