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).
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())Square 9
Circle 3.14Bu 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ğı).