رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چطور مثل یک حرفه‌ای برنامه بنویسیم – بخش دوم: حوزه‌ی متغیرها
#1
در پست قبلی در مورد نحوه‌ی افزایش خوانایی برنامه با انتخاب نام مناسب برای متغیرها و تابع‌ها توضیح دادم. این موضوع در کلاس‌ها آکادمیک تدریس می‌شود و اکثر افراد با این موضوع آشنا هستند (هرچند که هنگام برنامه نوشتن این موضوع را رعایت نمی‌کنند). در این پست قصد دارم بیش‌تر در مورد متغیرها توضیح دهم. مطالبی که در این پست توضیح خواهم داد را معمولا نمی‌توان در بین مباحثی که در کلاس‌های آکادمیک تدریس می‌شود پیدا کرد. پس این پست را با دقت بخوانید.

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

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

این چند حالت را در نظر بگیرید. (این‌ها لزوما تمام حالت‌های ممکن نیستند)
حالت اول:‌ متغیر با طول عمر طولانی و گام‌های کوچک
[عکس: how-to-program-like-a-professional-0.png?w=450]

در این مثال متغیر مورد نظر ما در اولین دستور تعریف شد است و در آخرین دستور از بین رفته است. بنابراین در این مثال، متغیر مورد نظر ما دارای عمر طولانی است، به این معنی که فاصله‌ی بین نقطه‌ای که تعریف شده است و نقطه‌ای که از بین رفته است زیاد است. اما در تمام طول این فاصله این متغیر استفاده شده است. پس گام‌های این متغیر کوتاه هستند. این حالت ممکن است در برنامه‌هایی که کارهای محاسباتی سنگین انجام ‌می‌دهند رخ دهد. با این حال روبه‌رو شدن با یک حالت این‌چنینی همیشه به این معنا نیست یک پردازش سنگین با استفاده از متغیر مورد نظر ما انجام می شود. گاهی برنامه‌نویس‌ها برای آن‌که (به خیال خود) در مصرف حافظه صرفه‌جویی کنند از یک متغیر برای ذخیره کردن چند مقدار استفاده می‌کنند. برای مثال یک برنامه‌نویس ممکن است که برای صرفه‌جویی در حافظه‌ی مصرفی برنامه‌ی خود یک متغیر رشته‌ای تعریف کند که برای سه منظور از آن استفاده می‌شود. در ابتدای برنامه از این متغیر برای ذخیره‌کردن نام کاربر استفاده می‌شود. در قسمت میانی برای ذخیره کردن یک پرس و جو که مد نظر کاربر است و در قسمت انتهایی برای ذخیره کردن پیام خروجی که قرار است به کاربر نشان دهد. برای مثال کد زیر را در نظر بگیرید.
کد پی‌اچ‌پی:
String str;
str getUsername();
// do something with username
// ...
str "SELECT * FROM TABLE FOO";
// do something with the query
// ...
str getErrorMessage();
// show error message on the screen
// ... 
در تمام این کد از متغیر str به صورت مداوم استفاده شده است، ولی استفاده از یک متغیر به این صورت یکی از خطرناک‌ترین و آماتوری‌ترین روش‌های ممکن برای کد نویسی است. اگر جایی دیدید که یک برنامه‌نویس از یک متغیر به این صورت استفاده کرده است، بنا به دلایل زیر، مطمئن باشید که حتی الفبای برنامه‌نویسی را هم نمی‌داند.

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

حالت دوم: متغیر با طول عمر طولانی و گام‌های متوسط
[عکس: how-to-program-like-a-professional-1.png?w=450]
در این مثال متغیر دارای عمری طولانی است. ولی در تمام طول فاصله‌ای که متغیر معتبر است از آن استفاده نشده است. در این حالت احتمالا این بخش از برنامه دو کار را به صورت همزمان انجام می‌دهد. برای مثال احتمالا این بخش از برنامه یک سری محاسبه انجام می‌دهد و در کنار آن یک پیام به کاربر نشان می‌دهد که مشخص می‌کند چند درصد از محاسبات انجام شده است. اگر این موضوع صحت دارد، بهتر است که این بخش از برنامه به دو قسمت مجزا تقسیم شود و هر بخش فقط و فقط یک کار را انجام دهد.
حالت سوم: متغیر با طول عمر زیاد و گام‌های بلند
[عکس: how-to-program-like-a-professional-2.png?w=450]
در این حالت متغیر دارای عمری طولانی است. ولی بعد از أنکه متغیر تعریف شد، مدت‌ها بدون استفاده باقی مانده است. در این مثال متغیر بعد از آن‌که در دستور اول تعریف شد تا دستور ششم دیگر مورد استفاده قرار نمی‌گیرد. بعد دوباره از این متغیر استفاده‌ای نمی‌شود تا آخرین دستور. این حالت یکی از بدترین حالت‌هایی است که ممکن است به وجود آید. زیرا از یک طرف فاصله‌ی محل تعریف و محل استفاده‌ی متغیر طولانی است و کسی که در حال کار کردن روی کد است نمی‌تواند هنگام دیدن کدی که از متغیر استفاده می‌کند، جایی که متغیر تعریف شده است را هم ببیند. ثانیا از آن‌جا که این متغیر به ندرت مورد استفاده قرار گرفته است، دلیل تعریف و استفاده از این متغیر در خاطر برنامه‌نویس باقی نمی‌ماند. اگر این متغیر بیش‌تر مورد استفاده قرار می‌گرفت، این احتمال وجود داشت که برنامه‌نویس ساده‌تر به یاد بیاورد که این متغیر چه جیزی را در خود ذخیره می‌کند. به هر حال می‌توان با تعریف کردن متغیر در جایی نزدیک به اولین جایی که متغیر استفاده شده است تا حدی از این مشکل کاست.
حالت چهارم: متغیر با طول عمر طولانی، یک گام بلند و سپس گام‌های کوچک

