gparvin@gmail.com 01733580193

سه نکته ساده برای بهبود کد های laravel شما

2 0
مریم سوری
۰۴ دی ۱۳۹۹ | ۹:۳۲
من مدتی است که با laravel شروع به کار کرده‌ام و طی چندماه گذشته، به طور جدی بر روی چگونگی بهبود کدها و ساختار پروژه خودم تمرکز کرده‌ام. پس چرا دانش‌خود را در این‌باره با دیگران به اشتراک نمی‌گذارید؟؟ (‌ احتمالاً ایشون ”نویسنده” با دوره‌های راکت آشنا نبودن) خب،‌بیایید باهم چند نمونه از مثال‌های واقعی، که بسیار مورد استفاده است را مورد بررسی قرار دهیم و ببینیم چگونه می‌توانیم آن‌ها را ریفکتور کنیم. آماده‌این؟ اوکی پس بریم شروع کنیم.

۱. کالکشن‌های خود را ریفکتور کنید

تصور کنید که در حال ایجاد وبسایتی هستید که دانش‌آموزان یا دانشجویان در پروژه‌های آن شرکت می‌کنند و هر هفته به آن‌ها نمره داده می‌شود، و وظیفه شما این است که میانگین نمرات یک پروژه‌ را به مربی(استاد،معلم) نشان دهید، و میانگین نمره دانش‌جویان را به ترتیب درجه‌بندی کنید ( به منظور مشاهده پیشرفت آن‌ها).

ممکن است شما با یک Project class مثل این رو‌به رو شوید :

<?php

class Project extends Model{
    /** ... code omitted for brevity **/

    public function studentsAverageScore() {
        $participants = $this->participants;

        $sum = 0;
        $totalStudents = 0;
        foreach($participants as $participant) {
            if ($participant->isStudent()) {
                $totalStudents++;
                $sum += $participant->student->lastRating()->averageScore();
            }
        }

        return $sum / $totalStudents;
    }

}

 به نظر می‌رسد که متد studentsAverageScore() ما بسیار خوب کار می‌کند. با استفاده از یک foreach می‌بینیم که شرکت کنندگان جز دانشجویان هستند یا نه ( برخی از شرکت‌کنندگان می‌توانند از بین استادان باشند) و سپس آخرین میانگین نمره را جمع می‌زنیم(میانگین هر تستی در یک ریت مشخص شده است.)

مسأله اینجاست که اگر یک نفر بعدا به این متد برای باگ فیکس یا یک تغییر ضروری برگردد، هم تیمی یا حتی خود شما باید قبل از انجام هرکار دیگری در ذهن خود این foreach را کامپایل کند. حلقه‌ها generic هستند، و در این مورد، ما در هر pass چندین کار انجام می‌دهیم: بررسی می‌کنیم که دانشجو هستند یا نه و سپس به sum اضافه می‌کنیم و فقط دوباره در return statement مقدار می‌دهیم.

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

بنابراین چگونه می‌توانیم این بررسی‌ها و محاسبات را بهتر کنیم؟ خوشبختانه ما می‌توانیم با متدهایی که Eloquent در اختیار ما می‌گذارد، کمی از برنامه‌نویسی فانکشال استفاده کنیم.

به جای اینکه به صورت دستی چک کنید که شرکت‌کنندگان دانشجو هستند یا نه، می‌توانید با استفاده از متد filter فقط دانشجویان را return کنید :

<?php

public function studentsAverageScore() {
    $participants = $this->participants;

    $participants->filter(function ($participant) {
        return $participant->isStudent();
    });
}

با استفاده از فانکشن filter، ما می‌توانیم فقط یک فانکشن را به عنوان یک آرگومان pass کنیم تا فقط شرکت‌کنندگانی که دارای تمام شروط ما هستند return شوند. در این حالت، این call یک زیرمجموعه از $participants را برخواهد گرداند: فقط دانش‌جویان را.

به طور طبیعی، ما نیاز داریم که با حساب کردن میانگین نمره آن‌ها این کار را به پایان برسانیم. خب حالا به foreach نیاز داریم؟ این که هنوز هم بهینه نیست. یک راه حل داخلی یا built-in در فانکش دیگری وجود دارد، که average (میانگین)نام دارد و در کالکشن Eloquent ما وجود دارد؛ در جایی که ما فقط می‌خواهیم مقداری را از کل کالکشن میانگین بگیریم و return کنیم  کمی شبیه به filter را رفتار می‌کند و به عبارت دیگر قوانینی که filter دنبال می‌کند را دنبال خواهد کرد. کد نهایی به صورت زیر است :

<?php

public function studentsAverageScore() {
    $participants = $this->participants;

    return $participants->filter(function ($participant) {
        return $participant->isStudent();
    })->average(function ($participant) {
        return $participant->student->lastRating()->averageScore();
    });
}

 

ثبت امتیاز :

نظرات : (0)


ثبت نظر :

تمامی حقوق این وبسایت متعلق به شرکت گلستان پردازش آروین می باشد.
all rights reserved.