إدارة عدد كثير من الـ switch cases / OOP
سؤالي اليوم ليس سؤالًا، بقدر ما هو نوع من النقاش، أريد معرفة كيفية إدارتكم لكثرة الشروط - cases - التي قد توجد في - switch -
مثلًا: لدي switch قد تصل عدد احتمالاته إلى 100 احتمال !
فهل جميعكم تستعملون الطريقة العاديّة؟
كل احتمال له case ؟
لأني استعمل هذا الأسلوب، لكنّه مزعج في القراءة، وفي نفس الوقت يضيع الانسان، على افتراض كل احتمال يحتاج الى معالجة 20 سطرًا.
وفي نفس الوقت لايمكن جمعهم في مكان واحد بواسطة الـ regex .
فهل فيه تقنيات مثل قصّة الـ Route:: في اللارافل ؟
بحيث يكون هناك صفحة، فيها الحالة + الدالة التي سيتم تنفيذها. ( كود معالجة القيمة الوارِدة )
مثلا:
case "start" : startFunction()
case "stop" :" stopFunction()
#تحديث: 2018/05/05
- هل يٌمكن جعل كلّ أمر - شرط - بنظام الـ OOP
بحيث يكون انترفيس، ويتم عمل إمبلمنت لكل case وتنفيذه على حِده ؟
أو كيف يمكن ضبط مثل هذا الأمر في OOP
ساعد بالإجابة
"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."
الإجابات (5)
حدد نوع البيانات التي تستقبلها ونوع الأوامر التي تريد تنفيذها وما الذي تفعله بالضبط حتى يكون الحل أكثر وضوحا، لكن بشكل عام اذا كنت تتعامل مع نصوص حاول الاستغناء عن switch واستخدام call_user_func بحيث تكون البيانات التي تستقبلها هي عبارة عن اسم ال function التي تريد استدعاءها، أو أن تكون مرتبطة بها باستخدام Associative Arrays، بالاضافة إلى معالجة النص باستخدام regex في حال وجود قيم قد تتغير داخل النص.
19 دقائق مضت, عمار الخوالدة said:حدد نوع البيانات التي تستقبلها ونوع الأوامر التي تريد تنفيذها وما الذي تفعله بالضبط حتى يكون الحل أكثر وضوحا، لكن بشكل عام اذا كنت تتعامل مع نصوص حاول الاستغناء عن switch واستخدام call_user_func بحيث تكون البيانات التي تستقبلها هي عبارة عن اسم ال function التي تريد استدعاءها، أو أن تكون مرتبطة بها باستخدام Associative Arrays، بالاضافة إلى معالجة النص باستخدام regex في حال وجود قيم قد تتغير داخل النص.
عندي أوامر: تشغيل / ايقاف / اضافة / حذف / واحيانا تكون مرتبطة بقيَم مختلفة.
مثلا:
start_car1
فهنا أستعمل regex
و اعطيه أمر تشغيل car1
وممكن يكون الـ car متغير على حسب الأمر الوارِد.
المشكلة هنا هو أن صيغة النصّ الوارد ليست محددة دائمًا.
قد تكون:
start / start_1 / start_car / startCar / start123 / start@user ... etc
و هل من حلول أخرى؟ انتظر بقية الزملاء
وأنا ساجرب هذه الحلول لمعرفة هل تناسب عملي أو لا
اذا كانت صيغة النص الوارد غير محددة نهائيا لا بشكل واحد ولا بأشكال محدودة فلا أظن أن يكون هناك طريقة لمعالجة جميع البيانات مرة واحدة، وستضطر لاستخدام switch بالطريقة الطويلة التي ذكرتها في السؤال، اما اذا كانت الصيغة موحدة او هناك عدد من الصيغ المحددة والمعروفة وبامكانك معالجتها باستخدام regex فالأمر بسيط، لنأخذ مثلا start_car على سبيل المثال، ولنفترض وجود function باسم start() وتحتاج لتمرير البارمترات الموجودة بالنص، وبعد معالجة النص باستخدام regex اصبح لديك ال array التالية :
$x = ['start', 'car'];
فبإمكانك ببساطة استخدام :
call_user_func($x[0], $x[1]);
وهكذا مع باقي الصيغ، وهذا فقط في حالة كان بالامكان توحيد طريقة كتابة الاوامر المستقبلة.
الي فهمته من السؤال هو ان لديك حالات كثيره وترغب بترتيبها باستخدام البرمجة الكائنية
طريقتك القديمة هي باستخدام switch
للمرور على جميع الحالات وتنفيذ الحالة المطلوبه
طبعا في البرمجة الكائنية يوجد مايسمى design pattern وهي اساليب وطرق لتصاميم الاكواد اوجدها المطورين لحل العديد من المشاكل والتغلب على عقبات التطوير وتسهيل عملية التطوير والصيانة مستقبلا تستطيع البحث عنها والقراءة عنهم اذا فهمتها راح تقدر تصمم اكواد اكثر مرونة وقابلة للقراءة والتطوير والصيانه ويجب ان تستخدم الاسلوب المناسب بالمكان المناسب لان لكل اسلوب مزايا وعيوب وكما اشرت بسؤالك عن لارافيل فهي من اشهر الأطر التي تستخدم هذه الاساليب في بناء المشروع والاساس ولهذا تجد كثير من مطوريها يعجب بها ويستمر باستخدامها
نرجع للمشكلة كما قلت لديك العديد من switch
cases وترغب باعادة برمجتهم باسلوب البرمجة الكائنية للحصول على كود قابل للقراءة ويسهل تطويره وصيانته مستقبلا
عندي اقتراح وتستطيع تعديله بما يناسبك طبعا
لنفرض ان لديك موقع مثل عالم البرمجة ولديك العديد من الاقسام مثل المقالات والدورات و سؤال وجواب ولديك العديد من الفلاتر التي وان تشابهت في الاسم من الممكن ان تختلف بطريقة تنفيذ الكود وحتى بعضها محصور على قسم دون الآخر هنا تستطيع تطوير هذا النظام باستخدام البرمجة الكائنية عن طريق انشاء كلاس من النوع abstract
نسميه Filters
داخل هذا الكلاس راح نعرف جميع الوظائف والخصائص التي نحتاجها بكل الاقسام والممكن الاستفادة منها بجميع الفلاتر وبعدها نقوم بانشاء كلاس مخصص لكل قسم مثلا ArticleFilters
وبطبيعة الحال سيرث هذا الكلاس كل ماهو موجد داخل كلاس Filters
داخل كلاس ArticleFilters
سوف نقوم بتعريف الفلاتر الخاصه بالمقالات لكل فلتر سوف نعرف دالة تقبل مدخل واحد وتنفذ كود عليه ويعيد قيمة تستطيع التعامل معها لاحقا
لايصال المعلومة بواسطة الاكواد راح اضع امثلة عامة اتمنى ان تفيدك
هنا كود كلاس Filters
:
abstract class Filters
{
/**
* @var $result
*/
public $result;
/**
* Create a new Filters instance.
*
* @param $filter
* @param $value
*/
public function __construct($filter, $value)
{
if (method_exists($this, $filter)) {
$this->result = $this->$filter($value);
}
}
}
لاحظ ان هذا الكلاس سوف يكون الاساس الذي نضع فيه جميع الوظائف اي الدوال التي نحتاجها بجميع الفلاتر الأخرى حاليا عند وراثة هذا الكلاس من قبل كلاس آخر سوف يرث __construct
الذي بدوره سوف يطلب مدخلين واحد فلتر filter
والثاني قيمة value
بحيث انه سوف ياخذ الفلتر ويبحث عنه داخل الكلاس اذا وجد دالة تحمل نفس الاسم سوف يقوم بتنفيذها بتمرير القيمة المدخله لها
سوف نقوم بانشاء كلاس باسم ArticleFilters
كالتالي:
class ArticleFilters extends Filters
{
/**
* Filter articles based on status.
*
* @param string $status
* @return string
*/
public function status($status)
{
if ($status == 'all') {
return 'articles with all types';
}
return 'articles with default types';
}
/**
* Filter articles based on comments order.
*
* @param $order
* @return string
*/
public function comments($order)
{
if ($order == 'desc') {
return 'articles with comment in desc order';
}
return 'articles with comment in asc order';
}
}
لاحظ هنا عند تعريف هذا الكلاس قمنا باستخدام الامر extend
لوراثة جميع وظائف وخواص الكلاس Filters
الذي سبق وعرفناه وبطبيعة الحال هذا الكلاس ايضا يمكن ان يحتوي على عدة وظائف وخصائص مميزة فيه
لاحظ هنا انه بهذه الطريقة تستطيع عمل فلتر لكل قسم لديك مثل فلتر خاص بالدورات وفلتر خاص بالأسئلة وداخل كل فلتر تستطيع تعريف ماتحب من الوظائف (الدوال) لتنفيذها حسب المدخل واصبح الكود مقروء اكثر ومرن وسهل تطويره وصيانته بحيث لك الحرية لتنفيذ ماتحب من الاكواد داخل اي دالة معرفة وايضا ارجاع الناتج الذي ترغب فيه
وايضا تستطيع انشاء دوال داخل كلاس Filters
الاساسي ليتم استخدامه داخل اي من الكلاسات الاخرى التي ترث هذا الكلاس
وهنا اضع الكود كامل لك تستطيع نسخه لديك وتجربته لتعرف طريقة عمله هذا شيئ جدا مبسط ولكن تخيل ماتستطيع انجازه عند فهمك الكامل للبرمجة الكائنية واساليب تصميم وكتابة الاكواد
<?php
abstract class Filters
{
/**
* @var $result
*/
public $result;
/**
* Create a new Filters instance.
*
* @param $filter
* @param $value
*/
public function __construct($filter, $value)
{
if (method_exists($this, $filter)) {
$this->result = $this->$filter($value);
}
}
}
class ArticleFilters extends Filters
{
/**
* Filter articles based on status.
*
* @param string $status
* @return string
*/
public function status($status)
{
if ($status == 'all') {
return 'articles with all types';
}
return 'articles with default types';
}
/**
* Filter articles based on comments order.
*
* @param $order
* @return string
*/
public function comments($order)
{
if ($order == 'desc') {
return 'articles with comment in desc order';
}
return 'articles with comment in asc order';
}
}
$articles = new ArticleFilters('status', 'all');
var_dump($articles->result);
فكما نصحتك ابحث عن مفاهيم البرمجة الكائنية حيث يحتوي موقع عالم البرمجة على العديد من المصادر عنها وايضا ابحث عن design pattern حيث انها سوف تحل العديد من مشاكل التطوير ليصبح لديك كود اسهل ومرن ويمكن تطويره وصيانته مستقبلا
اهلا ابو عبدالعزيز
طيب طالما الامر متغير وغير ثابت
ليش ماتسوي توحيد الامر مع اسم الدالة مثلا على سبيل المثال طبعا وهي فكرة اكثر من انها تكون حل
ان البرنامج يستخدم عن طريق الطرفية او الترمنال راح يكون هناك مدخل من المستخدم args
طريقة التشغيل تكون
php file.php start_car
يقوم بالتاكد من المدخل هل يوجد دالة بهذا الاسم او لا لو كان فيه دالة يقوم بتنفيذها
طبعا لمعرفة الدوال
function start_care($id){ return false;}
function stop_care($id){ return true;}
function speed_care($id){ return false;}
$arr = get_defined_functions();
print_r($arr[user]);
المتغير arr يعيد لنا جميع اسماء الدوال
Array ( [0] => speed_care [1] => start_care [2] => stop_care )
هنا بعد مايتحقق يقوم بتنفيذ الدالة
طبعا هذي شطحة مني فقط لاغير ولايعتبر حل لاني مافهمت تحديدا معنى الامر متغير
الطريقة الثانيه لكل case هناك تستدعي داله
فيه دالة ب php اسمها create_function اتوقع انها كذا لو ماخانتني الذاكره خلها لكل case
واعتذر لاني مافهمت معنى الامر متغير من الاساس ركزت وقرات وقرات لكن مافهمت المقصود بمتغير
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !