بارگذاری بیش از حد روش PHP – انجمن DEV

این یک مقاله در مورد freeCodeCamp با نام نحوه عملکرد بارگذاری بیش از حد روش در PHP است.
این بیشتر یک فحش عاطفی در مورد ایجاد کد قابل خواندن و ایمن است تا اینکه من با عصبانیت مشت خود را به سمت ابر تکان می دهم.
پیشنهادات مقاله freeCodeCamp من
بسیاری از زبان ها دارای روش اضافه بار هستند زیرا بخشی از چندموفیسم است. و PHP با استفاده از روش __call آن را ارائه می کند.
زبیر کد را ارائه می دهد، به برخی موارد استفاده می پردازد، بنابراین در کل مقاله خوبی است.
کد
من تعصب دارم زیرا روش __call را یک تابع جادویی زباله می دانم. من فقط در صورتی از آن استفاده می کنم که راه دیگری نباشد.
چیزی که در مورد کد دوست ندارم:
- عملکرد ترکیبی، شناسایی اضافه بار عملکرد و کد واقعی
- بدون بازگشت ثابت
- بدون دید بلندمدت (اگر ده یا بیست روش دارید که بخواهید بیش از حد بارگذاری کنید چه؟)
شما می توانید استدلال کنید که مثالی برای نشان دادن بارگذاری بیش از حد است و حق با شماست.
من فقط می خواهم وقتی آن را می بینم گریه کنم، بنابراین اجازه دهید من را خوشحال کنید.
رفع کد
class SampleClass
{
private function add2($numbers) {
return array_sum($numbers);
}
private function add3($numbers) {
return array_sum($numbers) > 10 ? 10 : array_sum($numbers);
}
public function __call($functionName, $arguments)
{
$count = count($arguments);
$methodName = $functionName . $count;
return method_exists(__CLASS__, $methodName) ? $this->{$methodName}($arguments) : NULL;
}
}
# The sample execution works
$sampleObject = new SampleClass;
echo $sampleObject->add(12, 12) . PHP_EOL; // Outputs 24
echo $sampleObject->add(12, 2, 6) . PHP_EOL; // Outputs 10
برای پاکسازی متد __call از آرگومانها برای ایجاد نام متدها استفاده کردم و در صورت وجود متدها را فراخوانی کردم.
بنابراین اکنون تنها عملکرد متد __call یافتن متدها در کلاس است.
در هیچ کجای پلی مورفیسم ذکر نشده است که نمی توانید از توابع خصوصی برای دستیابی به اضافه بار استفاده کنید.
یکی دیگر از چیزهایی که من را به گریه می اندازد، تایید نکردن استدلال هاست. array_sum یک تابع بسیار بخشنده است، اما اگر کد نمی تواند بسیار بخشنده باشد چه؟
جلوگیری از خطاها
class Numbers {
private array $collection = [];
public function __construct(...$nums) {
$this->collection = array_filter($nums, fn($num) => is_numeric($num));
}
public function toArray() {
return $this->collection;
}
}
class SampleClass
{
private function addOverload(Numbers $numbers) {
$arr = $numbers->toArray();
return match(count($arr)) {
2 => array_sum($arr),
3 => array_sum($arr) > 10 ? 10 : array_sum($arr)
};
}
private function callMethod($functionName, $arguments) {
$count = count($arguments);
$methodName = $functionName . $count;
if(method_exists(__CLASS__, $methodName) === FALSE) {
return NULL;
}
return $this->{$methodName}($arguments);
}
public function __call($functionName, $arguments)
{
return match($functionName) {
'add' => $this->addOverload($arguments[0]),
'default' => $this->callMethod($functionName, $arguments)
};
}
}
$sampleObject = new SampleClass;
$twentyfour = new Numbers(12, 12);
$ten = new Numbers(12, 2, 6);
echo $sampleObject->add($twentyfour) . PHP_EOL; // Outputs 24
echo $sampleObject->add($ten) . PHP_EOL; // outputs 10
من یک کلاس Numbers اضافه کردم تا فقط ورودی عددی مجاز باشد. این تغییر باعث شد SampleClass را مجدداً بازسازی کنم. بنابراین اکنون یک روش addOverload وجود دارد که کد را بر اساس تعداد تغییر می دهد.
وقتی به کدی که الان دارم نگاه میکنم، خطوط زیادی وجود دارد که فقط ضایع هستند. من عاشق محیط زیست هستم، بنابراین قصد دارم ضایعات را کاهش دهم.
فقط در این مورد
# copy Numbers from previous example
class SampleClass2
{
public static function add(Numbers $numbers) {
$arr = $numbers->toArray();
return match(count($arr)) {
2 => array_sum($arr),
3 => array_sum($arr) > 10 ? 10 : array_sum($arr)
};
}
}
$twentyfour = new Numbers(12, 12);
$ten = new Numbers(12, 2, 6);
echo SampleClass2::add($twentyfour) . PHP_EOL; // Outputs 24
echo SampleClass2::add($ten) . PHP_EOL; // outputs 10
الان یک کمپینگ شاد هستم. خداحافظ روش __call، بدون بارگذاری اضافه، زیرا انحراف کد توسط متد add وجود دارد.
نتیجه
خوب است که مفهوم اضافه بار روش را بدانید و زمانی از آن استفاده کنید که بهترین راه حل برای مشکلی است که با آن روبرو هستید.
فقط سعی کنید بفهمید کدی که می نویسید باعث خوشحالی دیگران و خودتان در آینده می شود یا خیر.