Treci la conținutul principal

Interfețe mici

Principiul segregării interfețelor spune: nicio clasă nu trebuie să fie obligată să implementeze metode de care nu are nevoie. În loc de o interfață mare, cu multe metode, creează mai multe interfețe mici — fiecare clasă implementează doar ceea ce este adevărat pentru ea.

În Python, o interfață se scrie ca o clasă protocol, iar protocoalele mici sunt foarte naturale aici: limbajul însuși funcționează pe baza unora minuscule — orice obiect cu o metodă __next__() funcționează cu funcția încorporată next(), iar o mare parte din biblioteca standard se bazează pe promisiuni la fel de mici.


Interfața mare

Un protocol Worker cu work() și eat() pare inofensiv — până când un robot aplică pentru post. Robotul lucrează bine, dar trebuie să implementeze și eat(), cu... ceva. Răspunsurile absurde de acest fel sunt semnul unei interfețe mari.

Robotul obligat să mănânce

Robotul implementează eat() doar pentru că protocolul o cere. Pauza de prânz afișează un răspuns care n-ar trebui să existe — clasa a fost obligată să mintă.

Prompt
Scrie un program Python care arată o încălcare a Principiului segregării interfețelor: un protocol mare Worker cu metodele work și eat, o clasă Human care le face pe amândouă și o clasă Robot obligată să implementeze eat cu un răspuns absurd. Rulează o tură de lucru și o pauză de prânz pentru amândoi, ca să arăți minciuna forțată a robotului.
Ieșire: program Python complet

Împarte interfața

Împarte protocolul mare în Worker și Eater. Omul le implementează pe amândouă; robotul implementează doar Worker. Tura de lucru primește lucrători, pauza de prânz primește mâncători — robotul pur și simplu nu este invitat niciodată la prânz și nicio metodă nu minte.

Fiecare clasă implementează doar adevărul ei

Două protocoale mici în loc de unul mare. Robotul nu mai are deloc metoda eat() — iar un verificator de tipuri (de exemplu, mypy) îl ține departe de pauza de prânz.

Prompt
Repară interfața mare în Python împărțind-o: un protocol Worker cu work și un protocol Eater cu eat. Human le implementează pe amândouă, Robot doar Worker. Rulează tura de lucru cu amândoi și pauza de prânz doar cu cei care mănâncă.
Ieșire: program Python complet
Each class implements only its truth

Piesele mici se combină

Protocoalele mici nu sunt o limitare — ele se combină. Când o funcție chiar are nevoie de ambele abilități, le combină pe loc într-un singur protocol: Worker plus Eater.

Așa cresc promisiunile mici: definește protocoale cu o singură metodă și lasă-l pe cel care are nevoie de mai mult să le unească.

Combină atunci când ai nevoie de ambele

WorkingEater este construit din cele două protocoale mici. Tura de o zi întreagă are nevoie de ambele abilități, deci doar omul se califică — spus o singură dată, în sistemul de tipuri.

Prompt
Arată compunerea protocoalelor în Python: combină protocoalele mici Worker și Eater într-un protocol WorkingEater și scrie o funcție full_day care îl cere, astfel încât doar Human să se califice. Afișează ziua întreagă a omului.
Ieșire: program Python complet