آموزش ذن پایتون: مسطح بهتر از تودرتو است
June 2020
فلسفه پنچم
مسطح بهتر از تودرتو است Flat Is Better Than Nested
این دستورالعمل ممکن است در ابتدا منطقی به نظر نرسد ، اما در مورد چگونگی طرح ساختار برنامه است. ساختارهای مورد نظر می توانند آبجکتها و ویژگیهای آنها، پکیجها و ماژولهای موجود آنها یا حتی بلوکهای کد در یک فانکشن باشند. هدف این است که به جای ایجاد کردن رابطه والد و فرزندی، چیزها را در حد امکان در یک سطح حفظ کنیم. مثلا به کد زیر دقت کنید:
if x > 0:
if y > 100:
raise ValueError("Value for y is too large.")
else:
return y
else:
if x == 0:
return False
else:
raise ValueError("Value for x cannot be negative.")
در این مثال ، پیگیری آنچه در واقع اتفاق می افتد بسیار دشوار است زیرا ماهیت تودرتو بلوکهای کد نیاز دارد تا چندین سطح از شرایط را پیگیری کنید. اما در مثلا زیر ببینید که همان کد را به شکل مسطح نوشتهایم:
x=1
y=399 # change to 39 and run a second time
def checker(x,y):
if x > 0 and y > 100:
raise ValueError("Value for y is too large.")
elif x > 0:
return y
elif x == 0:
return False
else:
raise ValueError("Value for x cannot be negative.")
print(checker(x,y))
یک تابع را تنظیم کنید، و مسطح کنید. می توانید ببینید که در مثال دوم پیروی از منطق چقدر ساده تر است زیرا همه شرایط در یک سطح هستند. حتی با کمتر کردن بلوک else توانستیم دو خط کد نیز کمتر بنویسیم. اگرچه این ایده برای برنامه نویسی به طور کلی مشترک است ، این در واقع دلیل اصلی وجود کلید واژه elif است. استفاده از تورفتگی در پایتون برای مشخص کردن بلوک کدها میتواند بلوکهای if را خیلی سریع پیچیده کند. به دلیل وجود elif در پایتون دیگر نیازی به دستوراتی مثل switch که در دیگر زبانها وجود دارد نیست. در صورت نیاز به ساختار انتخاب چندگانه پایتون دستورات if, elif, else را در اختیار شما قرار داده. PEPهای وجود داشتند که پیشنهاد ایجاد شدن دستوراتی مثل switch را داشتند اما هیچکدام موفق نبودند.
در مورد طرح بندی پیکیجها، ساختارهای مسطح اغلب می توانند به یک import واحد اجازه دهند تا کل پکیج را با یک نام خاص در دسترس قرار دهد. در غیر این صورت، برنامه نویس برای یافتن کلاس خاص یا فانکشن مورد نیاز، باید ساختار کامل را بداند. برخی از پکیجها آنقدر پیچیده هستند که یک ساختار تو در تو در کاهش namespace در هر مکان کمک خواهد کرد.