SOLID prinsipləri, SOLİD nədir? Proqramçı, müsahibəyə hazırlıq

Demək olar ki həmişə OYP-dan (Obyekt Yönümlü Proqramlaşdırma) istifadə edən proqramçı müsahibələrində nəinki OYP haqqında, həmçinin SOLID prinsipləri haqqında soruşurlar. Bu prinsipləri keyfiyyətli kod yazmaq üçün bilmək çox vacibdir. Ona görə bu məqalədə sizlərə SOLİD prinsiplərini asan formada izah etməyə çalışacam.

Obyekt Yönümlü Proqramlaşdırma proqramçılara imkan yaradıb ki, onlar bir birinə oxşar mahiyyətləri (entity) bir birinə bağlaya bilsinlər. Amma OYP-nin istifadəsi keyfiyyətli kod bazasını təmin etmir.

Qarışıq, aydın olmayan və çətin saxlanılan kod hətta OYP ilə də yazıla bilər.

Keyfiyyətli proqramlar haqqında yazan məşhur kitab müəllifi Robert Martin (uncle Bob) 5 əsas OYP prinsipini yaratmışdı. Bu prinsiplər SOLID kimi adlandırılıblar.

S – Single Responsibility Principle
O – Open-Closed Principle
L – Liskov Substitution Principle
I – Interface Segregation Principle
D – Dependency Inversion Principle

İlk baxışdan bütün bu sözlər çətin və qarışıq görünür, amma əslində belə deyil.

Keyfiyyətli, yaxşı kod nədir?

Mənim fikirimcə, bir çox kod bazasının hissəsini asanlıqla dəyişib başqa tərəfini sındırmamısınızsa, deməli kodunuz keyfiyyətlidir.
Koda yeni funksionallığın əlavə etmə sürəti illər boyu eynidirsə, deməli kodunuz çox yaxşı yazılıb.
Kodun yaxşı qalması üçün, proqram modulların arasındaki qoşulmaları minimuma azaltmalıyıq.

Gəlin SOLID prinsiplərinə bir bir baxaq:

Single Responsibility Principle

Klass yalnız bir tapşırıqa məsuliyyət daşımalıdır. Əgər bir klass bir neçə bir birinə aid olmayan tapşırıqları yerinə yetirərsə, onu varis (inherit) edən klasslar bir birinə bərk bağlanacaqlar.
Və bu varis olunan klasslardan birində dəyişiklik etdikdə başqalarında da etməli olacayıq. Bu isə o deməkdir ki, kodun keyfiyyəti pisləşdi.
Bu məqalədə bütün məsələlər abstrakt olacaq, kodsuz.

Gəlin bir misala baxaq:

Bizim Computer adlı klassımız var, hansi ki öz daxilində bir neçə funksiya (method) saxlayir

Single Responsibility Principle

Bu klass nəticədə çox böyük klassa böyüyə bilər, hansı ki öz daxilində çox saylı müxtəlif metodlar saxlayacaq. Başqa sözlə, biz Single Responsiblity prinsipini kobud şəkildə pozmuş oluruq.

Bu problemi necə həll edə bilərik?

Biz Computer klassını bir neçə klassa bölə bilərik:

SOLID prinsipləri, Single Responsibility Principle

Beləliklə, hər klassın ayrı məsuliyyəti var, və funksiyaları rahat, heçnə sındırmadan dəyişmək olar.

Open-Closed Principle

  • Klass genişlənmə üçün açıq, dəyişdirilmə üçün bağlı olmalıdır;
  • Bu prinsip proqram komponentlərinin yenidən istifadə edilməsini təmin edir;
  • Klassların məsuliyyətini ayıranda, siz onu o cür etməlisiniz ki, klassın davranışı (funksionallığı) genişləndirilə bilsin.

Misal üçün, varislik (inheritance) yaradaq:

SOLİD prinsipləri

Hər Computer klassın alt klassında biz xüsusi, özünə məhsus metodları yaza bilərik.

Liskov Substitution Principle

Barbara Liskov prinsipini misalla başa salmağa çalışacam

Liskov Substitution principle

Gördüyünüz kimi, Pinqvin və Ördək klassların hər ikisi Quş (Bird) interface-indən varis olunurlar və hər ikisi o interface-in Fly funksiyasını icra edirlər.

Amma pinqvinlər uçmağı bacarmır, ona görə, şablonu (interface-i) planlayaraq, biz Barbara Liskov prinsipini pozmuş olduğ.

Növbəti prinsipdə mən bu problemin necə həll olunması haqqında deyəcəm.

Interface Segregation Principle

Çoxlu spesifik, xüsusi interface saxlamaq, çox az saylı və ümumləşdirici interface-lardan yaxşıdır.
Bu prinsip hətta klassın məsuliyyətini Barbara Liskov prinsipini pozmadan bölə bilir.
Gəlin misala baxaq:

İndi isə, biz bilirik ki, quşlar iki kateqoriyaya bölünür, – uçan və uçmayan quş növlərinə.
Və bu növləri yaradaraq, Bird interface-ından varis edirik, daha sonra isə, pinqvin və ördəyi də onlardan varis edirik.

Dependency Inversion Principle

  • Abstraksiyalar xırdalıqlardan asılı olmamalıdırlar, – əksinə, xırdalıqlar abstraksiyalardan asılı olmalıdırlar

Prinsipin əsas məqsədi – proqram komponentlərin arasında olan qoşulmaların minimuma qədər azadılmasıdır.

Hər yerdə, bir klass obirsi klassdan istifadə edirsə, bu qoşulmanı interface sayəsində edin, birbaşa yox.

Bu prinsipin tədbiqi proqramınızdaki tənzimləmələrinin sayını azaldacaq.