الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حملة لمقاطعة الجملة الشرطية if-statement !

بدأه Abdullah.Alshammeri في 6 مايو 2010 · 12 رد · 2,539 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

لا أعرف ان تطرّق أحد لهذا الموضوع من قبل ، لكن وجدت قبل بضعة أيام من تاريخ هذه المشاركة موقع الكتروني - تجمّع - يدعو لمناهضة الجملة الشرطية if-statement ،,والحد منها ، بعنوان Anti-If Campaign ، فمثلاً كود كهذا ، قد يمر عليك كثيراً و يصيبك بالاحباط

:if( a == 1)
	{
		if(b == 2 )
			if( c == 3)
			{
				doSomething();
			}
			else if ( c == 4 ) 
			{
				doSomething2();
			}
			else{
				doSomething3();
			}
		else if ( b == 3){
			doSomething4();
		}
		else {
			doSomething5();
		}
	}
else{
	doSomething6();
}

الموقع يقول أن هناك طرق أفضل لمعالجة هذه الطريقة السيئة في الكتابة بالاعتماد على " مفاهيم البرمجة الكائنية " ، ويضع شعار له: Less IFs, More Power

لا أعرف هل ما يقولونه واقعي ؟ أم مجرد فلسفة و لفت أنظار .. وهل يمكن بالفعل الاستغناء عن جمل شرطية متداخلة بطرق وأنماط أخرى ؟

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

كلامهم واقعي جداً. الجمل الشرطية المتداخلة أو nested IF statements تجعل الكود صعب القراءة. وطبعاً هناك بدائل حسب الحالة الموجودة. هذه من الأسباب التي تجعلني أحب VB أكثر من #C هو أن تركيبة Select Case في الأولى أقوى من تركيبة switch في الأخيرة.

#3

يوجد هناك طرق اخرى في الجافا مثل recursive method و switch

لكن قد تكون اسهل عند البعض وعند الاخر لا

albert_einstein.jpg

Untitled-AE.jpg
#4

switch ليست مرنة مع كل الأنواع ، وبالتالي استخدامها محدود ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

الحل الذي يقدموه باستخدام الInheritance هو حل فاشل, فهو أعقد 1000 مرة من استخدام الIf

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#6

حل استخدام الـOOP، مثل كل شئ، مناسب في بعض الحالات في رأيي. هل هناك بديل واحد للجمل الشرطية المتداخلة؟ كلا. لكل حالة الحل المناسب لها.

#7

عن نفسى ارى ان المثال واضح ومعبر

name : mohamedyosry

#8

عندما قرأت الموضوع قلت في نفسي التجربة خير برهان

خلينا نشوف من أفضل طريقة

ناخذها خطوة خطوة...

لو كان عندي منتج: أ و ب.

منتج أ يوجد منه ثلاثة أنواع: ج د هـ.

منتج ج يوجد منه ثلاثة أنواع: و ز ط.

يكون المجموع 7 منتجات مختلفة.

لو مثلناها بالكون يطلعنا كود شبيه بكود الأستاذ "الشمري"

static void IIfStatements(int a, int b, int c)
        {
            if( a == 1)
            {
                if (b == 2)
                {
                    if (c == 3) doSomething(a, b, c);
                    else if (c == 4) doSomething(a, b, c);
                    else doSomething(a, b, c);
                }
                else if (b == 3) doSomething(a, b, c);
                else doSomething(a, b, c);
            }
            else doSomething(a, b, c);  
        }

طيب في حالة جماعة المناهضة للجمل الشرطية ، يكون الكود مختلف قليللا:

    public abstract class MyBaseClass
    {
        public int a, b, c;
        public MyBaseClass() { }
        public abstract void doSomething();
    }
    public abstract class AEqual1Class : MyBaseClass
    {
        public AEqual1Class() {a = 1;}   
    }
    public abstract class BEqual2Class : AEqual1Class
    {
        public BEqual2Class(){b = 2;}
    }
    public class CEqual3Class : BEqual2Class
    {
        public CEqual3Class(){c = 3;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }
    }
    public class CEqual4Class : BEqual2Class
    {
        public CEqual4Class(){c = 4;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }
    }
    public class CEqualOtherClass : BEqual2Class
    {
        public CEqualOtherClass() {c = 100;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }
    }
    public class BEqual3Class : AEqual1Class
    {
        public BEqual3Class(){b = 3;c = 100;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }
    }
    public class BEqualOtherClass : AEqual1Class
    {
        public BEqualOtherClass(){b = 100;c = 100;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }
    }
    public class AEqualOtherClass : MyBaseClass
    {
        public AEqualOtherClass(){a = 100;b = 100;c = 100;}
        public override void doSomething()
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}",a,b,c);
        }
    }

