Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ملخص - حاسبة الأشكال

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 27 من 64.

challenge icon

التحدي

متوسط

في هذا التحدي، ستقوم بتنفيذ نظام حاسبة أشكال هندسية يوضح مفهوم تعدد الأشكال (polymorphism).

قم بتنفيذ الفئات المطلوبة في الملفات التالية (ابحث عن تعليقات TODO في كل ملف):

  • shape.py - تعريف الفئة الأساسية المجردة Shape
  • circle.py - تنفيذ فئة Circle
  • rectangle.py - تنفيذ فئة Rectangle
  • triangle.py - تنفيذ فئة Triangle
  • unknownshape.py - إنشاء فئة غير مشتقة توضح مفهوم "duck typing"
  • shapecalculator.py - تنفيذ وظائف الحاسبة

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

ورقة مرجعية

بما أنه لم يتم توفير محتوى للدرس، بل فقط تعليمات التحدي، فلا يمكنني إنشاء ورقة غش (cheatsheet). يجب أن تعتمد أوراق الغش بشكل أساسي على نظرية الدرس ومفاهيمه، مع اعتبار محتوى التحدي مكملاً فقط عندما يحتوي على تفسيرات مفيدة إضافية لم يتم تغطيتها في الدرس.

جرّب بنفسك

from circle import Circle
from rectangle import Rectangle
from triangle import Triangle
from unknownshape import UnknownShape
from shapecalculator import ShapeCalculator
import math

# معالج حالات الاختبار
test_case = input()

def test_basic_functionality():
    calculator = ShapeCalculator()
    
    # اختبار مع الدائرة (Circle)
    circle = Circle(5)
    print(f"Testing {circle}")
    results = calculator.process_shape(circle)
    print(f"Results: {results}")
    print()
    
    # اختبار مع المستطيل (Rectangle)
    rectangle = Rectangle(4, 6)
    print(f"Testing {rectangle}")
    results = calculator.process_shape(rectangle)
    print(f"Results: {results}")
    print()
    
    # اختبار مع المثلث (Triangle)
    triangle = Triangle(3, 4, 5)
    print(f"Testing {triangle}")
    results = calculator.process_shape(triangle)
    print(f"Results: {results}")
    print()
    
    # اختبار مع شكل غير معروف (UnknownShape) (كتابة البطة - duck typing)
    unknown = UnknownShape("Custom", 10)
    print(f"Testing {unknown}")
    results = calculator.process_shape(unknown)
    print(f"Results: {results}")

def test_edge_cases():
    calculator = ShapeCalculator()
    
    # اختبار مع قيم صفرية
    print("Testing zero values:")
    circle = Circle(0)
    print(f"Circle(0) area: {circle.area()}, perimeter: {circle.perimeter()}")
    
    rectangle = Rectangle(0, 5)
    print(f"Rectangle(0, 5) area: {rectangle.area()}, perimeter: {rectangle.perimeter()}")
    
    # اختبار مع قيم كبيرة جداً
    print("\
Testing large values:")
    large_circle = Circle(1000000)
    print(f"Circle(1000000) area: {large_circle.area():.2e}, perimeter: {large_circle.perimeter():.2e}")
    
    # اختبار مع قيم عشرية
    print("\
Testing decimal values:")
    decimal_circle = Circle(0.5)
    print(f"Circle(0.5) area: {decimal_circle.area()}, perimeter: {decimal_circle.perimeter()}")
    
    decimal_triangle = Triangle(2.5, 3.5, 4.5)
    print(f"Triangle(2.5, 3.5, 4.5) area: {decimal_triangle.area()}, perimeter: {decimal_triangle.perimeter()}")

