Siniflər yazmağı bilmək hələ yaxşı proqram qurmaq demək deyil. Bu mövzu OOP-dan dizayna körpüdür: sinfin nə etməli olduğunu və başqa siniflərdən nə qədər asılı olmalı olduğunu müəyyən edirik.

Dörd prinsip qısaca

  • İnkapsulyasiya: vəziyyət gizlədilir və metodlarla dəyişir (xassələr).
  • Varislik: alt sinif ana sinfin davranışını götürür (varislik və super).
  • Polimorfizm: eyni çağırış fərqli obyektlərdə fərqli işləyir (siniflər və obyektlər).
  • Abstraksiya: nə etdiyini göstəririk, necə etdiyini yox (ABC).
python
from abc import ABC, abstractmethod

class Shape(ABC):                        # abstraction: what, not how
    @abstractmethod
    def area(self): ...

class Square(Shape):                     # inheritance
    def __init__(self, side):
        self._side = side                # encapsulation: hidden state

    def area(self):
        return self._side ** 2

class Circle(Shape):
    def __init__(self, r):
        self._r = r

    def area(self):
        return round(3.14159 * self._r ** 2, 2)

for shape in (Square(3), Circle(1)):     # polymorphism: one call, many behaviours
    print(type(shape).__name__, shape.area())
text
Square 9
Circle 3.14

Bu prinsiplər alətdir. Dizayn isə onları nə vaxt və necə tətbiq etməyi seçməkdir. Ən çox işlədilən üç sual: sinif nə üçündür? kimdən asılıdır? onu dəyişəndə nə sınacaq?

Dizaynın məqsədi

Proqram bir dəfə yazılır, amma dəfələrlə dəyişir. Yaxşı dizayn dəyişikliyi ucuz edir. Bunu iki ölçü göstərir: əlaqəlilik (cohesion) — sinfin hissələri bir-birinə nə qədər aiddir (hədəf: yüksək) və bağlılıq (coupling) — siniflərin bir-birindən asılılığı (hədəf: aşağı).