طراحی به صورت پلاگین

سلام خدمت دوستان
برنامه هایی مثل فتوشاپ یا مدیریت های محتوا مثل وردپرس و … پلاگین دارند و با نصب پلاگین یه ویژگی و امکان جدید اضافه میشه . حالا سوال من اینه اسم این نوع طراحی یا روش دقیقا چیه ؟ چجوری میشه برنامه هایی در این حالت نوشت که یه هسته اصلی داشته باشه و بقیه برنامه رو به صورت پلاگین توسعه داد؟
خودم یه جستجوهایی کردم به چندتا دیزاین پترن و مثال های خیلی ساده برخوردم که جالب نبود و چیزی دستگیرم نشد.
لطفا اگر ممکن باشه یه منبع بگین برای این موضوع که پروژه محور باشه.

نرمافزارهایی که میشه براشون پلاگین نوشت یک سری اینترفیس و api در دسترس قرار میدن.
وردپرس هم که کاملا اپن سورس.
فکر نمیکنم چیزی که بشه بهش گفت پترن مخصوص پلاگین وجود داشته باشه، اما باید روی متاپروگرمینگ و dpendency injection تسلط پیدا کنی هرچند در کل تا جایی که امکان داره باید از متاپروگرمینگ خوداری کرد.
شاید پترن هایی مثل لینکهای زیر و غیره کار کنن. این خیلی به نوع کاری قراره انجام بدی ربط داره، اگر دقیقا بدونم شاید بهتر بتونم کمک کنم.


1 پسندیده

چرا باید از متا پروگرمینگ اجتناب کرد ؟دلیل خاصی داره ؟

متاسفانه من ب این راحتی تو این مورد نمیتونم مطالبو بگیرم . در مورد بعض الگوها مثل الگوی observer و mediator و… یه تحقیقاتی کردم تو بعضی سایت ها هم در موردشون و ارتباطشون با سیستم پلاگین ی چیزایی نوشته بودن و پروژه های خیلی خیلی ساده انجام داده بودن که چنان به درد نمیخورد و یه مفهوم کلی میداد .

خب این تسلط پیدا کردن خیلی وقت گیره و باید با روش ازمون و خطا تمرین برم جلو که کلی زمان میبره و ای کاش اگر منبعی در اختیار داشتین که مثلا یک cms یا هربرنامه ای رو به صورت پلاگین و پروژه محور اموزش میداد معرفی میکردین تا حداقل یه درک نسبی بدست بیارم.

نوع کارم اینه که طراح ها هرروز کلی عکس و ویدیو با حجم خیلی بالا درست میکردند و در طول روز ب طور مکرر ب این ویدیوها احتیاج پیدا میکردند و این باعث میشد کلی وقت ما گرفته بشه در نتیجه ی سیستمی زدیم که دسترسی به فایل ها راحت بشه اما الان هر هفته یه قابلیت جدید میخوان و اضافه کردن این قابلیت ها سخت و زمان بره چون یجا رو تغییر دادیم از جای دیگه خطا درمیاد یا یجا تغییر کرد باید یه یجای دیگه هم کلا تغییر پیدا کنه و واقعا کار سخت و طاقت فرسایی هست .خلاصه اخرش ب این نتیجه رسیدیم که راه رو اشتباه رفتیم و باید یه هسته ثابت طراحی میکردیم بقیه رو به صورت پلاگین توسعه میدادیم که متاسفانه برای این قسمت دانش کافی نداریم و منبعی هم نمیتونیم پیدا کنیم.
اگر منبعی معرفی کنین واقعا ممنون میشم

متاپروگرمینگ میتونه خیلی باعث‌پیچیدگی و ناخوانایی کد بشه و میتونه باعث این بشه که کد به صورت اصطلاحا جادویی عمل کنه که زیاد جالب نیست. منطقی که در رانتایم تغییر کنه باعث سختی کار در دیباگ و درک کد میشه و میتونه رفتار غیر قابل پیشبینی ایجاد کنه.
نمیگم کلا بده ولی باید با دقت زیاد انجام بشه و زیاده روی نکنیم.

