Menu
Coddy logo textTech

Özet - Şekil Hesaplayıcı

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 27 / 64.

challenge icon

Görev

Orta

Bu meydan okumada, polimorfizmi gösteren bir şekil hesaplayıcı sistemi uygulayacaksınız.

Gerekli sınıfları aşağıdaki dosyalarda uygulayın (her dosyadaki TODO yorumlarına bakın):

  • shape.py - Soyut Shape temel sınıfını tanımlayın
  • circle.py - Circle sınıfını uygulayın
  • rectangle.py - Rectangle sınıfını uygulayın
  • triangle.py - Triangle sınıfını uygulayın
  • unknownshape.py - Duck typing'i gösteren türetilmemiş bir sınıf oluşturun
  • shapecalculator.py - Hesaplayıcı işlevselliğini uygulayın

Adım adım rehberlik için her dosyadaki TODO yorumlarını takip edin. Kapsamlı test paketi, beklenen davranışı anlamanıza ve uygulamanızın tüm gereksinimleri doğru şekilde karşıladığından emin olmanıza yardımcı olacaktır.

Kopya kağıdı

Ders içeriği sağlanmadığı, yalnızca görev talimatları verildiği için bir özet sayfa (cheatsheet) oluşturamıyorum. Özet sayfalar öncelikle ders teorisine ve kavramlarına dayanmalıdır; görev içeriği ise yalnızca derste kapsanmayan ek yararlı açıklamalar içerdiğinde tamamlayıcı olmalıdır.

Kendin dene

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

# Test durumu işleyicisi
test_case = input()

def test_basic_functionality():
    calculator = ShapeCalculator()
    
    # Circle (Daire) ile test et
    circle = Circle(5)
    print(f"Testing {circle}")
    results = calculator.process_shape(circle)
    print(f"Results: {results}")
    print()
    
    # Rectangle (Dikdörtgen) ile test et
    rectangle = Rectangle(4, 6)
    print(f"Testing {rectangle}")
    results = calculator.process_shape(rectangle)
    print(f"Results: {results}")
    print()
    
    # Triangle (Üçgen) ile test et
    triangle = Triangle(3, 4, 5)
    print(f"Testing {triangle}")
    results = calculator.process_shape(triangle)
    print(f"Results: {results}")
    print()
    
    # UnknownShape (Bilinmeyen Şekil - duck typing) ile test et
    unknown = UnknownShape("Custom", 10)
    print(f"Testing {unknown}")
    results = calculator.process_shape(unknown)
    print(f"Results: {results}")

def test_edge_cases():
    calculator = ShapeCalculator()
    
    # Sıfır değerleri ile test et
    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()}")
    
    # Çok büyük değerler ile test et
    print("\
Testing large values:")
    large_circle = Circle(1000000)
    print(f"Circle(1000000) area: {large_circle.area():.2e}, perimeter: {large_circle.perimeter():.2e}")
    
    # Ondalık değerler ile test et
    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():
    # Her şekilden örnekler oluştur
    circle = Circle(5)
    rectangle = Rectangle(4, 6)
    triangle = Triangle(3, 4, 5)
    unknown = UnknownShape("Custom", 10)
    
    # Kalıtım ilişkilerini test et
    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)}")
    
    # Metot kullanılabilirliğini test et
    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()
    
    # Farklı şekillerden oluşan bir liste oluştur
    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()
    
    # Gerekli metotlara sahip tamamen yeni bir sınıf oluştur
    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}"
    
    # Özel duck-typed şekil ile test et
    duck_shape = CustomDuckShape("DuckTyped", 5)
    print(f"Testing duck typing with: {duck_shape}")
    results = calculator.process_shape(duck_shape)
    print(f"Results: {results}")
    
    # Normal bir şekil ile karşılaştır
    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:
        # Negatif yarıçap ile test et
        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:
        # Geçersiz üçgen ile test et (üçgen oluşturamayan kenarlar)
        print("\
Testing invalid Triangle (1, 1, 10):")
        invalid_triangle = Triangle(1, 1, 10)  # Üçgen eşitsizliğini ihlal eder
        results = calculator.process_shape(invalid_triangle)
        print(f"Results: {results}")
        # Alan hesaplamasının geçerli bir sonuç verip vermediğini kontrol et
        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}")

# Girişe göre uygun testi çalıştır
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:
    # Varsayılan test durumu
    test_basic_functionality()

Object Oriented Programming bölümündeki tüm dersler