Table of Contents
مقدمه مقدماتی
ساخت یک معماری پلاگین قابل استفاده مجدد و مقیاس پذیر در وردپرس یک مهارت حیاتی برای توسعه دهندگان است که می خواهند راه حل هایی را ایجاد کنند که آزمون زمان را در پیچیدگی رشد می کنند، نیاز به یک کد پایه به خوبی ساختار یافته، حفظ کد های پایه و اساس آن، مهم می شود.یک الگوی طراحی که در این زمینه برتری دارد، الگوی کارخانه انتزاعی است.این الگوی ایجاد یک راه قوی برای ایجاد شی، توسعه دهندگان اصلی را قادر می سازد تا بتوانند انعطاف پذیری های دقیق خود را بدون تغییر دادن ویژگی های کد گذاری دقیق خود را با استفاده از طریق تطبیق دادن ویژگی های خاص، بدون تغییر دهند.
الگوی کارخانه انتزاعی چیست؟
الگوی کارخانه انتزاعی یک الگوی طراحی کلاسیک از باند چهار است.این یک رابط برای ایجاد خانواده های اشیاء مرتبط یا وابسته بدون مشخص کردن کلاس های بتنی خود فراهم می کند.در اصل، شما یک رابط کارخانه انتزاعی را تعریف می کنید که روش های ایجاد برای هر نوع شی در کارخانه های بتنی را اعلام می کند. سپس این رابط را برای تولید موارد خاص که یک موضوع مشترک یا زمینه مشترک به اشتراک می گذارند، پیاده سازی می کند.
این الگو به ویژه هنگامی مفید است که سیستم شما باید مستقل از چگونگی ایجاد، ساخت و نمایندگی آن باشد.این به شما اجازه می دهد تا کل خانواده های محصولات را با جایگزینی یک کارخانه بتنی برای یک کارخانه دیگر، بدون تغییر کدی که از آن محصولات استفاده می کند، مبادله کنید.
چرا از کارخانه های انتزاعی در توسعه افزونه وردپرس استفاده می کنیم؟
افزونه های وردپرس اغلب نیاز به پشتیبانی از محیط های متعدد، تم ها یا تنظیمات دارند.برای مثال، یک پلاگین ممکن است رابط های مختلف مدیریتی را برای نقش های مختلف کاربر ارائه دهد، یا ممکن است نیاز به رندر اجزای جلویی داشته باشد که بدون یک رویکرد ساختاری، شما با منطق مشروط پراکنده در سراسر کد پایه خود، آن را شکننده و سخت برای حفظ.
الگوی کارخانه انتزاعی این را با متمرکز کردن ایجاد شی حل می کند، به جای نوشتن بیانیه ها در همه جا، شما یک کارخانه را تعریف می کنید که اشیاء درست را بر اساس زمینه تولید می کند.
- قابلیت: کل مجموعه های تعویض از قطعات با تغییر کارخانه، نه با ویرایش ده ها فایل.
- آزمون پذیری: کارخانه های Mock در تست های واحد برای جدا کردن منطق شما می خواهید برای تایید.
- شتاب پذیری: اضافه کردن خانواده های جدید از اجزای (به عنوان مثال، برای یک موضوع جدید) با ایجاد یک کارخانه جدید - نیازی به تغییر کد مشتری موجود نیست.
- قابلیت نگهداری: منطق آفرینش را از منطق کسب و کار جدا نگه دارید، و هر قطعه را آسان تر می کند تا درک و بازسازی شود.
پیاده سازی الگوی کارخانه انتزاعی در یک پلاگین وردپرس
بیایید از طریق یک پیاده سازی عملی قدم برداریم فرض کنیم که یک پلاگین ایجاد می کنیم که یک صفحه تنظیمات و یک ویجت داشبورد را فراهم می کند، هر دو این اجزا باید بسته به اینکه آیا حالت ساده یا پیشرفته فعال است، متفاوت باشند.ما از الگوی کارخانه انتزاعی برای ایجاد دو خانواده از اشیاء استفاده می کنیم: یکی برای حالت ساده و یکی برای حالت پیشرفته.
مرحله 1: شناسایی خانواده های اشیاء مرتبط
اول اینکه، انواع شی را که افزونه شما ایجاد می کند، تعیین کنید، در مثال ما دو نوع داریم: SettingsPage و DashboardWidget هر نوع در دو نوع: ساده و پیشرفته می آید.
مرحله ۲: تعریف رابط های Abstract
رابط های ایجاد (یا کلاس های انتزاعی) برای هر نوع محصول، این رابط ها روش هایی را که همه پیاده سازی های بتنی باید ارائه دهند، اعلام می کنند.
<?php
interface SettingsPageInterface {
public function render();
public function save();
}
interface DashboardWidgetInterface {
public function display();
}
?>
مرحله 3: ایجاد پیاده سازی های بتنی برای هر خانواده
حالا کلاس های بتنی را برای خانواده های ساده و پیشرفته پیاده سازی کنید.
[در این باره] صفحه ی
<?php
class SimpleSettingsPage implements SettingsPageInterface {
public function render() {
echo '<div class="wrap"><h1>Simple Settings</h1><form><input type="text" name="simple_option" /></form></div>';
}
public function save() {
update_option( 'simple_option', sanitize_text_field( $_POST['simple_option'] ) );
}
}
?>
صفحه تنظیمات پیشرفته (
<?php
class AdvancedSettingsPage implements SettingsPageInterface {
public function render() {
echo '<div class="wrap"><h1>Advanced Settings</h1><form>...complex fields...</form></div>';
}
public function save() {
// complex validation and saving logic
}
}
?>
[[ویرایش] [۱] [۱]
<?php
class SimpleDashboardWidget implements DashboardWidgetInterface {
public function display() {
echo '<p>Simple widget content.</p>';
}
}
?>
[[ویرایش] [۱] [۱۰]
<?php
class AdvancedDashboardWidget implements DashboardWidgetInterface {
public function display() {
echo '<p>Advanced widget with charts and stats.</p>';
}
}
?>
مرحله 4: پیاده سازی رابط کارخانه Abstract
رابط کارخانه انتزاعی را تعریف کنید که روش های ایجاد را برای هر نوع محصول اعلام می کند.
<?php
interface PluginComponentFactory {
public function createSettingsPage(): SettingsPageInterface;
public function createDashboardWidget(): DashboardWidgetInterface;
}
?>
مرحله پنجم: ایجاد کارخانه های بتنی
هر کارخانه رابط را پیاده سازی می کند و خانواده مناسب اشیاء را باز می گرداند.
<?php
class SimpleModeFactory implements PluginComponentFactory {
public function createSettingsPage(): SettingsPageInterface {
return new SimpleSettingsPage();
}
public function createDashboardWidget(): DashboardWidgetInterface {
return new SimpleDashboardWidget();
}
}
class AdvancedModeFactory implements PluginComponentFactory {
public function createSettingsPage(): SettingsPageInterface {
return new AdvancedSettingsPage();
}
public function createDashboardWidget(): DashboardWidgetInterface {
return new AdvancedDashboardWidget();
}
}
?>
مرحله 6: استفاده از کارخانه در پلاگین خود
تصمیم بگیرید که کدام کارخانه بر اساس پیکربندی یا زمینه (به عنوان مثال، یک تنظیم کاربر یا ثابت) و سپس روش های آن را برای ایجاد اجزای آن فراخوانی کنید.
<?php
function get_plugin_factory(): PluginComponentFactory {
$mode = get_option( 'plugin_mode', 'simple' );
if ( $mode === 'advanced' ) {
return new AdvancedModeFactory();
}
return new SimpleModeFactory();
}
$factory = get_plugin_factory();
$settings_page = $factory->createSettingsPage();
$widget = $factory->createDashboardWidget();
// Later, use these objects:
$settings_page->render();
add_action( 'wp_dashboard_setup', function() use ( $widget ) {
wp_add_dashboard_widget( 'my_custom_widget', 'My Widget', [ $widget, 'display' ] );
} );
?>
اکنون، تغییر بین حالت ساده و پیشرفته به سادگی تغییر کارخانه است.اگر یک حالت سوم ظاهر شود، شما یک کارخانه جدید و کلاس های محصول مربوطه ایجاد می کنید – بدون اینکه هیچ کد مشتری را که از کارخانه استفاده می کند لمس کنید.
مثال واقعی جهانی: افزونه چند منظوره
یک افزونه را در نظر بگیرید که یک فرم تماسی را ارائه می دهد، طرح فرم، اعتبار و ایمیل ممکن است بسته به اینکه آیا سایت از یک قالب کلاسیک یا یک موضوع مبتنی بر بلوک استفاده می کند، با استفاده از الگوی کارخانه انتزاعی، می توانید تعریف کنید (FLT:0FormRenderer [FLT 1] و [F:2EmailSender] [F3]، تنها به یک منطق انتزاعی و پشتیبانی از آینده بستگی دارد.
در اینجا یک طرح کد ساده شده است:
<?php
interface FormRenderer {
public function render(): string;
}
interface EmailSender {
public function send( array $data ): bool;
}
interface ContactFormFactory {
public function createRenderer(): FormRenderer;
public function createEmailSender(): EmailSender;
}
// Classic theme implementations
class ClassicFormRenderer implements FormRenderer { /* ... */ }
class ClassicEmailSender implements EmailSender { /* ... */ }
class ClassicThemeFactory implements ContactFormFactory { /* ... */ }
// Block theme implementations
class BlockFormRenderer implements FormRenderer { /* ... */ }
class BlockEmailSender implements EmailSender { /* ... */ }
class BlockThemeFactory implements ContactFormFactory { /* ... */ }
// Usage
$factory = new ClassicThemeFactory(); // or switch based on theme support
$renderer = $factory->createRenderer();
$sender = $factory->createEmailSender();
?>
این رویکرد منطق اصلی پلاگین را بدون تغییر نگه می دارد، حتی زمانی که تم های جدید معرفی می شوند، همچنین تست واحد را ساده می کند: شما می توانید یک کارخانه مسخره ایجاد کنید که تست را دو برابر می کند.
مزایای و اخراج تجاری
الگوی کارخانه انتزاعی مزایای مختلفی برای توسعه پلاگین وردپرس ارائه می دهد:
- پیچیدگی: مشتریان پلاگین تنها به رابط های انتزاعی بستگی دارد، نه کلاس های بتنی، این کاهش اثرات هنگامی که پیاده سازی تغییر می کند.
- سازگاری: الگوی تضمین می کند که اشیاء ایجاد شده توسط یک کارخانه متعلق به یک خانواده، جلوگیری از ترکیب های ناسازگار است.
- از تمدید: اضافه کردن یک خانواده جدید (به عنوان مثال، پشتیبانی از یک سازنده صفحه جدید) به سادگی نیاز به اجرای رابط ها و ایجاد یک کارخانه جدید دارد.
با این حال، این امر همچنین برخی از پیچیدگی ها را معرفی می کند:
- Overitial Overhead: رابط های تعریف و چندین کارخانه تعداد کلاس ها را افزایش می دهد.
- آموزش و پرورش Curve: [FLT 1] توسعه دهندگان ناآشنا با الگوهای طراحی ممکن است انتزاع دشوار است.
- افزایشگی در آفرینش جسم: اگر شما نیاز به ایجاد اشیا که به طور منظم به خانواده مناسب نیست، الگوی می تواند احساس اجبار کند.
برای تصمیم گیری در مورد استفاده از کارخانه انتزاعی، احتمال نیاز پلاگین به خانواده های متعدد و قابل تعویض از اشیاء را ارزیابی کنید.اگر این نیاز روشن باشد، الگوی به سرعت با کاهش هزینه های نگهداری طولانی مدت، هزینه می کند.
نتیجه گیری
الگوی کارخانه Abstract یک ابزار قدرتمند برای طراحی معماری پلاگین قابل استفاده مجدد در وردپرس است.با جدا کردن آنچه از طراحی معماری پلاگین قابل استفاده در وردپرس از ایجاد شی، شما پلاگین خود را سازگارتر، قابل آزمایش و قابل نگهداری می کنید، این که آیا شما یک پلاگین ایجاد می کنید که از تم های مختلف، نقش های کاربر، و یا الگوی رشد کوچک پشتیبانی می کند - به خوبی یک الگوی پایه و تمیز و تمیز کردن یک ویژگی های کاربر را حفظ می تواند به شما کمک کند.
در این کتاب، به بررسی کتاب «فَلَهُوَهُ» و «مَهَهُمَهُوَهُ» پرداخته شده است و در آن نوشته شده است.