فهرست عناوین

موضوع قبلی

27. پالایش‌ها: بخش ۵

موضوع بعدی

29. شگفتی‌ها

28. قانون شمارهٔ ۴

در درس‌های قبل برنامه‌ای طرّاحی کردیم که در موقعیّت‌هایی بیشتر از آن چیزی که برایش در نظر گرفته بودیم کار کرد (می‌شد شرایط دیگری را ساخت که برنامهٔمان آن‌جاها کار نکند، ولی... برای این تمرین، دیگر همین قدر بس بود). تا یادم نرفته؛ باید همین جا بگویم که این برنامه برای این بود که با یک دور گشتن توی محیط، به ریبرگ امکان کاوش آن را بدهد. با این که برنامه کوتاه بود و ساختارش هم تا این مرحله می‌بایست واضح بوده باشد، هدف این برنامه -برای کسی که اوّلین بار آن را ببیند- آن قدرها هم مشخّص نیست. بد نیست که از چندتایی یادداشت در آن استفاده کنیم و یا اسم‌های معنادارتری برای تعاریف به کار ببریم. بگذارید با یادداشت‌ها شروع کنیم، کمی بیشتر از آن حدّی که احتمالاً فکرش را می‌کنیم:

# با گذاشتن یک نشانه نقطهٔ شروع را علامت می‌زنیم
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()  #  اگه دیوار به سمت چپ ادامه داشت به چپ بچرخ

با این که این طوری منظورمان را برای هر دستور واضح بیان می‌کنیم، این کار آن قدرها برای خلاصه کردن روش کار مورد استفاده برای حل مسئله (که به اسم الگوریتم شناخته می‌شود) مفید نیست. برای همین، این یادداشت‌ها آن قدری که دلمان می‌خواهد برای یک شخص دیگر -که بخواهد کد را بخواند- ممکن است سومند نباشد. وقتی یادداشت‌ها را بخوانیم، متوجّه می‌شویم که برنامه ۲ قسمت دارد:

  1. مشخّص‌کردن نقطهٔ شروع؛

  2. راه رفتن در کنار دیوار سمت راست تا رسیدن به نقطهٔ شروع.

بیایید برنامه را طوری بازنویسی کنیم که این دو تا قسمت مشخّص‌تر بشوند و یادداشت‌ها را هم متفاوت‌تر بنویسیم:

'''این برنامه کاری می‌کند که ریبرگ دور محیطش بر خلاف جهت عقربه‌های ساعت بچرخد و وقتی به نقطه ی شروعش برگشت متوقّف بشود.'''

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 توی کتابخانهٔتان بگذارید تا وقتی لازم داشتید بتوانید دوباره از آن استفاده کنید.

28.1. نتیجه گیری

کارمان را با یک مسئلهٔ ساده (دور زدن حول محیط مستطیلی شکل) شروع کردیم و با بهبود تدریجی آن (که به نام اصلاح یا پالایش گام‌به‌گام معروف است) توانستیم برنامه‌ای بنویسیم که می‌توانست مسئله‌های بسیار مختلفی را حل کند. در هر گام ما فقط تغییرات کمی را اعمال کردیم. از طرفی هم قبل از این که مسئله‌ها و شرایط پیچیده‌تری را در نظر بگیریم؛ بررسی کردیم تا خاطر جمع بشویم راه حلّ‌مان کار می‌کند، یا نه. همچنین، برای بخش‌هایی از الگوریتم از اسم‌های آشناتری استفاده کردیم که خواندن و احتمالاً فهمیدن برنامه را راحت‌تر می‌کرد. این کار، راهبردی است که شما بهتر است در نوشتن برنامه‌های خودتان از آن استفاده کنید:

مهم

قانون شمارهٔ ۴

گام‌هایی که باید برای نوشتن یک برنامه طی بشود:

  1. ساده شروع کن؛

  2. هر بار فقط شمار کمی تغییرات ایجاد کن،

  3. بررسی کن که تغییراتی که ایجاد کردی کارها و قسمت‌های قبلی را از کار نیانداخته باشد؛

  4. وقتی یادداشت‌های مشروح‌تری را که اضافه می‌کنی، این یادداشت‌ها طوری نباشند که فقط کار هر دستور را تکرار کنند؛ و

  5. از اسم‌های آشنا و واضح استفاده کن.

دو تا قسمت آخر لزوماً معادل قانون شمارهٔ ۲ هستند.

حالا، قبل از این که ادامه بدهید و بروید درس بعد، برنامه را امتحان و در صورت لزوم اصلاح کنید؛ تا از کارکردن برنامهٔ که توی ویرایشگر مطمئن بشوید.