به طور کلی، میتوان گفت که منظور از ماژول بخشی از یک چیز است و در صورتی یک شیئ را ماژولار مینامند که از بخشهای مختلف تشکیل شده باشد یا بتوان آن را به بخشهای مختلف تقسیمبندی کرد. برای مثال، سازههایی که با Lego ساخته میشوند یک نمونۀ آشکار از شیئی ماژولار هستند به طوری که میتوان قطعات مختلفی از لِگوها با رنگ و شکل متفاوت را انتخاب کرده و با آنها اشیاء مد نظر خود را ساخت.
در زبان برنامهنویسی پایتون نیز ماژولها بخشهای کوچکی از یک برنامۀ بزرگتر هستند به طوری که هر Module (بخش) یک فایل جداگانه روی هارد کامپیوتر میباشد. در حقیقت، زبان ماژولارِ پایتون این قابلیت را در اختیار دولوپرها قرار میدهد تا با بهکارگیری آن بتوانند یک برنامۀ بزرگ را به چندین ماژول یا فایل جداگانه تقسیم کنند یا یک ماژول کوچک را انتخاب کرده و با توسعۀ کدهای ماژول مربوطه، آن را به یک برنامۀ جامع برای هَندل کردن تَسکهای مد نظر خود مبدل سازند.
به خاطر داشته باشید |
Lego نام تجاری نوعی اسباببازی است که توسط گروه لِگو در شهر Billund دانمارک تولید میشود. محصولات لگو شامل قطعات کوچک رنگارنگی هستند که عموماً پلاستیکیاند و میتوان آنها را به یکدیگر متصل کرده و اجسام گوناگونی ساخت. |
حال سؤالی که پیش میآید این است که «توسعۀ یک اپلیکیشن به صورت ماژولار چه مزیتی دارد و چرا تمام کدهای آن را در یک فایل نمینویسیم؟» که در پاسخ به این سؤال دلایل مختلفی را میتوان نام برد که مهمترین آنها عبارتند از:
- ماژولبندی کدهای اپلیکیشن منجر بدین میشود تا فایلها کوچکتر شوند به طوری که در صورت نیاز میتوان به راحتی قطعه کد مد نظر خود را داخل هر یک از فایلهای مربوطه پیدا کرد (برای مثال، تعریف یک فانکشن در یک فایل کوچک کاری به مراتب آسانتر است تا جستجوی آن در یک فایل حاوی هزاران خط کد!)
- در صورت ایجاد یک ماژول به راحتی میتوان آن را در برنامههای مختلف استفاده کرد (برای مثال، زمانی که به یک فانکشن پرکاربرد احتیاج داریم، با قرار دادن فانکشن مد نظر در یک ماژول جداگانه، امکان استفاده از آن در اپلیکیشنهای دیگر را داشته و بدین ترتیب دیگر نیازی به بازنویسی فانکشن مذکور نخواهیم داشت.)
- همچنین ماژولار بودن یک اپلیکیشن قابلیتی را در اختیار دولوپرها قرار میدهد تا بتوانند برای انجام تسک مد نظر خود ترکیبهای متفاوتی از ماژولها را مورد استفاده قرار دهند و بدین ترتیب نیازی به گنجاندن تمامی ماژولهای مربوطه در اپلیکیشن خود ندارند و بالتبع حجم سورسکد اپلیکیشن کاهش خواهد یافت.
با توجه به دلایل فوقالذکر، پیادهسازی اپلیکیشنها به صورت ماژولار کاری منطقی به نظر میرسد به طوری میتوان فانکشنهای مشابه هم را در یک ماژول جداگانه پیادهسازی کرد یا تمامی فانکشنهای مورد نیاز در برنامۀ مربوطه را درون یک ماژول قرار داد.
حال در ادامه قصد داریم ببینیم که چگونه میتوان در زبان پایتون یک ماژول پیادهسازی کرد. در واقع، ماژول در زبان پایتون فایلی است که کدهای مد نظر خود را در آن پیادهسازی میکنیم که به عنوان مثال کدهای زیر را درون فایلی به نام MyModule.py
ذخیره میکنیم:
# this is the file "MyModule.py"
# we're going to use it in another program
def celsiusToFahrenheit(celsius):
fahrenheit = ((celsius * 9.0) / 5 ) + 32
return fahrenheit
با ذخیرۀ کد فوق، ماژولی تحت عنوان MyModule
ساختیم و درون آن تنها یک فانکشن به نام ()celsiusToFahrenheit
پیادهسازی کردهایم که وظیفۀ تبدیل دما از درجۀ سانتیگراد به فارنهایت را دارا است. در واقع، فانکشن مذکور را با یک پارامتر ورودی تحت عنوان celsius
پیادهسازی کردهایم که در آن گفتهایم مقدار منتسب به متغیر celsius
را در عدد 9 ضرب کرده سپس حاصلضرب را بر عدد 5 تقسیم کند و در ادامه حاصل را با عدد 32 جمع کرده و مقدار به دست آمده از عملیات را به متغیر fahrenheit
منتسب کرده و آن را در خروجی ریترن کند.
اکنون اگر بخواهیم فانکشن تعریفشده در ماژول فوق را در یک برنامۀ دیگر فراخوانی کنیم، ابتدا نیاز است تا به مفسر پایتون اعلام کنیم که فانکشن مربوطه را از چه ماژولی فراخوانی میکنیم که برای این منظور از کیورد import
استفاده کرده و ماژول مذکور را در برنامۀ خود اصطلاحاً ایمپورت (وارد) میکنیم (در واقع، دستور import
این امکان را برای دولوپرها فراهم میآورد تا بدین طریق بتوانند از امکانات ماژول مد نظر در برنامههای دیگر استفاده کنند.) در ادامه فانکشن ()celsiusToFahrenheit
را بر اساس آنچه که در آموزش آشنایی با نحوۀ تعریف و فراخوانی فانکشنهایی با پارامتر ورودی در پایتون آموختیم فراخوانی میکنیم که برای این منظور کد زیر را در نظر میگیریم:
import MyModule
celsius = float(input ("Enter a temperature in Celsius: "))
fahrenheit = MyModule.celsiusToFahrenheit(celsius)
print("That's ", fahrenheit, " degrees Fahrenheit")
همانطور که در کد فوق میبینید، ابتدا کیورد import
و به دنبال آن نام ماژول مرتبط با فانکشن مد نظر خود را آوردهایم و اکنون میتوانیم فانکشن تعریفشده در این ماژول را در تمامی نقاط برنامه فراخوانی کنیم. در ادامه، متغیری تحت عنوان celsius
تعریف کردهایم که قرار است تا درجۀ ورودی توسط کاربر را نگهداری کند بدین صورت که فانکشن از پیش تعریفشدۀ ()input
را فراخوانی کرده و استرینگ «:Enter a temperature in Celsius» را به عنوان آرگومان ورودی به آن دادهایم و از کاربر خواستهایم تا عددی را به عنوان دمایی در واحد سانتیگراد وارد کند و این عدد ورودی را به متغیر celsius
منتسب کردهایم. حال برای فراخوانی فانکشن ()celsiusToFahrenheit
ابتدا نام ماژول مربوطه را آورده و در ادامه یک .
قرار داده و فانکشن مذکور را فراخوانی کرده و عدد ورودی از سَمت کاربر را به آن پاس دادهایم و گفتهایم خروجی حاصل از فراخوانی فانکشن مورد نظر در متغیر fahrenheit
ذخیره شود. در نهایت، فانکشن ()print
عدد ذخیرهشده در متغیر fahrenheit
را با استرینگ تعریفشده کانکت کرده و در خروجی چاپ میکند.
نکته |
برای فراخوانی فانکشن مورد نظر از ماژول مربوطه ابتدا نام ماژول را آورده و پس از آن یک علامت Dot (نقطه) قرار داده سپس نام فانکشن با آرگومان یا آرگومانهای ورودیاش را مینویسیم. |
اسکریپت بالا را در فایلی تحت عنوان Modular.py
ذخیره کرده و آن را اجرا میکنیم که خروجی حاصل از اجرای آن به صورت زیر میباشد:
Enter a temperature in Celsius: 65
That's 149.0 degrees Fahrenheit
توجه داشته باشیم که برای درست کار کردن برنامۀ فوق در زمان اجرا باید آن را در دایرکتوری مربوط به فایل ایمپورتشده قرار دهیم چرا که در غیر این صورت مفسر پایتون نمیتواند فایل ایمپورتشده را پیدا کند و این امر منجر به بروز ارور میگردد که یک نمونه خروجی حاصل از اجرای برنامه خارج از دایرکتوری مربوط به ماژول MyModule
به شکل زیر میباشد:
Enter a temperature in Celsius: 54
Traceback (most recent call last):
File "C:/Users/Admin/Desktop/Modular.py", line 3, in
fahrenheit = MyModule.celsiusToFahrenheit(celsius)
NameError: name 'MyModule' is not defined
همانطور که در سطر آخر میبینیم، با اروری در قالب پیغام «MyModule is not defined» مواجه میشویم بدین معنی که مفسر پایتون قادر بر پیدا کردن ماژول مد نظر نبوده و آن را تعریفنشده میداند.