def test_inheritance():
    # إنشاء مثيلات لكل شكل
    circle = Circle(5)
    rectangle = Rectangle(4, 6)
    triangle = Triangle(3, 4, 5)
    unknown = UnknownShape("Custom", 10)
    
    # اختبار علاقات الوراثة
    from shape import Shape
    print(f"Circle is a Shape: {isinstance(circle, Shape)}")
    print(f"Rectangle is a Shape: {isinstance(rectangle, Shape)}")
    print(f"Triangle is a Shape: {isinstance(triangle, Shape)}")
    print(f"UnknownShape is a Shape: {isinstance(unknown, Shape)}")
    
    # اختبار توفر الدوال
    print("\
Method availability:")
    for shape_name, shape_obj in [("Circle", circle), ("Rectangle", rectangle), 
                                ("Triangle", triangle), ("UnknownShape", unknown)]:
        print(f"{shape_name} has area(): {hasattr(shape_obj, 'area')}")
        print(f"{shape_name} has perimeter(): {hasattr(shape_obj, 'perimeter')}")
        print(f"{shape_name} has describe(): {hasattr(shape_obj, 'describe')}")

def test_polymorphism():
    calculator = ShapeCalculator()
    
    # إنشاء قائمة من أشكال مختلفة
    shapes = [
        Circle(5),
        Rectangle(4, 6),
        Triangle(3, 4, 5),
        UnknownShape("Custom", 10)
    ]
    
    print("Testing polymorphic behavior:")
    for i, shape in enumerate(shapes, 1):
        print(f"\
Shape {i}: {shape.__class__.__name__}")
        results = calculator.process_shape(shape)
        print(f"Results: {results}")

def test_duck_typing():
    calculator = ShapeCalculator()
    
    # إنشاء فئة جديدة تماماً تحتوي على الدوال المطلوبة
    class CustomDuckShape:
        def __init__(self, name, factor):
            self.name = name
            self.factor = factor
        
        def area(self):
            return self.factor * 3
        
        def perimeter(self):
            return self.factor * 12
        
        def describe(self):
            return f"This is a {self.name} duck-typed shape with area {self.area()} and perimeter {self.perimeter()}"
        
        def __str__(self):
            return f"Custom {self.name} with factor {self.factor}"
    
    # اختبار مع الشكل المخصص بنظام "كتابة البطة"
    duck_shape = CustomDuckShape("DuckTyped", 5)
    print(f"Testing duck typing with: {duck_shape}")
    results = calculator.process_shape(duck_shape)
    print(f"Results: {results}")
    
    # المقارنة مع شكل عادي
    circle = Circle(5)
    print(f"\
Comparing with regular shape: {circle}")
    results = calculator.process_shape(circle)
    print(f"Results: {results}")

def test_invalid_inputs():
    calculator = ShapeCalculator()
    
    try:
        # اختبار مع نصف قطر سالب
        print("Testing Circle with negative radius:")
        negative_circle = Circle(-5)
        results = calculator.process_shape(negative_circle)
        print(f"Results: {results}")
    except Exception as e:
        print(f"Error with negative circle: {e}")
    
    try:
        # اختبار مع مثلث غير صالح (أضلاع لا يمكنها تكوين مثلث)
        print("\
Testing invalid Triangle (1, 1, 10):")
        invalid_triangle = Triangle(1, 1, 10)  # ينتهك متباينة المثلث
        results = calculator.process_shape(invalid_triangle)
        print(f"Results: {results}")
        # التحقق مما إذا كان حساب المساحة يعطي نتيجة صالحة
        area = invalid_triangle.area()
        if math.isnan(area) or not isinstance(area, float) or area <= 0:
            print(f"Invalid triangle area: {area}")
    except Exception as e:
        print(f"Error with invalid triangle: {e}")

# تشغيل الاختبار المناسب بناءً على المدخلات
if test_case == "basic_functionality":
    test_basic_functionality()
elif test_case == "edge_cases":
    test_edge_cases()
elif test_case == "inheritance":
    test_inheritance()
elif test_case == "polymorphism":
    test_polymorphism()
elif test_case == "duck_typing":
    test_duck_typing()
elif test_case == "invalid_inputs":
    test_invalid_inputs()
else:
    # حالة الاختبار الافتراضية
    test_basic_functionality()

جميع دروس Object Oriented Programming