قسمت دوم رو اصلا متوجه نشدم، بیشتر توضیح ‌بدی بهتره

1 پسندیده

ممنون مفید بود

خب توضیح که بنظرم خیلی ساده بود شما فکر کنید یک سیستم آپلود فایل به صورت اولیه طراحی شد و طراح های این فایل ها دقیقا همینو میخواستن و قرار نبود چیزی اضافه بشه
بعدا گفتند اینطوری نمیشه باید یه پروفایل برای هر طراح هم ایجاد بشه
بعد دوباره گفتن هر فایلی که آپلود یا دانلود یا تغییر داده میشه باید به همراه مشخصات کاربری که این کارو انجام میده ثبت بشه
خلاصه هر وقت یبار یه چیز جدید به ذهنشون خطور میکنه و یه لیست بلند بالا شده
خب الان مشکل ما دقیقاً اینه که وقتی اینها برای مثال یه قابلیت جدید دیگه میخوان ما مجبور میشیم گاهی اوقات کل کدهایی رو که نوشتیم دوباره بخونیم . خب هرچقدر هم کد کامنت گذاری بشه یا از گیت استفاده بکنیم بازم برای آدم کار طاقت فرسا و سختی هست
از طرفی ایجاد کردن این قابلیت جدید باعث بروز یک سری خطاهای دیگه میشه ، یا وقتی یک چیز جدید اضافه میکنیم برای اضافه کردن این گزینه جدید مجبوریم دوباره قسمت های قدیمی رو ویرایش کنیم یا حتی از نو بنویسم
خب تمام این کارها وقت خیلی زیادی از ما میگیره و انرژی زیادی هدر میده برای همین میخواهیم که اول یک هسته یکپارچه و ثابت رو طراحی کنیم و دیگه کلاً با اون کاری نداشته باشیم ، بعد بقیه قسمت ها رو که قراره اضافه بکنیم به صورت پلاگین توسعه بدیم و روی این هسته نصب کنیم و این کار باعث میشه که خیلی از مشکلات ما کم بشه
الانم کلی جستجو کردیم ولی هیچ منبع جامعی نمیتونیم پیدا کنیم که یک سیستم رو به این صورت آموزش بده

1 پسندیده

کل نت رو هرچقدر گشتم هیچی پیدا نشد بجز یک کتاب برای php که اونم ننوشته بود خیلی بهتر بود . حالا این داستان بیشتر شبیه داستان پیداکردن دعا و جادو جمبل شد که میگن علوم خفیه دسته اساتید هست و نباید در دست غریبه ها بیافته و علوم این هم انحصاری هست و چیزی براش وجود نداره

بنظر من اگر برای اضافه کردن هر امکانی این همه دردسر وجود داره احتمالا معماری مناسبی انجام نشده یا اینکه پیچیدگی های بیخودی توی سیستم وجود داره.
سعی کنید تا جایی که امکان داره مدل ها و فرایند ها از هم جدا باشند، اگر mvc کار شده میتونید یک لایه view model به سیستم اضافه کنید.
یادمه توی پست پیشنهاد کردم mvc رو با متدهای دیگه مقایسه کنید، شاید بد نباشه از کار روی repository pattern و view model به عنوان راهبرد کلی شروع کنی.
و باتوجه به اینکه از وردپرس اسم بردی بد نیست مطلب زیرو بخونی و ببینی وردپرس برای حل هر مشکلی از چه راهی استفاده کرده، اکثر اینا کاملا استاندارده و توی هر نرمافزار دیگه ای ممکنه بکار رفته باشه.
هر جا مشکلی بود بپرس

3 پسندیده

ممنون ببنیم چیکار میکنم

درود خدمت اساتید و دوستان محترم .

البته نمی دونم این توضیح که من می دم اصلا علمی هست و یا اینکه بدرد شما می خورد یا خیر .

در جوملا ما سه چهار عنصر اصلی داریم :

۱. قالب : اگر به زبان ساده بخواهیم بگوییم شکل ظاهری سایت با استقلال تقریبی نسبت به دیگر عناصر جوملا که امکان نوشتن و همینطور استفاده کردن از apiهای افزونه نویسی نیز در آن میسر هست ولی هیچ وقت پیشنهاد نمی گردد

