php Code Refactoring Series - part9

سری پست های اصلاح کد ها در پی اچ پی اگر با سری پست های اصلاح کد های پی اچ پی آشنایی ندارید و یا سایر قسمت ها را نخوانده اید از اینجا شروع کنید: https://virgool.io/@vahiiiid/php-code-refactoirng-series-introduction-pckzxvccjw6f در این پست با هم راه های مختلف نوشتن توابع variadic رو در پی اچ پی می بینیم تا بتونیم ضمن نوشتن این گونه توابع از داشتن توابع با تعداد زیاد ورودی هم راحت شویم تا کد تمیز تری داشته باشیم. اما variadic دقیقا چه تابعی هست؟تابع variadic یعنی تابعی که تعداد ورودی های متغیری میتونه بگیره.احتمالا شما هم در برنامه های خود با نوشتن توابعی مواجه شده اید که تعداد ورودی آنها زیاد هست (بیش از ۳ ورودی) و همان طور که میدونید همیشه به عنوان یکی از best practice های برنامه نویسی این مورد مطرح می شود که توابع نباید تعداد زیادی ورودی بگیرند، خوب راه حل های زیادی برای حل این مشکل وجود دارد:۱. استفاده از آرایه به عنوان ورودی یک راه حل ساده می تونه این باشه که ورودی تابع را یک آرایه بگیریم و هنگام صدا زدن تابع تمام ورودی های مورد نیاز رو یک آرایه کنیم و به تابع بفرستیم این مورد بسیار مرسوم هست و بزرگترین مشکل این روش عدم آگاهی از مقادیر مورد نیاز تابع هست و کسی که می خواهد تابع شما رو صدا بزند حتما باید بیاد و کد شما رو ببینه و بفهمه که آرایه رو چه شکلی باید بسازه که تابع به خوبی کار کنه که خوب خیلی از مواقع راه حل خوبی نیست.۲. استفاده از توابع داخلی پی اچ پی راه حل دوم استفاده از توابع داخلی پی اچ پی هست که می تونند ورودی های تابع رو بدون مشخص کردن آنها جمع آوری کنند و در قالب آرایه یا هر مقداری به ما بدهند. اینجا ۳ تا از توابع پرکاربرد برای این کار رو می بینید:func_num_args()func_get_arg()func_get_args() در تکه کد زیر نحوه استفاده از تابع ()func_get_args رو می بینید که میتونه هر تعداد ورودی که به تابع پاس داده میشه رو در قالب یک آرایه به مابدهد و اینجا هم داکیومنت اون رو تو سایت پی اچ پی می تونید بخونید: function adder() { $sum = 0; foreach (func_get_args() as $number) { $sum += $number; } return $sum; } // هردو کد زیر کار خواهند کرد adder(1,2); adder(1,2,3,4,5,6,7);دو تابع دیگر یعنی ()func_num_args و ()func_get_arg می تونند همزمان با هم استفاده شوند و مکمل یکدیر باشند به این صورت که func_num_args تعداد ورودی های پاس داده شده به تابع رو مشخص کند و بر اساس اون می تونیم هرکدوم از ورودی ها رو با پاس دادن ایندکس به func_get_arg مثل کد زیر دریافت کنیم:function adder() { $sum = 0; //تعداد ورودی ها رو دریافت میکنیم $numberOfArgs = func_num_args(); //می توینم از یک حلقه به تعداد ورودی ها استفاده کنیم و هر دفعه یک مقدار ورودی رو دریافت کنیم for ($i = 0; $i < $numberOfArgs; $i++) { $sum += func_get_arg($i); } return $sum; } // هردو کد زیر کار خواهند کرد adder(1,2); adder(1,2,3,4,5,6,7);۳. استفاده از ویژگی splat operator یک روش دیگر استفاده از ویژگی splat operator هست که در پی اچ پی 5.6 معرفی شد. از اینجا می تونید داکیومنت اون رو مشاهده کنید و به صورت زیر هم می تونیم از اون استفاده کنیم:function adder(...$numbers) { $sum = 0; foreach ($numbers as $number) { $sum += $number; } return $sum; } // هردو کد زیر کار خواهند کرد adder(1,2); adder(1,2,3,4,5,6,7);در اینجا numbers$... تمامی ورودی های پاس داده شده به تابع رو جمع میکنه و در قالب یک آرایه با نام numbers$ می تونیم از اونها استفاده کنیم. همان طور که دیدید استفاده از splat operator بسیار راحت هست و پی اچ پی مانند سایر زبان ها این ویژگی رو به صورت اختصاصی برای نوشتن و یا صدا زدن توابع variadic به وجود آورده است. پس با استفاده از این ۳ روش تونستیم تابع خودمون رو بنویسیم و تعداد زیادی ورودی هم نداشته باشیم، اما در بین این راه حل ها هم قطعا اگر از پی اچ پی ورژن 5.6 و یا بالاتر استفاده می کنید بسته به شرایط کدتون می تونید از روش اول و یا سوم استفاده کنید و روش دوم با توجه به قدرت و راحتی splat operator به نظر دیگه کاربردی نخواهد داشت.لطفا نظرتون رو توی کامنت ها بنویسید تا این سری پست های اصلاح کد های پی اچ پی رو با هم دیگه کامل تر کنیم.معرفی و مشاهده سایر پست های اصلاح کد های پی اچ پیراستی لایک هم لطفااااااا یادتون نره :)