إذا قررنا المقارنة بين الكودين ، ينبغي لنا حساب كل حالة لوحدها و مقارنتها في الطريقتين. بمعنى أنه لو كان a=100 و b=100 و c=100 نحسبها بالطريقة الأولى والثانية ونقارن من أفضل نتيجة في سرعة الحساب.

وللسهولة قررت أن أكتب كود للطريقة "doSomthing" لكي توضح لنا مكان التنفيذ داخل الكود

static void doSomething(int a,int b,int c)
        {
            System.Threading.Thread.Sleep(1000);
            System.Console.WriteLine("\tvalues a={0}, b={1}, c={2}", a, b, c);
        }

والآن إلى النتائج:

in case of IF statements a=100, b=100, c=100
        values a=100, b=100, c=100
1.00619492645912 seconds
in case of *NO* IF statements a=100, b=100, c=1
        values a=100, b=100, c=100
0.499456347674696 seconds
in case of IF statements a=1, b=100, c=100
        values a=1, b=100, c=100
0.333323067994865 seconds
in case of *NO* IF statements a=1, b=100, c=100
        values a=1, b=100, c=100
0.249895601507773 seconds
in case of IF statements a=1, b=3, c=100
        values a=1, b=3, c=100
0.200379324787097 seconds
in case of *NO* IF statements a=1, b=3, c=100
        values a=1, b=3, c=100
0.166854522360645 seconds
in case of IF statements a=1, b=2, c=100
        values a=1, b=3, c=100
0.142798249143871 seconds
in case of *NO* IF statements a=1, b=2, c=100
        values a=1, b=2, c=100
0.125212235872841 seconds
in case of IF statements a=1, b=2, c=4
        values a=1, b=3, c=4
0.111325223259706 seconds
in case of *NO* IF statements a=1, b=2, c=4
        values a=1, b=2, c=4
0.10132541944173 seconds
in case of IF statements a=1, b=2, c=3
        values a=1, b=3, c=3
0.0910784876580769 seconds
in case of *NO* IF statements a=1, b=2, c=3
        values a=1, b=2, c=3
0.0835666302589329 seconds

لو نلاحظ في جميع الحالات الطريقة الثانية أفضل بالدليل مع الأرقام. لأكن صريحا النتائج جائت عكس توقعاتي.

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#9

وهذا المقال بالانجليزية

http://blogs.msdn.com/wael/archive/2010/05/12/if-statements-vs-object-oreiented-practices.aspx

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#10
اقتباس
لو نلاحظ في جميع الحالات الطريقة الثانية أفضل بالدليل مع الأرقام

أتفق معك يا أخي, كما أن إستخدام ال polymorphism في مثل هذه الحالات يساعد على التوسعيه و الإمتداديه  

#11

شاهدت الموضوع لتوي

توقعت أجد خلاصة بنهاية الموضوع والنقاش :(

System Administrator

#12
اقتباس
توقعت أجد خلاصة بنهاية الموضوع والنقاش :(

لايوجد خلاصة في مثل هذه المواضيع ، فهي جدلية بطبعها وللنقاش فقط ;) .

-===

إضافة مميزة من Memonono ، لم أشاهدها إلا اليوم .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#13

البدائل غالباً ما تأتي من تصميم الأنماط design pattern

النقطة هي التي أشار لها الأخ هويدي وهي المرونة Flexibility و التوسعية Extendability

يمكنك في أي و وقت أن تضيف نوع جديد ويمكن أي شخص أن يقوم ببناء النوع الخاص به بدون أن يضطر إلى تعديل الشيفرة الخاصة بك

ولا حتى أن يعيد تحزيمها مرة أخرى

النمط الأشهر في هذا الموضوع نمط الزائر visitor pattern على ما أعتقد لكني غير متأكد :)

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة