در درسهای قبل برنامهای طرّاحی کردیم که در موقعیّتهایی بیشتر از آن چیزی که برایش در نظر گرفته بودیم کار کرد (میشد شرایط دیگری را ساخت که برنامهٔمان آنجاها کار نکند، ولی... برای این تمرین، دیگر همین قدر بس بود). تا یادم نرفته؛ باید همین جا بگویم که این برنامه برای این بود که با یک دور گشتن توی محیط، به ریبرگ امکان کاوش آن را بدهد. با این که برنامه کوتاه بود و ساختارش هم تا این مرحله میبایست واضح بوده باشد، هدف این برنامه -برای کسی که اوّلین بار آن را ببیند- آن قدرها هم مشخّص نیست. بد نیست که از چندتایی یادداشت در آن استفاده کنیم و یا اسمهای معنادارتری برای تعاریف به کار ببریم. بگذارید با یادداشتها شروع کنیم، کمی بیشتر از آن حدّی که احتمالاً فکرش را میکنیم:
# با گذاشتن یک نشانه نقطهٔ شروع را علامت میزنیم
put()
# مسیری خالی پیدا میکنیم و شروع به حرکت میکنیم
while not front_is_clear():
turn_left()
move()
'''میدانیم که وقتی که به جایی که نشانه را گذاشتیم برسیم، یک بار محیط را دور زده ایم.''''
while not object_here():
if right_is_clear(): # حرکت از منتی الیه سمت راست
turn_right()
move()
elif front_is_clear(): # دیوار سمت راست تا هر جا ادامه داشت برو .
move()
else :
turn_left() # اگه دیوار به سمت چپ ادامه داشت به چپ بچرخ
با این که این طوری منظورمان را برای هر دستور واضح بیان میکنیم، این کار آن قدرها برای خلاصه کردن روش کار مورد استفاده برای حل مسئله (که به اسم الگوریتم شناخته میشود) مفید نیست. برای همین، این یادداشتها آن قدری که دلمان میخواهد برای یک شخص دیگر -که بخواهد کد را بخواند- ممکن است سومند نباشد. وقتی یادداشتها را بخوانیم، متوجّه میشویم که برنامه ۲ قسمت دارد:
مشخّصکردن نقطهٔ شروع؛
راه رفتن در کنار دیوار سمت راست تا رسیدن به نقطهٔ شروع.
بیایید برنامه را طوری بازنویسی کنیم که این دو تا قسمت مشخّصتر بشوند و یادداشتها را هم متفاوتتر بنویسیم:
'''این برنامه کاری میکند که ریبرگ دور محیطش بر خلاف جهت عقربههای ساعت بچرخد و وقتی به نقطه ی شروعش برگشت متوقّف بشود.'''
def mark_starting_point_and_move():
put()
while not front_is_clear():
turn_left()
move()
def follow_right_wall():
if right_is_clear():
turn_right()
move()
elif front_is_clear():
move()
else :
turn_left()
#######
## پایان تعریفهای بالا، اجرای برنامه از این جا به بعد.
#######
mark_starting_point_and_move()
while not object_here():
follow_right_wall()
این یکی واضحتر نیست؟
توجّه: شاید دلتان بخواهد یک رونوشت از ()follow_right_wall
توی کتابخانهٔتان بگذارید تا وقتی لازم داشتید بتوانید دوباره از آن استفاده کنید.
کارمان را با یک مسئلهٔ ساده (دور زدن حول محیط مستطیلی شکل) شروع کردیم و با بهبود تدریجی آن (که به نام اصلاح یا پالایش گامبهگام معروف است) توانستیم برنامهای بنویسیم که میتوانست مسئلههای بسیار مختلفی را حل کند. در هر گام ما فقط تغییرات کمی را اعمال کردیم. از طرفی هم قبل از این که مسئلهها و شرایط پیچیدهتری را در نظر بگیریم؛ بررسی کردیم تا خاطر جمع بشویم راه حلّمان کار میکند، یا نه. همچنین، برای بخشهایی از الگوریتم از اسمهای آشناتری استفاده کردیم که خواندن و احتمالاً فهمیدن برنامه را راحتتر میکرد. این کار، راهبردی است که شما بهتر است در نوشتن برنامههای خودتان از آن استفاده کنید:
مهم
قانون شمارهٔ ۴
گامهایی که باید برای نوشتن یک برنامه طی بشود:
ساده شروع کن؛
هر بار فقط شمار کمی تغییرات ایجاد کن،
بررسی کن که تغییراتی که ایجاد کردی کارها و قسمتهای قبلی را از کار نیانداخته باشد؛
وقتی یادداشتهای مشروحتری را که اضافه میکنی، این یادداشتها طوری نباشند که فقط کار هر دستور را تکرار کنند؛ و
از اسمهای آشنا و واضح استفاده کن.
دو تا قسمت آخر لزوماً معادل قانون شمارهٔ ۲ هستند.
حالا، قبل از این که ادامه بدهید و بروید درس بعد، برنامه را امتحان و در صورت لزوم اصلاح کنید؛ تا از کارکردن برنامهٔ که توی ویرایشگر مطمئن بشوید.