[عکس: how-to-program-like-a-professional-3.png?w=450]
در این مثال هم متغیر دارای عمر طولانی است، اما این متغیر فقط در بخش کوچکی از برنامه استفاده شده است (در چند دستور آخر). بین جایی که متغیر تعریف شده است و جایی که برای اولین بار از آن استفاده شده است یک فاصله‌ی بزرگ وجود دارد. با تعریف کردن متغیر در نزدیکی اولین جایی که از آن استفاده شده است می‌توان مشکل این حالت را برطرف کرد.
حالت پنجم:‌ متغیر با طول عمر کوتاه و گام‌های کوچک
[عکس: how-to-program-like-a-professional-4.png?w=450]

این یک مثال از متغیری است که طول عمر کوتاهی دارد. این متغیر نزدیک به جایی که برای بار اول از أن استفاده می‌شود تعریف شده است. این حالت بهترین حالت تعریف و استفاده از یک متغیر است. در این حالت وقتی برنامه‌نویس در حال کار کردن روی کد است، می‌تواند به طور همزمان جایی که متغیر تعریف شده و تمام استفاده‌هایی که از این متغیر شده است را ببیند.

حالا که توضیح طول عمر متغیرها و اندازه‌ی گام‌های آن‌ها تمام شد بهتر است به کدی که بحث روی آن بود برگردیم.

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

متاسفانه این مطلب در مورد سایر متغیرهای عمومی که در این برنامه تعریف شده‌اند نیز صدق می‌کند. تمام این متغیر‌ها فقط و فقط در بخش کوچک از کد (هر کدام فقط در یک تابع) استفاده شده‌اند.

در صورتی که متغیر sub در برنامه‌ی زیر در کنار جایی که از آن استفاده شده است (داخل تابع compute) تعریف شده بود، برنامه‌نویس اصلی این کد احتمالا خیلی ساده‌تر می‌توانست ببیند که sub یک ساختمان داده است که روی آن فقط سه عمل contains‌ و add و clear انجام می‌شود و شاید برای آن‌که کارآیی کد خود را بهتر کند به جای آنکه sub را از نوع ArrayList تعریف می‌کرد، آن‌را از نوع HashSet تعریف می‌کرد تا دو عمل contains‌ و add با سرعت بسیار بیشتری (۱)o روی آن اجرا شوند.

منبع
[عکس: <a href=www.Mojsazan.com.gif]" class="mycode_img" />
پاسخ
سپاس شده توسط behnaz ، mersadblue


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  اثبات وجود خدا برای صنف برنامه نویس مهرداد عباسی 1 4,406 12-03-2015, 10:23 PM
آخرین ارسال: abolfazl35
  چرا هزینه های برنامه نویسی بالاست؟ مهرداد عباسی 0 2,140 04-21-2015, 04:58 AM
آخرین ارسال: مهرداد عباسی
  چرا هزینه های برنامه نویسی بالاست؟ مهدی ابراهیمی 0 2,993 06-27-2014, 11:34 PM
آخرین ارسال: مهدی ابراهیمی
  میوه فروشی بهتر است یا برنامه نویسی؟؟؟؟؟؟؟؟ مهرداد عباسی 11 13,190 02-17-2014, 05:05 PM
آخرین ارسال: مهدی ابراهیمی
  داستان یک برنامه نویس که از علم بازاریابی چیزی نمی دانست مهرداد عباسی 0 2,503 11-09-2013, 07:11 PM
آخرین ارسال: مهرداد عباسی
Question انتخاب یک زبان جامع برنامه نویسی موبایل - اپلیکیشن - وب - هوش digicom 19 22,162 08-25-2013, 07:10 PM
آخرین ارسال: مهدی ابراهیمی
  خودآموز برنامه نویسی در ۱۰ سال علیرضا حر 0 3,187 06-21-2013, 05:16 AM
آخرین ارسال: علیرضا حر
Tongue کامپایل و اجرای برنامه های جاوا در کنسول علی عرفانی 0 2,486 05-30-2013, 04:27 PM
آخرین ارسال: علی عرفانی
  اگر نجارها همونطوری استخدام می شدن که برنامه نویس ها استخدام می شن مهرداد عباسی 0 2,543 03-21-2013, 09:10 PM
آخرین ارسال: مهرداد عباسی
  برنامه نویسی لینوکس aliye 5 6,008 02-22-2013, 03:31 PM
آخرین ارسال: Beni_Vanda

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان