💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ پویا پارسایی
آیا استفاده از interface برای پیاده سازی chain of responsibility گزینه بهتری نیست؟
جامعه مهندسی نرم افزار ایجاد شده در ۲۰ اردیبهشت ۱۴۰۲

سلام و عرض ادب

استاد اگر یک interface تعریف کنیم و بعد یک کلاس ابسترکت که اون interface رو implement کنه و بعدش concrete کلاسهامون از اون کلاس ابسترکت extend کنن بهتر نیست؟

اینجوری همه کلاس‌ها مجبورن متدی که توی interface تعریف شده رو پیاده سازی کنن و کدمون rubost‌تر بشه.

به طور مثال:

۱- اینترفیس:

namespace App\\Services\\DashboardUser\\DashboardRegisterStepIndicator\\Contracts;
use App\\Models\\User;
interface DashboardRegisterStepIndicatorInterface
{
    public function setNextIndicator(DashboardRegisterStepIndicatorInterface $indicator);
    public function indicate(User $superAdmin);
}

۲- ابسترکت

namespace App\\Services\\DashboardUser\\DashboardRegisterStepIndicator\\Contracts;
use App\\Enums\\User\\DashboardRegisterStep;
use App\\Models\\User;
abstract class AbstractDashboardRegisterStepIndicator implements DashboardRegisterStepIndicatorInterface
{
    private $nextIndicator;
    public function setNextIndicator(DashboardRegisterStepIndicatorInterface $indicator)
    {
        return $this->nextIndicator = $indicator;
    }
    public function indicate(User $superAdmin)
    {
        if ($this->nextIndicator === null) {
            return $this->makeResult(DashboardRegisterStep::Complete, true);
        }
        return $this->nextIndicator->indicate($superAdmin);
    }
    public function makeResult(DashboardRegisterStep $step, bool $isComplete = false)
    {
        return [
            'is_complete' => $isComplete,
            'step' => $step,
            'step_name' => DashboardRegisterStep::tryFrom($step->value)?->text(),
        ];
    }
}

۳- کلاس concrete:

class IsEmailVerified extends AbstractDashboardRegisterStepIndicator
{
    public function indicate(User $superAdmin)
    {
        if (! $superAdmin->hasVerifiedEmail()) {
            return $this->makeResult(DashboardRegisterStep::EmailNotVerified);
        }
        return parent::indicate($superAdmin);
    }
}

nnnnnnnnnnnn

پویا پارسایی ۲۰ اردیبهشت ۱۴۰۲، ۱۷:۴۸