۲. کامپوننت : همیشه به این صورت تعریف می شود . یک اسکریپت کاملا مستقل که تبدیل می شود با api های جوملا و در بستر دیتابیس جوملا چرخه زندگی دارد .

۳.ماژول : بیشتر مربوط به نمایش یک اطلاعات و فرم های ارجاعی می باشد . دسترسی های کمتری نسبت به پلاگین دارد . مثل ماژول نمایش آب هوا یا تاریخ و قیمت ارز و … یک کامپوننت می تواند چندین ماژول برای خودش داشته باشد مثل جستجوی پیشرفته و …

۴. پلاگین : تقریبا می شود گفت در بکگراند اجرا می شود یا امکانی را به هسته کامپوننت اضافه می کند

plugin

من برای توضیح تجربی نسبت به جوملا این تصویر بالا رو درست کردم . اگر توجه کنید یک مربع بزرگ هست که من اون رو کامپوننت نامگذاری می کنم و در این مربع چندین مربع کوچک هست که هر کدام یک پلاگین می باشند

حال ما در پلاگین چند نوع خاصیت داریم که دوتاشون مدنظر هست :

۱. موارد مربوط به اکشن
۲. موارد مربوط به قیافه

چرا پلاگین موارد مربوط به قیافه رو قرار می ده :

شما فکر کنید یک فروشگاه ساز در جوملا درست می شه حالا یکی می یاد می گه من می خوام به این افزونه امکانی رو اضافه کنم تا برای من مثل دیجی کالا گراف بکشه

مثلا من یک پلاگین خیلی خیلی ساده برای اطلاعات بیشتر برای یک افزونه فروشگاهی جوملا چندین وقت پیش درست کردم
https://trangell.com/fa/blog/67-پلاگین-نمودار-قیمت-کامپوننت-فروشگاه-ساز-hikashop-جوملا

اگر متوجه شده باشید تیم سازنده این قابلیت و جایگاه را به من داده تا این کارو بکنم یعنی بستر آماده بوده و با اینکارش باعث می گردد هر آبدیت کد های من پاک نشود و به صورت مستقل کد های من کار کند تا زمانی بستر وجود دارد .

حالا قیمت اکشن : اینجا دقیقا جاهایی هست که تیم سازنده کامپوننت تصمیم می گیرد به شما بستر های ماسبی بدهد مثل تصویر بالا . فکر کنید شما دو امکان دارد

۱.قبل از ذخیره کردن محصول
۲. بعد از ذخیره کردن محصول

خوب با این امکان شما می تونید هر امکانی رو برای این افزونه بنویسید و مستقل کار کند و به دیتابیس این افزونه که افزونه مادر هست متصل شود .

در حقیقت در جوملا به نظر من پلاگین نویسی یعنی اینکه ما به عنوان سازنده کامپوننت مادر بیاییم کلید های زیادی را در جای جای مختلف بسازیم و انعطاف افزونه را بالا ببریم . و همینطور کلاس هایی را درست بکنیم به صورت مثال تا برخی از دسترسی ها برای ارائه کار بهتر در سریع ترین زمان ممکن به کاربر بدهد . این زمان هست که وقتی روی جوملا یک پلاگین نوشته می شود لذت بخش هست چون اکثر کار ها مثل مثلا خواندن دیتابیس یا دیدن یوزر آیدی و … نوشته شده .

امید وارم فایده براتون داشته باشه

3 پسندیده

بنظر خوب میاد،
اگر اشتباه نکنم و یادم نرفته باشه پلاگین های جوملا بر اساس رویدادهایی(events) که هدف پلاگین هستند دسته بندی شدند و جوملا به صورت پیشفرض رویدادهای زیادی داره که واقعا کار راه اندازه.

2 پسندیده

