انجمن گروه موج سازان

نسخه‌ی کامل: چطور مثل یک حرفه‌ای برنامه بنویسیم – بخش اول: انتخاب نام برای متغیرها
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
نوشتن برنامه برای حل کردن مسایل دنیای واقعی با استفاده از کامپیوتر کار بسیار پیچیده‌ای است و برنامه‌نویس‌ها باید هر کاری می‌توانند انجام دهند تا این پیچیدگی کم شود. یکی از این پیچیدگی‌ها این است که در هر برنامه تعداد زیادی متغیر تعریف می‌شود. حتی اگر برنامه کوچک باشد هیچ‌کس به خاطر نمی‌آورد که متغیر x که در فلان سطر از فلان فایل استفاده شده است کجا تعریف شده است، چرا تعریف شده است، چه مقداری در آن ذخیره می‌شود، و …

برای این‌که پیچیدگی برنامه‌ها کم‌تر شود باید کاری کرد که افرادی که کد را می‌خوانند (چه به قصد فهمیدن، چه به قصد رفع اشکال، چه به قصد بهبود دادن) به سادگی بتوانند بفهند که هر متغیر به چه منظور تعریف شده و چه مقداری در أن ذخیره می‌شود.

در یکی از سطرهای این برنامه این دستور را می‌توانید پیدا کنید:

کد پی‌اچ‌پی:
3

برای اینکه بفهمید این دستور چه کاری انجام می‌دهد باید بدانید که متغیر k برای چه منظوری تعریف شده است. برای اینکه بفهمید k برای چه منظوری تعریف شده است باید سطری که متغیر k در آن تعریف شده را پیدا کنید و اگر خوش‌شانس باشید در کنار آن توضیح داده شده است که k برای چه تعریف شده است. اگر خوش‌شانس نباشید باید فردی که این کد را نوشته پیدا کنید و از او بپرسید که چرا k را تعریف کرده است. باز هم اگر آدم خوش‌شانسی باشید خودتان کد را نوشته‌اید و با کمی فکر کردن یادتان می‌آید که چرا k را تعریف کرده‌اید. در غیر این صورت باید از پشت دستگاه بلند شوید و دنبال فردی که کد را نوشته بگردید . اگر در این حالت هم خوش‌شانس باشید فرد در دست‌رس است و می‌توانید از او سوال بپرسید. نمی‌خواهم بیش‌تر از این بحث را با توضیح دادن سناریوهای مختلف طولانی کنم. ولی در یک جمله در تمام این سناریوها لازم است که شما چند لحظه تمرکز خود را از روی مساله‌ی اصلی بردارید و به یک موضوع فرعی (متغیر k) فکر کنید. لازم نسیت یادآوری کنم که مساله‌ی اصلی به اندازه‌ی کافی پیچیده است و به تمرکز زیادی نیاز دارد (هیچ کس دوست ندارد هنگاه راه رفتن یک تخم مرغ را به وسیله‌ی یک قاشق در دهانش حمل کند).

این دو دستور را با هم مقایسه کنید:

کد پی‌اچ‌پی:
3

و

کد پی‌اچ‌پی:
subStringLength 3

یا حتی اگر به جز زبان مادری خود زبان دیگری نمی‌دانید

کد پی‌اچ‌پی:
touleZirReshte 3

وقتی یک نفر دستور اول را می‌خواند هیچ برداشتی به او دست نمی‌دهد. ولی وقتی دستور دوم (یا سوم) را می‌خواند خیلی راحت حدس می‌زند که این دستور طول زیررشته را برابر با ۳ قرار می‌دهد. دقت کنید که در همین پاراگراف هم برای اینکه ببینید دستور اول و دوم و سوم چه بودند باید تمرکز خود را از روی پاراگراف برمی‌داشتید و چند بار به پاراگراف‌های بالاتر مراجعه می‌کردید.

متاسفانه در این کدِ این برنامه این نوع متغیرها کم نیستند. i , j , m , temp, sub. دلیل این امر شاید به فرهنگ نادرستی بر‌می‌گردد که توسط کتاب‌های آموزش برنامه‌نویسی ترویج داده می‌شود. بسیاری از کتاب‌های آموزش برنامه‌نویسی نام‌های این‌چنینی برای متغیرها انتخاب می‌کنند. بخشی از أن هم به فرهنگی بر می‌گردد که در بین ریاضی‌دان‌ها استفاده می‌شود. ریاضی‌دان‌ها معمولا از نمادهای تک حرفی برای بیان روابط و معادله‌ها استفاده می‌کنند. اما کد یک برنامه‌ی کامپیوتری با اثبات یک قضیه ریاضی خیلی تفاوت دارد و نباید از فرهنگ رایج ریاضی‌دان‌ها برای نوشتن برنامه‌های کامپیوتری استفاده کرد (مگر أن‌که به ساده‌تر شدن مساله کمک کند).

همین موضوع در مورد نام تابع‌هایی که در برنامه تعریف شده‌اند نیز صدق می‌کند. تقریبا تمام تابع‌های تعریف شده در این برنامه نام‌های عجیبی دارند که به هیچ وجه کاری که انجام می‌دهند را القا نمی‌کنند. برای مثال دستور زیر را درنظر بگیرید:

کد پی‌اچ‌پی:
query(inputk); 

به نظر شما این دستور چه کاری انجام می‌دهد؟ آیا k بار برای پیدا کردن input جست و جو انجام می‌دهد؟ آیا در کاراکتر kام input جست و جو انجام می‌دهد؟ آیا …

برای پیدا کردن جواب باید حتما به جایی که متغیرهای k و input و تابع query تعریف شده است مراجعه کنید و توضیحات مربوط به أن‌ها را بخوانید (اگر خوش‌شانس باشید). حالا دستور زیر را در نظر بگیرید.

کد پی‌اچ‌پی:
splitIntoSubstrings(inputStringsubstringLength); 

به سادگی می‌توان فهمید که این دستور رشته‌ی inputString را به زیر رشته‌هایی با طول substringLength تقسیم می‌کند.

همین موضوع در مورد سایر تابع‌ها به خصوص تابع compute صدق می‌کند. برای مثال دستور زیر را در نظر بگیرید.

کد پی‌اچ‌پی:
compute(str.substring(m).concat(str.substring(0len - (strLen m)))); 

در مورد این‌که این دستور بیش‌تر به یک فاجعه شباهت دارد تا یک دستور که توسط یک برنامه‌نویس خوب نوشته می‌شود خیلی حرف دارم و احتمالا یک پست مجزا در مورد آن خواهم نوشت. ولی در حال حاضر فقط این موضوع را یادآوری می‌کنم که یکی از بدترین اسم‌هایی که برای یک تابع می‌توان انتخاب کرد همین compute است. برخی دیگر از این اسامی عبارتند از process, analyze, calculate, do, perform, init, initilize, start. این نام‌ها به این دلیل نامناسب هستند که هیچ اطلاعاتی در مورد اینکه این تابع‌ها چه کاری انجام می‌دهند به فردی که کد را می‌خواند منتقل نمی‌کنند. همه می‌دانند که هر تابعی بلاخره یک چیزی را حساب (compute) می‌کند، مهم این است که بدانند این تابع چه چیزی را حساب می‌کند.

منبع