مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

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

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

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

چرا باید کد من خوانا باشد؟

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

ساختار یک تابع باید چگونه باشد؟

همانطور که گفته شد توابع قطعه های پازل منطق برنامه شما هستند و باید ساختار درستی داشته باشند.

هر تابع یک وظیفه

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

اندازه تابع

توابع باید کوچک تعریف شوند تا بتوان منظور آنها را به راحتی متوجه شد. همچنین نامگذاری آنها باید مناسب باشد. برای نامگذاری توابع به مطلب نامگذاری مراجعه کنید. منظور از کوچک بودن توابع این است که هر تابع باید حد اکثر 5 یا 6 خط باشد ولی اگر کمتر از 4 خط باشد بهتر است. همچنین تعداد تو رفتگی توابع باید حداکثر دو سطح باشد. منظور از تورفتگی ها عبارات مانند شرط ها و حلقه ها و پردازش استثناها (Exception) است. یعنی استفاده از شروط تو در تو یا حلقه های تو درتوی زیاد ممنوع است و فقط مجاز به استفاده یک تو رفتگی در توابع هستیم. 

با توابع بزرگ چه کنیم؟

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

دقت داشته باشید که اگر تابعی وجود دارد که یک کار را انجام می دهد ولی اندازه آن بزرگ است را می توانید تبدیل به یک کلاس کنید که شامل چندین تابع مرتبط به هم است. برای اطلاعات بیشتر در این مورد Refactoring را در برنامه نویسی مطالعه کنید.

آرگومان توابع

معمولا توابع می توانند از هیچ ورودی تا تعداد زیادی ورودی داشته باشند که می توانند بر روی این ورودی ها پردازشی را انجام می دهند. برخی از توابع خروجی هم دارند و مقداری رو برمی گردانند و برخی هیچ مقداری بر نمی گردانند.

دقت داشته باشید که هرچه ورودی های تابع شما کمتر باشد تابع شما خوانا تر است. چون که کسی که کد شما را می خواند باید در داخل بدنه تابع به دنبال ورودی ها و اتفاقاتی که برای ورودی ها افتاده است بگردد و این باعث خستگی و کلافگی خواهد شد. پس بهترین توابع توابعی هستند که پارامتر ورودی ندارند و بعد از آن توابعی که یک ورودی دارند و بعد از آن توابعی که دو ورودی دارند. دقت کنید که تعداد ورودی بیش از 3 تا خوانایی برنامه شما را تا حد زیادی پایین می آورد. در مورد خروجی توابع دقت داشته باشید که راه استاندارد خروجی توابع این است که در انتهای تابع مقدار خروجی return شود. ولی راه های دیگری نیز وجود دارد مثل آرگومان خروجی که در برخی زبان های برنامه نویسی وجود دارد. توصیه ما این است که از این آگومان ها استفاده نکنید.

در تعریف توابع استفاده از آرگومان های بولین(boolean) اگر برای مقدار دهی به یک شی باشد اشکالی ندارد ولی اگر این آرگومان بولین به عنوان یک پرچم باشد به این معنی است که این تابع بیش از یک کار انجام می دهد. یعنی یک کار زمانی که پرچم ما true است و یک کار برای زمانی که false است. پس استفاده از پرچم یعنی تابع در حال انجام بیش از یک کار است که با اصل گفته شده مطابق نیست. پس از آرگومان Boolean پرچم نباید استفاده کرد. استفاده از آرگومان null هم به همین حالت است و بیانگر این است که تابع در حال انجام بیش از یک کار است پس از این نوع آرگومان ها استفاده نکنید.

نویسنده: مهدی عادلی فر



مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات