إدارة عدد كثير من الـ switch cases / OOP

ZaFaR97 • منذ 6 سنوات

سؤالي اليوم ليس سؤالًا، بقدر ما هو نوع من النقاش، أريد معرفة كيفية إدارتكم لكثرة الشروط - cases - التي قد توجد في - switch -

مثلًا: لدي switch قد تصل عدد احتمالاته إلى 100 احتمال !

فهل جميعكم تستعملون الطريقة العاديّة؟
كل احتمال له case ؟
لأني استعمل هذا الأسلوب، لكنّه مزعج في القراءة، وفي نفس الوقت يضيع الانسان، على افتراض كل احتمال يحتاج الى معالجة 20 سطرًا.
وفي نفس الوقت لايمكن جمعهم في مكان واحد بواسطة الـ regex .

فهل فيه تقنيات مثل قصّة الـ Route:: في اللارافل ؟

بحيث يكون هناك صفحة، فيها الحالة + الدالة التي سيتم تنفيذها. ( كود معالجة القيمة الوارِدة )
مثلا:
case "start" : startFunction()
case "stop" :" stopFunction()

 

 

#تحديث: 2018/05/05

- هل يٌمكن جعل كلّ أمر - شرط - بنظام الـ OOP

بحيث يكون انترفيس، ويتم عمل إمبلمنت لكل case وتنفيذه على حِده ؟

أو كيف يمكن ضبط مثل هذا الأمر في OOP

كلمات دليلية: cases oop php switch

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

الإجابات (5)

عمار الخوالدة • منذ 6 سنوات

حدد نوع البيانات التي تستقبلها ونوع الأوامر التي تريد تنفيذها وما الذي تفعله بالضبط حتى يكون الحل أكثر وضوحا، لكن بشكل عام اذا كنت تتعامل مع نصوص حاول الاستغناء عن switch واستخدام call_user_func بحيث تكون البيانات التي تستقبلها هي عبارة عن اسم ال function التي تريد استدعاءها، أو أن تكون مرتبطة بها باستخدام Associative Arrays، بالاضافة إلى معالجة النص باستخدام regex في حال وجود قيم قد  تتغير داخل النص.

ZaFaR97 • منذ 6 سنوات
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

و هل من حلول أخرى؟ انتظر بقية الزملاء

 

وأنا ساجرب هذه الحلول لمعرفة هل تناسب عملي أو لا

عمار الخوالدة • منذ 6 سنوات

اذا كانت صيغة النص الوارد غير محددة نهائيا لا بشكل واحد ولا بأشكال محدودة فلا أظن أن يكون هناك طريقة لمعالجة جميع البيانات مرة واحدة، وستضطر لاستخدام switch بالطريقة الطويلة التي ذكرتها في السؤال، اما اذا كانت الصيغة موحدة او هناك عدد من الصيغ المحددة والمعروفة وبامكانك معالجتها باستخدام regex فالأمر بسيط، لنأخذ مثلا start_car على سبيل المثال، ولنفترض وجود function باسم start() وتحتاج لتمرير البارمترات الموجودة بالنص، وبعد معالجة النص باستخدام regex اصبح لديك ال array التالية :


$x = ['start', 'car'];

فبإمكانك ببساطة استخدام :
 


call_user_func($x[0], $x[1]);

 

وهكذا مع باقي الصيغ، وهذا فقط في حالة كان بالامكان توحيد طريقة كتابة الاوامر المستقبلة.

Ali Majrashi • منذ 6 سنوات

الي فهمته من السؤال هو ان لديك حالات كثيره وترغب بترتيبها باستخدام البرمجة الكائنية 

طريقتك القديمة هي باستخدام 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 حيث انها سوف تحل العديد من مشاكل التطوير ليصبح لديك كود اسهل ومرن ويمكن تطويره وصيانته مستقبلا 

albader • منذ 6 سنوات

اهلا ابو عبدالعزيز

 

طيب طالما الامر متغير وغير ثابت 

ليش ماتسوي توحيد الامر مع اسم الدالة مثلا على سبيل المثال طبعا وهي فكرة اكثر من انها تكون حل

ان البرنامج يستخدم  عن طريق الطرفية او الترمنال راح يكون هناك مدخل من المستخدم 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

واعتذر لاني مافهمت معنى الامر متغير من الاساس ركزت وقرات وقرات لكن مافهمت المقصود بمتغير

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !