همچنانکه برنامهها بزرگتر و پیچیدهتر میگردند، برای طراحی، کدنویسی، و پشتیبانی دشوارتر میشوند. همانند با هر جد و جهد بزرگ، بیشتر اوقات تفکیک یک وظیفه بزرگ به یک گروه از وظایف کوچکتر، سودمند است.
در این درس، ما تفکیک اسکریپت یکپارچه خود به یک تعداد توابع جداگانه را آغاز خواهیم نمود.
برای آشنا شدن با این اندیشه، بیایید شرح یک وظیفه روزانه را در نظر بگیریم -- رفتن به فروشگاه برای خرید غذا. فرض کنید ما میخواستیم وظیفه را برای مردی از مریخ تشریح کنیم.
اولین تشریح سطح بالای ما شاید چیزی مانند این به نظر بیاید:
این توضیحات پردازش کلی رفتن به فروشگاه را پوشش میدهد، اما مردی از مریخ احتمالاً به جزییات اضافی نیاز خواهد داشت. برای مثال، وظیفه فرعی «پارک ماشین» میتوانست به صورت زیر تشریح گردد:
البته وظیفه «خاموش کردن موتور» دارای چند مرحله از قبیل «بستن سوییچ» و «بیرون آوردن سوییچ» و مانند آن است.
این پردازش شناسایی مراحل سطح بالا و گسترش افزایشی جنبههای جزیی آن مراحل، طراحی بالا به پایین نامیده میشود. این اسلوب، تجزیه وظایف پیچیده بزرگ به وظایف کوچک و ساده بسیار را برای شما میسر میسازد.
همچنانکه اسکریپت ما به رشد ادامه میدهد، ما از طراحی بالا به پایین برای کمک به خود جهت طراحی و کدنویسی اسکریپتمان استفاده میکنیم.
اگر به وظایف سطح بالای اسکریپت خود نگاه کنیم، لیست پایین را تشخیص میدهیم:
تمام این وظایف اجرا میشوند، اما میخواهیم وظایف دیگری اضافه کنیم. اجاز ه بدهید چند وظیفه اضافی بعد از وظیفه شماره ۷ درج کنیم:
خیلی خوب بود اگر فرمانهایی وجود داشتند که این وظایف را انجام میدادند، ما میتوانستیم جایگزینی فرمان را برای قرار دادن آنها در اسکریپتمان به این شکل به کار ببریم:
#!/bin/bash # sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل ##### ثابتها TITLE="System Information for $HOSTNAME" RIGHT_NOW=$(date +"%x %r %Z") TIME_STAMP="Updated on $RIGHT_NOW by $USER" ##### Main cat <<- _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> $(system_info) $(show_uptime) $(drive_space) $(home_space) </body> </html> _EOF_
اگر چه فرمانهایی وجود ندارند که به طور دقیق آنچه را ما نیاز داریم انجام بدهند، ما میتوانیم آنها را با کاربرد
به طوریکه در درس دوم آموختیم، توابع پوسته همچون «برنامههای کوچک در درون برنامهها» عمل میکنند و پیروی از اصول طراحی بالا به پایین را برای ما میسر میسازند. برای افزودن توایع به اسکریپتمان، آن را به این صورت تغییر میدهیم:
#!/bin/bash # sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل ##### ثابتها TITLE="System Information for $HOSTNAME" RIGHT_NOW=$(date +"%x %r %Z") TIME_STAMP="Updated on $RIGHT_NOW by $USER" ##### توابع system_info() { } show_uptime() { } drive_space() { } home_space() { } ##### Main cat <<- _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> $(system_info) $(show_uptime) $(drive_space) $(home_space) </body> </html> _EOF_
یک زوج نکته مهم در باره توابع:
نخست، آنها باید قبل از آنکه شما سعی در استفاده از آنها بنمایید، پدیدار شوند. دوم، بدنه تابع (قسمتی از تابع مابین کاراکترهای
موقعی که یک برنامه را توسعه میدهید، بیشتر اوقات اضافه کردن یک مقدار اندک کد، اجرای اسکریپت، اضافه کردن مقدار دیگری کد، اجرای اسکریپت، و به همین منوال، شیوه مناسبی است. این روش، در صورتیکه شما در کُدتان اشتباه وارد کنید، یافتن و تصحیح آن را آسانتر خواهد نمود.
همچنانکه شما توابع را به اسکریپت خود اضافه میکنید، میتوانید اسلوبی را که
system_info() { # Temporary function stub echo "function system_info" }
به این طریق، اسکریپت ما بازهم به طور موفق اجرا خواهد گردید، ولواینکه ما هنوز دارای یک تابع تکمیل شده system_info نیستیم. ما در آینده کد موقت
علت استفاده ما از یک فرمان echo آن است که ما واکنشی از اسکریپت دریافت میکنیم که بیانگر اجرا شدن توابع است.
بیایید پیش برویم و برای اسکریپتمان
#!/bin/bash # sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل ##### ثابتها TITLE="System Information for $HOSTNAME" RIGHT_NOW=$(date +"%x %r %Z") TIME_STAMP="Updated on $RIGHT_NOW by $USER" ##### توابع system_info() { # موقت stub تابع echo "function system_info" } show_uptime() { # موقت stub تابع echo "function show_uptime" } drive_space() { # Temporary function stub echo "function drive_space" } home_space() { # موقت stub تابع echo "function home_space" } ##### بخش اصلی cat <<- _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> $(system_info) $(show_uptime) $(drive_space) $(home_space) </body> </html> _EOF_