واقعا دستت درد نکنه و ممنون که زحمت کشیدی .راستی اون تصویر با balsamic mockup درست شده ؟ من تو اموزش یودمی این برنامه رو دیدم و واقعاً یکی از بهترین ابزارهایی بوده که باهاشون آشنا شدم .
شهریار جان اینکه چنین سیستم هایی چجوری کار میکنن یا توضیح دادنشون آسونه اما تو عمل واقعاً سخته ولی بنظر من اگر یک سال هم بکشه این کار ارزشش رو داره و یک امتیاز خیلی بزرگه اما متاسفانه هیچ منبع خاصی براشون وجود نداره که آدم بخواد از یه جا شروع کنه
من تا حالا به چنین مشکلی برنخورده بودم اما الان میدونم چرا همچین چیزی قبلاً بوجود آومده و شک ندارم اونا هم مثل ما گیر یه عده آدم وسواسی افتادن که هر شب قبل خواب یه چیز جدید به ذهن مبارکشون خطور کرده و فردا ما رو مجبور کردن ایده اینا رو تبدیل به فعل کنیم و دردسر از اونجایی شروع میشه که برای اضافه کردن یک سیستم ثبت تغییرات ویدیو مجبور شدیم کل برنامه رو بازنویسی کنیم ! هرچند ارزشش رو داشت و من تازه متوجه شدم از شی گرایی هیچی متوجه نبودم و باید یک بازبینی خیلی اساسی در مورد شی گرایی انجام بدم .
متاسفانه اساتید هم هیچ کمکی نمیکنن البته تا حالا تونستم یک سری اطلاعات واقعاً مفید بدست بیارم که پیشنهاد میکنم حتماً مطالعه کنی :

http://www.kianpub.com/book/1513
یکیش این کتابه که در اون یاد میده چطور یک سیستم مدیریت محتوا طراحی کنیم و از فصل های میانی شروع میکنه به نوشتن افزونه و … یاد میده چطوری مدیریت محتوا رو به صورت یک هسته طراحی کنیم و مابقی قابلیت ها رو به صورت افزونه وارد کنیم !هرجند کاش بهتر بود زبانش php نبود اما در بیابان لنگه کفشی هم غنیمته !

دومیش هم اینه که تا جایی که من فهمیدم برای پیاده کردن همچین سیستمی باید به الگوهای طراحی واقعاً مسلط بود و وب سایت زیر خوب پوشش داده :

https://softskill.ir/learn/java-technologies/learn-design-patterns

اینم بد نیست :

مابقی هم به خلاقیت و تمرین بستگی داره و باید از یجا شروع کرد بالاخره مسلط میشم ! :slight_smile:
بنظر من حتما کتاب و لینک اول رو بخون من بتازگی فهمیدم هیچی رو درست حسابی بلد نیستم و باید دوباره یه سری درک عمیق بدست بیارم !

1 پسندیده

درود خدمت توماج عزیز . بله کلا بر اساس رویداد هاست . البته رویداد هایی که برای کامپوننت کانتنت جوملا نوشته شده البته یک بخشی رو هم خود جوملا قرار داده که چطور در کامپوننت کاستوم هم این مراحل اجرا بشه . ولی واقعا داکیومنت جوملا ضعیف هست آدم می ره توش تازه می فهمه چقدر پر از اشتباه و مشکله

1 پسندیده

@mortezaKcode عزیز . من که نسبت به دوستان و اساتید اصلا سوادی ندارم . ولی همین مقدار می دونم قضیه سیستم مدیریت محتوا هایی که جدیدا درست می شود با سیستم های محتوایی که در گذشته مثل جوملا و … درست شده فرق می کند . الانا کلا روندشون اختصاصی شده مثلا می گم سیستم مدیریت محتوا درست شده برای اجرا کردن فقط کار x دیگه عمومی بودنش داره تقریبا از بین می ره و بر اساس هر نیاز .

من برای تکمیل حرفم این لینک هارو هم به اشتراک می زارم با ساختار جوملا بیشتر آشنا بشی شاید بهت کمک بکنه

امنیت داده ها
https://docs.joomla.org/Secure_coding_guidelines

ولید اینپوت ها
https://docs.joomla.org/Retrieving_request_data_using_JInput

آموزش کامپوننت نویسی جوملا
http://lendr.websparkinc.com

دسته بندی کلیه خروجی های ورودی های جوملا

بانک اطلاعاتی
https://docs.joomla.org/Selecting_data_using_JDatabase#Single_Value_Result

کلاس های نمایش تاریخ جوملا JDate
https://docs.joomla.org/How_to_use_JDate
https://docs.joomla.org/API16:JHtml/date
https://docs.joomla.org/JFactory/getDate

فیلد های مربوط به xml
https://docs.joomla.org/Standard_form_field_types

دیتابیس برای فایل های اکس ام ال
https://docs.joomla.org/SQL_form_field_type

ساخت کامپوننت جوملا
https://docs.joomla.org/J3.x:Developing_an_MVC_Component

فانکشن بیسیک کامپوننت
https://docs.joomla.org/Absolute_Basics_of_How_a_Component_Functions

دیاگرام کامپوننت
https://docs.joomla.org/Component_Program_Flow

اسلاید شو مخصوص ساخت کامپوننت جوملا متوسط و پیشرفته

فعال کردن یک مدل و استفاده در چند جا
https://docs.joomla.org/Using_multiple_models_in_an_MVC_component

اضافه کردن جاوااسکریپت در جوملا
https://docs.joomla.org/Adding_JavaScript

ساخت ماژول جوملا
https://docs.joomla.org/J3.x:Creating_a_simple_module/Developing_a_Basic_Module

ساخت پلاگین برای جوملا
https://docs.joomla.org/J3.x:Creating_a_Plugin_for_Joomla

ثابت های جوملا
https://docs.joomla.org/Constants
https://docs.joomla.org/Category:JURI

ثابت وارد کردن کد در سایت
https://docs.joomla.org/Retrieving_request_data_using_JInput

ساخت به روز رسانی و نصب شونده
https://docs.joomla.org/J2.5:Developing_a_MVC_Component/Adding_an_install-uninstall-update_script_file

کلاس های جوملا

اطلاعات مربوط به اکس ام ال نویسی در جوملا
https://docs.joomla.org/Manifest_files

رویداد های جوملا برای ساخت افزونه
https://docs.joomla.org/Plugin/Events

فرم ولیدیشن طرف سرور
https://docs.joomla.org/Server-side_form_validation

فرم ولیدیشن طرف کلاینت
https://docs.joomla.org/Client-side_form_validation

اضافه کردن ورفایشن
https://docs.joomla.org/J2.5:Developing_a_MVC_Component/Adding_verifications

ساخت فرم در جوملا
https://docs.joomla.org/Category:Form_fields

امنیت csrf در فرم ها
https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms

کلیه داکیومنت های مربوط به امنیت در جوملا
https://docs.joomla.org/Category:Security

چک لیست امنیت
https://docs.joomla.org/Category:Security_FAQ

Document جوملا مخصوص قرار دادن اطلاعات در چیزی
https://docs.joomla.org/API16:JDocument
https://docs.joomla.org/API15:JDocument

بخش لینک ها و روتر ها
https://docs.joomla.org/Search_Engine_Friendly_URLs

ساخت پلاگین جستجو برای کامپوننت
https://docs.joomla.org/J3.x:Creating_a_search_plugin#Quick_tips

کوتاه کردن لینک روی دامنه
http://danxuliu.users.sourceforge.net/files/joomla/simplecustomrouter.html

ساخت آبدیت سرور برای افزونه
https://docs.joomla.org/Deploying_an_Update_Server

استفاده از رویداد ها برای ساخت پلاگین مثلا در مطالب جوملا
https://docs.joomla.org/Plugin/Events/Content

و همینطور اضافه کردن event در کامپوننت شفارشی که خودمان طراحی می کنیم

https://docs.joomla.org/Supporting_plugins_in_your_component

بله من همیشه از همون برنامه ای که نام بردی و همینطور OmniGraffle برای شماتیک کردن استفاده می کنم

2 پسندیده

عزیز در این مورد اگر منبعی داری ممنون میشم به اشتراک بزاری
بابت لینک ها هم تشکر

1 پسندیده

نه فقط چندتا از این جدید هارو تست کردم ولی لینکی باشه حتما برات ارسال می کنم

تشکر

2 پسندیده