عبدالوهاب العليوي | Abdulwahab Al-Alawi
Photo
إن شاء الله هنكمل مع الباب الأول من كتاب Object-Oriented Thought Process وهنتكلم عن الـInheritance بشكل مبدئي.
الكاتب بيقول إن أهم حاجة في الـOO هي إعادة استخدام الكود (Code Reusability)، وطبعًا نفس الكلام موجود في البرمجة الإجرائية (Procedural) إنك تعمل فانكشن وتستخدمها في كذا مكان عادي.
بس مع الـOO الموضوع مختلف شوية لأنك مش بس بتعيد استخدام الكود، ولكنك بتبني علاقة (Relationships) ما بين الكلاسات، والموضوع ده بيخلي التصميم العام للبرنامج أفضل بكتير. وعملية الـRelationships دي بنعملها بالـInheritance.
تعالَ ناخد مثال علشان نوضح الفكرة أكتر. لو عندك كائن (Dog) وعايز تحفّظ بصفة زي مثلًا "لون العيون"، وعندك كائن (Cat) وعايز تحفّظ برضو بصفة "لون العيون"، في الحالة دي لو أنت ماشي صح هتعمل كائن عام أكتر وتسميه Mammal (ثدييات) أو ممكن تسميه (Animal) وتحفّظ الصفة المشتركة دي فيه وتعمل وراثة من الـMammal للـDog ومن الـMammal للـCat.
وهنا بقى لو قابلك أي صفة أو سلوك مشترك في المستقبل زي وظيفة الـEat، في الحالة دي هتروح تحطها بس في الـMammal، وبالتالي بما إن فيه علاقة (Relationship) ما بين الـMammal والـCat والـDog، فبالتالي الـCat والـDog هيبقى ليهم Access تلقائي للوظيفة دي.
معلومة مهمة جدًا: في عملية الوراثة (Inheritance) مش بيحصل عملية Copy لمكونات الأب (Superclass) تتنقل للابن (Subclass)، ولكنها علاقة (Relationship). يعني طول ما فيه علاقة (Relationship) ما بين كلاس الأب وكلاس الابن، في الحالة دي كلاس الابن يقدر يوصل لمحتويات كلاس الأب. خلّي بالك أوي لأن في ناس كتير بتبقى فاكرة إنها Copy لمكونات الأب (Superclass) داخل الابن (Subclass). كلمة (Relationship) بشوفها أوضح بكتير من كلمة (Inheritance) في سياق التعريف بالمفهوم، ولكن في السياق العام بنقول (Inheritance).
علاقة الـInheritance بنقول عليها IS-A Relationship، يعني لو قولتلك أنا عندي كائن (BMW) وكائن (Toyota) وكائن (Ford)، كل دول ينفع نقول عليهم IS-A Car، صح؟ يعني كلهم مشتركين في إنهم سيارات. وبالتالي دايمًا هيبقى فيه صفات مشتركة بينهم. والحل هنا بقى إني أعمل Car Class وأحط فيه الحاجات المشتركة وأخلّي الـBMW والـToyota والـFord تورث من الكلاس ده.
خلينا ناخد مثال عن الحيوانات بدل السيارات. لنفترض إن عندنا حيوانات زي كلب (Dog)، قط (Cat)، وطائر (Bird)، وكلهم حيوانات، يعني كلهم IS-A Animal. كل الحيوانات دي بتتشارك في صفات وسلوكيات مشتركة زي إنها بتاكل، بتتحرك، وبيكون عندها اسم أو عمر. بس كل نوع حيوان عنده حاجات خاصة بيه. وبالتالي هنعمل Animal Class يكون فيه الحاجات المشتركة بينهم كلهم ونطبّق علاقة الوراثة (Inheritance).
أهم حاجة دلوقتي تبقى فاهم ليه Inheritance وليه بنستخدمه وتبقى فاهم مصطلح Relationship ما بين الـBase Class والـChild Class.
#oop #ملخص
الكاتب بيقول إن أهم حاجة في الـOO هي إعادة استخدام الكود (Code Reusability)، وطبعًا نفس الكلام موجود في البرمجة الإجرائية (Procedural) إنك تعمل فانكشن وتستخدمها في كذا مكان عادي.
بس مع الـOO الموضوع مختلف شوية لأنك مش بس بتعيد استخدام الكود، ولكنك بتبني علاقة (Relationships) ما بين الكلاسات، والموضوع ده بيخلي التصميم العام للبرنامج أفضل بكتير. وعملية الـRelationships دي بنعملها بالـInheritance.
تعالَ ناخد مثال علشان نوضح الفكرة أكتر. لو عندك كائن (Dog) وعايز تحفّظ بصفة زي مثلًا "لون العيون"، وعندك كائن (Cat) وعايز تحفّظ برضو بصفة "لون العيون"، في الحالة دي لو أنت ماشي صح هتعمل كائن عام أكتر وتسميه Mammal (ثدييات) أو ممكن تسميه (Animal) وتحفّظ الصفة المشتركة دي فيه وتعمل وراثة من الـMammal للـDog ومن الـMammal للـCat.
وهنا بقى لو قابلك أي صفة أو سلوك مشترك في المستقبل زي وظيفة الـEat، في الحالة دي هتروح تحطها بس في الـMammal، وبالتالي بما إن فيه علاقة (Relationship) ما بين الـMammal والـCat والـDog، فبالتالي الـCat والـDog هيبقى ليهم Access تلقائي للوظيفة دي.
معلومة مهمة جدًا: في عملية الوراثة (Inheritance) مش بيحصل عملية Copy لمكونات الأب (Superclass) تتنقل للابن (Subclass)، ولكنها علاقة (Relationship). يعني طول ما فيه علاقة (Relationship) ما بين كلاس الأب وكلاس الابن، في الحالة دي كلاس الابن يقدر يوصل لمحتويات كلاس الأب. خلّي بالك أوي لأن في ناس كتير بتبقى فاكرة إنها Copy لمكونات الأب (Superclass) داخل الابن (Subclass). كلمة (Relationship) بشوفها أوضح بكتير من كلمة (Inheritance) في سياق التعريف بالمفهوم، ولكن في السياق العام بنقول (Inheritance).
علاقة الـInheritance بنقول عليها IS-A Relationship، يعني لو قولتلك أنا عندي كائن (BMW) وكائن (Toyota) وكائن (Ford)، كل دول ينفع نقول عليهم IS-A Car، صح؟ يعني كلهم مشتركين في إنهم سيارات. وبالتالي دايمًا هيبقى فيه صفات مشتركة بينهم. والحل هنا بقى إني أعمل Car Class وأحط فيه الحاجات المشتركة وأخلّي الـBMW والـToyota والـFord تورث من الكلاس ده.
خلينا ناخد مثال عن الحيوانات بدل السيارات. لنفترض إن عندنا حيوانات زي كلب (Dog)، قط (Cat)، وطائر (Bird)، وكلهم حيوانات، يعني كلهم IS-A Animal. كل الحيوانات دي بتتشارك في صفات وسلوكيات مشتركة زي إنها بتاكل، بتتحرك، وبيكون عندها اسم أو عمر. بس كل نوع حيوان عنده حاجات خاصة بيه. وبالتالي هنعمل Animal Class يكون فيه الحاجات المشتركة بينهم كلهم ونطبّق علاقة الوراثة (Inheritance).
أهم حاجة دلوقتي تبقى فاهم ليه Inheritance وليه بنستخدمه وتبقى فاهم مصطلح Relationship ما بين الـBase Class والـChild Class.
#oop #ملخص
❤2
عبدالوهاب العليوي | Abdulwahab Al-Alawi
Photo
إن شاء الله هنكمل مع الباب الأول من كتاب _Object-Oriented Thought Process_، وهنتكلّم عن الـ Polymorphism بشكل مبدئي.
كلمة Polymorphism دي كلمة يونانية، معناها الحرفي "أشكال كتير". الكاتب بيقول إن المفهوم ده مرتبط جدًا بالوراثة (Inheritance)، بس في كتير من الأحيان بيتم ذكره لوحده. والكلام ده مظبوط 100%! لو حاولت تفصل الـ Polymorphism عن الـ Inheritance، هتتلخبط وهتحس إن فيه حاجة غلط أو مش مفهومة.
تعالى نأخد تعريف معين ونحاول نبسطه أكتر: التعددية (Polymorphism) تعني إن الكائنات من أنواع مختلفة يمكن تتعامل معاهم بطريقة موحدة لو كانوا بيشاركو في واجهة مشتركة أو كلاس أساسي.
شايف التعريف ده؟ وراه أقوى وأجمد حاجة حرفيًا في الـ OOP! ميكس عجيب جدًا تقدر توصلّه لما تطبق الـ Inheritance صح.
معلومة مهمة الـ Polymorphism هو نتيجة بتوصّلها لما تنفذ الوراثة (Inheritance) بشكل سليم، وبالتالي بتلاقي نفسك قادر تطبق الـ Polymorphism بكل بساطة.
الحقيقة، إحنا هنتكلّم عن مثال كان موجود في الكتاب، وهو مثال الأشكال الهندسية، زي المثلث، المربع، والمستطيل. لو عايزين نطبق الوراثة صح، لازم نسأل نفسنا: المثلث والمربع والمستطيل دول عبارة عن إيه؟ أو بمعنى تاني، علاقة الـ IS-A اللي اتكلمنا عليها في المنشور اللي فات؟ لو فكرت شوية، هتلاقيهم كلهم عبارة عن Shapes، صح (IS-A Shape). المربع Is A Shape المثلث Is A Shape الدائرة Is A Shape طيب، حلو، تعالى نشوف إحنا في سياق البرنامج بتاعنا عايزين نعمل إيه بالأشكال دي؟ وليّكن عايزين نعمل برنامج رسام بيرسم الأشكال دي، وكمان يحسبلي المحيط والمساحة بتاعة كل شكل بنرسمه.
وهنا هتلاحظ حاجة حلوة، وهي إني هعمل كلاس اسمه Shape، ماشي؟ وبعدين هسأل نفسي: إيه الحاجات اللي عايزها تتنفذ في كل الكلاسات دي؟ وليّكن الرسم، وحساب المحيط، وحساب المساحة لكل شكل.
يبقى دلوقتي هيكون عندي 3 وظايف مشتركة بين الأشكال كلها: Draw، CalcArea، وCalcPerimeter. حلو؟ بس أنت ممكن تقولي: "بس طريقة الرسم هنا مختلفة عن هنا، وكمان طريقة حساب المساحة للشكل ده مختلفة عن الشكل ده وده!" وبالتالي أنت ممكن تقولي إن المشترك الوحيد هو اسم الوظيفة بس، ولكن التنفيذ (Implementation) مختلف بينهم كلهم، يعني مفيش حاجة مشتركة علشان أروح أحطها في الـ Base Class.
هنا بقى مربط الفرس، وركز أوي. أه، كلهم بيحسبوا الـ Area مثلاً، بس طريقة حساب الـ Area هنا مختلفة عن هنا، وبالتالي مش هينفع نكتبها في الـ Base Class، صح؟ كلامك مظبوط، طالما الـ Implementation مختلف بينهم كلهم، إزاي هروح أضيف Implementation في الـ Base Class؟ ما هي كده كده مش مشتركة بينهم!
بس ينفع نعمل Interface لتعريف الـ Draw يكون فاضي بدون Implementation، صح؟ يعني بالشكل ده:
class Shape {
public virtual void Draw();
}
ياسلام، طيب ليه أصلاً أضيف Interface فاضي من غير Implementation؟ ما أنا كده كده هروح أبني الـ Method على طول في كل Subclass وأريح دماغي؟
أول سبب لوجود الـ Interface الفاضي ده هو إنه بيجبر أي Subclass إنها تقدم Implementation للوظيفة دي، وبنقول على الموضوع ده عقد (Contract). لو معملتش Implementation، هيجيلك Compile-time Error. يعني الـ Base Class بكل بساطة بيقولك: "أنا عندي وظيفة اسمها Draw، لازم تنفذها لو عايز تعمل Inheritance من عندي."
هنا برده ممكن تسأل نفسك سؤال تاني وتقول: "أنا استفدت إيه من عملية الـ Contract دي؟ وليه أصلاً أروح ألف وأعمل الحوارات دي كلها، برضو ما أنا كده كده هروح أنفذ الـ Implementation بتاع كل Subclass من الأساس؟ يعني ليه الخطوات الزيادة دي؟"
هنا بقى الـ Polymorphism! طبعاً أنت دلوقتي بتقولي يعني استفدت إيه من المعلومة دي؟ وفين الـ Polymorphism ده علشان مش شايفه؟ طالما أجبرت كل الـ Child Classes ينفذوا نفس الوظايف الموجودة في الـ Base Class، فأنا أقدر أتحكم في كل الأشكال دي بطريقة موحدة وثابتة، على الرغم من اختلاف الشكل. بحيث كل شكل يستجيب للرسالة أو للأمر على حسب نوعه الفعلي.
يعني لو عملت متغير من نوع Shape في الحالة دي، أقدر أخزن فيه أي Subclass من نفس النوع، زي كده:
لو أخدت بالك، المتغير من نوع Shape، بس النوع الفعلي بعد علامة الـ = هو من نوع Circle. والموضوع ده بنقول عليه Upcasting، ممكن تسيّرش عليه. لما أجي أشغل وظيفة الـ Draw، هتعمل إيه بالظبط؟ هتروح ترسم دايرة، صح.
بس لو غيرت محتوى متغير الـ sh من Circle لـ Square، كده:
في الحالة دي، هيروح يرسم مربع. هنا بقى كل Object بدأ يستجيب لوظيفة الـ Draw على حسب نوعه الفعلي.
ولو عملت مصفوفة من نوع Shape، كده:
كلمة Polymorphism دي كلمة يونانية، معناها الحرفي "أشكال كتير". الكاتب بيقول إن المفهوم ده مرتبط جدًا بالوراثة (Inheritance)، بس في كتير من الأحيان بيتم ذكره لوحده. والكلام ده مظبوط 100%! لو حاولت تفصل الـ Polymorphism عن الـ Inheritance، هتتلخبط وهتحس إن فيه حاجة غلط أو مش مفهومة.
تعالى نأخد تعريف معين ونحاول نبسطه أكتر: التعددية (Polymorphism) تعني إن الكائنات من أنواع مختلفة يمكن تتعامل معاهم بطريقة موحدة لو كانوا بيشاركو في واجهة مشتركة أو كلاس أساسي.
شايف التعريف ده؟ وراه أقوى وأجمد حاجة حرفيًا في الـ OOP! ميكس عجيب جدًا تقدر توصلّه لما تطبق الـ Inheritance صح.
معلومة مهمة الـ Polymorphism هو نتيجة بتوصّلها لما تنفذ الوراثة (Inheritance) بشكل سليم، وبالتالي بتلاقي نفسك قادر تطبق الـ Polymorphism بكل بساطة.
الحقيقة، إحنا هنتكلّم عن مثال كان موجود في الكتاب، وهو مثال الأشكال الهندسية، زي المثلث، المربع، والمستطيل. لو عايزين نطبق الوراثة صح، لازم نسأل نفسنا: المثلث والمربع والمستطيل دول عبارة عن إيه؟ أو بمعنى تاني، علاقة الـ IS-A اللي اتكلمنا عليها في المنشور اللي فات؟ لو فكرت شوية، هتلاقيهم كلهم عبارة عن Shapes، صح (IS-A Shape). المربع Is A Shape المثلث Is A Shape الدائرة Is A Shape طيب، حلو، تعالى نشوف إحنا في سياق البرنامج بتاعنا عايزين نعمل إيه بالأشكال دي؟ وليّكن عايزين نعمل برنامج رسام بيرسم الأشكال دي، وكمان يحسبلي المحيط والمساحة بتاعة كل شكل بنرسمه.
وهنا هتلاحظ حاجة حلوة، وهي إني هعمل كلاس اسمه Shape، ماشي؟ وبعدين هسأل نفسي: إيه الحاجات اللي عايزها تتنفذ في كل الكلاسات دي؟ وليّكن الرسم، وحساب المحيط، وحساب المساحة لكل شكل.
يبقى دلوقتي هيكون عندي 3 وظايف مشتركة بين الأشكال كلها: Draw، CalcArea، وCalcPerimeter. حلو؟ بس أنت ممكن تقولي: "بس طريقة الرسم هنا مختلفة عن هنا، وكمان طريقة حساب المساحة للشكل ده مختلفة عن الشكل ده وده!" وبالتالي أنت ممكن تقولي إن المشترك الوحيد هو اسم الوظيفة بس، ولكن التنفيذ (Implementation) مختلف بينهم كلهم، يعني مفيش حاجة مشتركة علشان أروح أحطها في الـ Base Class.
هنا بقى مربط الفرس، وركز أوي. أه، كلهم بيحسبوا الـ Area مثلاً، بس طريقة حساب الـ Area هنا مختلفة عن هنا، وبالتالي مش هينفع نكتبها في الـ Base Class، صح؟ كلامك مظبوط، طالما الـ Implementation مختلف بينهم كلهم، إزاي هروح أضيف Implementation في الـ Base Class؟ ما هي كده كده مش مشتركة بينهم!
بس ينفع نعمل Interface لتعريف الـ Draw يكون فاضي بدون Implementation، صح؟ يعني بالشكل ده:
class Shape {
public virtual void Draw();
}
ياسلام، طيب ليه أصلاً أضيف Interface فاضي من غير Implementation؟ ما أنا كده كده هروح أبني الـ Method على طول في كل Subclass وأريح دماغي؟
أول سبب لوجود الـ Interface الفاضي ده هو إنه بيجبر أي Subclass إنها تقدم Implementation للوظيفة دي، وبنقول على الموضوع ده عقد (Contract). لو معملتش Implementation، هيجيلك Compile-time Error. يعني الـ Base Class بكل بساطة بيقولك: "أنا عندي وظيفة اسمها Draw، لازم تنفذها لو عايز تعمل Inheritance من عندي."
هنا برده ممكن تسأل نفسك سؤال تاني وتقول: "أنا استفدت إيه من عملية الـ Contract دي؟ وليه أصلاً أروح ألف وأعمل الحوارات دي كلها، برضو ما أنا كده كده هروح أنفذ الـ Implementation بتاع كل Subclass من الأساس؟ يعني ليه الخطوات الزيادة دي؟"
هنا بقى الـ Polymorphism! طبعاً أنت دلوقتي بتقولي يعني استفدت إيه من المعلومة دي؟ وفين الـ Polymorphism ده علشان مش شايفه؟ طالما أجبرت كل الـ Child Classes ينفذوا نفس الوظايف الموجودة في الـ Base Class، فأنا أقدر أتحكم في كل الأشكال دي بطريقة موحدة وثابتة، على الرغم من اختلاف الشكل. بحيث كل شكل يستجيب للرسالة أو للأمر على حسب نوعه الفعلي.
يعني لو عملت متغير من نوع Shape في الحالة دي، أقدر أخزن فيه أي Subclass من نفس النوع، زي كده:
Shape sh = new Circle(); sh.Draw(); لو أخدت بالك، المتغير من نوع Shape، بس النوع الفعلي بعد علامة الـ = هو من نوع Circle. والموضوع ده بنقول عليه Upcasting، ممكن تسيّرش عليه. لما أجي أشغل وظيفة الـ Draw، هتعمل إيه بالظبط؟ هتروح ترسم دايرة، صح.
بس لو غيرت محتوى متغير الـ sh من Circle لـ Square، كده:
sh = new Square(); sh.Draw(); في الحالة دي، هيروح يرسم مربع. هنا بقى كل Object بدأ يستجيب لوظيفة الـ Draw على حسب نوعه الفعلي.
ولو عملت مصفوفة من نوع Shape، كده:
Shape[] sh = {new Square(), new Circle(), new Triangle()};❤1
عبدالوهاب العليوي | Abdulwahab Al-Alawi
Photo
لو عملت تكرار (iteration) على الـ Array دي وشغلت وظيفة الـ Draw مع كل Object، بالتالي وظيفة الـ Draw هتطبع في أول مرة مربع، ثم دايرة، ثم مثلث. لو أخدت بالك، ده بالظبط هو الـ Polymorphism.
ليه بقى لازم نضيف Interface فاضي حتى لو من غير Implementation؟ الإجابة بكل بساطة: عشان نعرف نطبق الـ Polymorphism ونعمل توحيد للتعامل مع كل الـ Objects اللي وارثة من الـ Base Class من خلال الـ Sub Class.
#oop #ملخص
ليه بقى لازم نضيف Interface فاضي حتى لو من غير Implementation؟ الإجابة بكل بساطة: عشان نعرف نطبق الـ Polymorphism ونعمل توحيد للتعامل مع كل الـ Objects اللي وارثة من الـ Base Class من خلال الـ Sub Class.
#oop #ملخص
أيها المهندسين والمهندسات المهندس / عبدالله الشهري قدم لنا مجهوداً رائعاً يستحق الإهتمام والشكر.
🔹 الأول: مشروع تعريب كتاب "الأساسيات في علم إختبار البرمجيات" .
🔹 الثاني: مشروع تعريب "معجم المصطلحات في علم إختبار البرمجيات".
ويضعهما بين أيدينا بلغتنا العربية , جاهزين ومتاحين للجميع .
عملانِ استغرقا ما استغرقا من وقتٍ وجهدٍ وإتقان، فكن شريكًا في نفعهما بنشرهما حيث يصل العلم إلى مستحقيه. 🌱.
📘 روابط التحميل على جوجل درايف .
https://drive.google.com/file/d/1HXjpIfgsXoyCnmXSo-T6hJkgxK27uNXH/view?usp=sharing
https://drive.google.com/file/d/1xTuMh792f40sH-TaR77EmZqg4PgG3GXP/view?usp=sharing
#programming #programming_testing
#اختبار_البرمجيات #المختبر_المعتمد #الاختبار #اللغة_العربية #تعريب
🔹 الأول: مشروع تعريب كتاب "الأساسيات في علم إختبار البرمجيات" .
🔹 الثاني: مشروع تعريب "معجم المصطلحات في علم إختبار البرمجيات".
ويضعهما بين أيدينا بلغتنا العربية , جاهزين ومتاحين للجميع .
عملانِ استغرقا ما استغرقا من وقتٍ وجهدٍ وإتقان، فكن شريكًا في نفعهما بنشرهما حيث يصل العلم إلى مستحقيه. 🌱.
📘 روابط التحميل على جوجل درايف .
https://drive.google.com/file/d/1HXjpIfgsXoyCnmXSo-T6hJkgxK27uNXH/view?usp=sharing
https://drive.google.com/file/d/1xTuMh792f40sH-TaR77EmZqg4PgG3GXP/view?usp=sharing
#programming #programming_testing
#اختبار_البرمجيات #المختبر_المعتمد #الاختبار #اللغة_العربية #تعريب
"ثم يُقال : يا مُحمَّد :
ارفعْ رأسكَ، وسَلْ تُعطَ، واشفعْ تُشَفّع
فأرفع رأسي فأقول :
أمّتي يا ربي، أمّتي "
صَلُّوا عليه ﷺ ❤️
ارفعْ رأسكَ، وسَلْ تُعطَ، واشفعْ تُشَفّع
فأرفع رأسي فأقول :
أمّتي يا ربي، أمّتي "
صَلُّوا عليه ﷺ ❤️
❤1
عبدالوهاب العليوي | Abdulwahab Al-Alawi
https://www.facebook.com/share/19t4BWy7yr/
للمهتمين بمجال الذكاء الاصطناعي
❓ Switch على String بدون break بعد "two"؟
Switch on String (no break after "two")?
Switch on String (no break after "two")?
String s = "two";
switch (s) {
case "one": System.out.print(1); break;
case "two": System.out.print(2);
default: System.out.print(0);
}
❓ ما ناتج الكود التالي؟
What is the output of the following code?
What is the output of the following code?
int x = 5;
if (x > 3) x++;
if (x == 6) x += 2;
System.out.println(x);
❤1
صلوا عليه وسلموا تسليمًا
فالنورُ من ذكرِه يتقسّمُ
فالنورُ من ذكرِه يتقسّمُ
❤2
❓ اقتران else بالأقرب
else pairs with nearest if
else pairs with nearest if
int x = 0, y = 10;
if (y > 0)
if (x == 1) System.out.print("A");
else System.out.print("B");
❓ خطأ فهرسة في حلقة
Index error in loop
Index error in loop
int[] a = {1,2,3};
for (int i = 0; i <= a.length; i++) {
System.out.print(a[i]);
}❓ ما ناتج الجمع مع break؟
What is the output with break?
What is the output with break?
int sum = 0;
for (int i = 1; i <= 5; i++) {
if (i == 4) break;
sum += i;
}
System.out.println(sum);
❓ continue مع الأعداد الزوجية
continue with evens
continue with evens
int s = 0;
for (int i = 1; i <= 4; i++) {
if (i % 2 == 1) continue;
s += i;
}
System.out.println(s);