خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش زبان ++C : چرا توابع مفید هستند؟ چگونه از توابع به صورت موثر استفاده کنیم؟

آموزش زبان ++C : چرا توابع مفید هستند؟ چگونه از توابع به صورت موثر استفاده کنیم؟
نویسنده : امیر انصاری
حالا که بررسی کردیم که توابع (functions) چه هستند و با برخی از قابلیت های اساسی آنها آشنا شدیم، بیایید نگاه دقیقتری بیندازیم تا بدانیم چرا توابع مفید هستند.



چرا از توابع استفاده می کنیم؟

برنامه نویسان جدید اغلب می پرسند : "آیا نمی توانیم کدهایی را که در توابع قرار می دهیم، مستقیما در تابع main بنویسیم؟" در بسیاری از موارد، به ویژه در برنامه های ساده، می توانیم. با این حال، توابع مزایایی دارند که منجر شده است از آنها به وفور استفاده شود.

  • سازماندهی (Organization) : همزمان با رشد برنامه ها، پیچیدگی های آنها نیز افزایش می یابد، اگر بخواهیم همه کدها را در داخل تابع main قرار بدهیم، برنامه به شدت پیچیده و ناخوانا می شود. یک تابع در واقع یک برنامه کوچک و مستقل می باشد که آن را به صورت جداگانه می نویسند و هنگام نوشتن هر تابع در مورد سایر قسمتهای برنامه و کلیت آن نگرانی ندارند. این موضوع به ما امکان می دهد تا کارهای پیچیده را به کارهای کوچکتر و ساده تری تبدیل کنیم و به شدت پیچیدگی کلی برنامه را کاهش دهیم.

  • قابلیت استفاده مجدد (Reusability) : هنگامی که یک تابع را می نویسید، می توانید آن را بارها در قسمتهای مختلف کد فراخوانی کنید. این مساله از تولید کدهای تکراری و همینطور خطاهایی که در زمان کپی و چسباندن (copy/paste) کدها، ایجاد می شوند را کاهش می دهد. همچنین توابع را می توان با سایر برنامه ها نیز به اشتراک گذاشت تا ضمن کاهش حجم کلی کدهایی که هر بار از ابتدا باید نوشته شوند، زمان تست مجدد آن کدها نیز طبیعتاً کاهش پیدا خواهد کرد.

  • تست کدها (Testing) : از آنجا که توابع کدهای تکراری را کاهش می دهند، در نتیجه کدهای کمتری برای تست وجود خواهند داشت. همچنین از آنجا که توابع به صورت برنامه های مستقل و بی نیاز از سایر برنامه ها (self-contained) هستند، وقتی که یک تابع را تست کردیم و از صحت کارکرد آن مطمئن شدیم، تا زمانی که کدهای درونی آن تابع را تغییر ندهیم، نیازی به تست مجدد نخواهد داشت. این مساله حجم کدهایی را که هر بار باید تست کنیم، کاهش می دهد، همچنین پیدا کردن خطاهای کدها را ساده تر می کند (حتی از پیش آمدن خیلی خطاها جلوگیری می شود).

  • قابلیت توسعه پذیری (Extensibility) : وقتی نیاز به توسعه برنامه هایمان داشته باشیم تا وضعیتی را که قبلاً برنامه ما پوشش نمی داده است، تحت پوشش قرار دهیم، توابع به ما کمک می کنند تا صرفاً یک قسمت از برنامه را تغییر بدهیم و سپس تمامی فراخوانی های آن تابع به صورت اتوماتیک مشمول این توسعه گردند.

  • انتزاع (Abstraction) : برای استفاده از یک تابع، شما کافی است تا نام آن، ورودی ها، خروجی ها و اینکه آن تابع در کجا قرار دارد را بدانید. شما نیاز ندارید تا بدانید آن تابع چگونه کار می کند، یا سایر کدهایی که وابسته به آن تابع هستند، چه می باشند. این مساله برای سایرینی که به این کدها دسترسی دارند به شدت سودمند می باشد (درست مانند همه کدهایی که در کتابخانه استاندارد زبان ++C وجود دارد).

اگرچه، در ظاهر به نظر نمی رسد، هر بار که از std::cin و std::cout برای دریافت ورودی ها یا چاپ خروجی ها استفاده می کنید، در واقع دارید از یک سری توابع استفاده می کنید که در کتابخانه استاندارد ++C از قبل نوشته شده است و تمامی معیارها و مزایایی که برای توابع برشمردیم در مورد آنها نیز وجود دارد.

روش استفاده موثر از توابع


یکی از بزرگ ترین چالش هایی که برنامه نویسان تازه کار با آن برخورد می کنند، اینست که علاوه بر یادگیری زبان برنامه نویسی، باید یاد بگیرند چگونه و به صورت موثر باید از توابع استفاده کنند. در ادامه یک سری دستور العمل مفید برای نوشتن توابع ارائه داده ایم که در این زمینه می تواند به شما کمک کند :

  • کدهایی که بیش از یک بار و به صورت تکراری در برنامه نوشته می شوند عمدتاً باید تبدیل به توابع مستقلی شوند. برای مثال، اگر داده ها را از کاربر به شکل یکسانی در جاهای مختلفی دریافت می کنیم، این کدها یک نامزد عالی برای تبدیل شدن به تابع می باشند. همینطور اگر چیزی را به شکل یکسان در دفعات مختلف در برنامه مان چاپ می کنیم، این کدها نیز یک کاندید عالی برای تبدیل شدن به تابع می باشند.

  • کد هایی که ورودی ها و خروجی های مجزایی دارند، مخصوصاً اگر دارای پیچیدگی باشند، کاندیدای خوبی برای تبدیل شدن به تابع می باشند. برای مثال، اگر لیستی از مواردی داریم که نیاز به مرتب سازی دارند، کدی که این مرتب سازی را انجام می دهد، می تواند یک تابع عالی را بسازد، حتی اگر این عملیات در کل برنامه ما فقط یکبار فراخوانی شده باشد. ورودی این تابع می تواند یک لیست از موارد نامرتب باشد و خروجی تابع مذکور می تواند لیستی از موارد مرتب سازی شده باشد.

  • یک تابع معمولاً باید یک و فقط یک وظیفه مشخص را انجام بدهد.

  • اگر یک تابعی بسیار طولانی یا بسیار پیچیده شود، یا درک آن مشکل شود، باید آن را به چند زیر تابع مجزا بشکنیم. این کار را فاکتور گیری مجدد (refactoring) می نامند.

به طور معمول، وقتی مشغول یادگیری زبان برنامه نویسی ++C می باشید، برنامه های خیلی زیادی را خواهید نوشت که 3 کار کلی زیر را انجام می دهند :

  1. دریافت ورودی ها از کاربر
  2. محاسبه کردن یک مقدار از روی ورودی ها
  3. چاپ کردن نتایج محاسبات

در مورد برنامه های کوچکتر (برای مثال برنامه های که کمتر از 20 خط کد دارند)، همه آن برنامه یا بخش زیادی از آن در تابع main نوشته خواهند شد. با این حال، در مورد برنامه های بزرگتر (و یا فقط برای تمرین)، هر کدام از این کارها می توانند کاندیدای مناسبی برای تبدیل شدن به یک تابع مجزا باشند.

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


آموزش قبلی : آموزش زبان ++C : مروری بر پارامترهای توابع و آرگومان ها (function parameters and arguments)

آموزش بعدی : آموزش زبان ++C : کلمات کلیدی و قوانین نام گذاری شناسه ها



نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.