Salam dostlar, bir müddətlik aradan sonra yeni bloq yazımla qarşınızdayam. Bu bloq yazısı Səliqəli, başa düşülən və idarə oluna bilən kod yazmaq seriyasının ilk yazısıdır və Robert C. Martin (uncle Bob) - nin Clean Code kitabından özüm üçün nəticə çıxardığım məqamlara əsaslanır
Düzgün Adlandırma
Biz hər hansı proqram yazarkən adlandırmadan proqramın hər hissəsində istifadə edirik. Dəyişənlərimizi, funksiyalarımızı, arqumentlərimizi, klaslarımızı, fayl adlarını, dll-lərimizi və s. adlandırırıq. Bu o deməkdir ki, adlandırmadan bu qədər çox istifadə ediriksə, deməli bunu daha yaxşı şəkildə etməliyik və yaxşı adlandırma üçün bəzi qaydalara əməl etməliyik.
Niyyəti açıqlayan adlandırma
Adlandırma zamanı həmişə çalışmalıyıq ki elə adlar seçək ki, bu adlar özü-özlüyündə niyyəti və qarşıya qoyulmuş məqsədi açıqlamış olsun. Düzdür bu tipli adların seçilməsi əvvəldə daha çox vaxt alsa da, sonrakı gedişatda bu bizə daha çox vaxt qazandırmış olacaq. Dəyişənin, funksiyanın və ya klasın adı özü özlüyündə bir çox suallara cavab verə bilməlidir. Əgər ad hər hansı əlavə şərhə ehtiyac duyursa bu odeməkdir ki, ad düzgün seçilməyib:
Məsələn:
int d; //days since creation
Burada d dəyişəni özü-özlüyündə heçnə ifadə etmir. Bunun əvəzinə biz bunu
int daysSinceCreation;
şəkilində elan etsək, dəmək olar bütün suallarımıza cavab tapmış olacağıq.
Aşağıdakı kodun mənası nədir ?
public List<int[]> GetThem()
{
var list1 = new List<int[]>();
foreach (var l in theList)
if(l[0] == 4)
list1.Add(l);
return list1;
}
Bu kod əslində çox sadə koddur, kompleks deyil, xüsusi heçnə istifadə olunmayıb. Sadəcə bir neçə dəyişən və operatorlardan ibarət sadə metoddur. Lakin biz bu 5 sətrlik kodu başa düşmək üçün ilk növbədə aşağıdakı suallara cavab tapmalıyıq
- theList array-də hansı tipli elementlər var
- if şərtindəki 4-ə bərabər olmanı yoxlamaq hansı mənaya gəlir ?
- theList arrayında 0-cı elementin önəmi nədir ?
- Geri döndərilən list1 nə üçün istifadə olunur
Bu suaalların cavabı kodun özündə deyil, amma bu əslində belə olmalı idi. Gəlin bu kodu aşağıdakı şəkildə dəyişək:
public List<int[]> GetFlaggedCells()
{
var flaggedCells = new List<int[]>();
foreach (var cell in gameBoard)
if(cell[STATUS_VALUE] == CellStatus.FLAGGED)
flaggedCells.Add(cell);
return flaggedCells;
}
Artıq bu metod öz-özlüyündə nə baş verdiyini izah edə bilir. Bu sadəcə bəsit bir misaldır. Bu tip şeyləri hər yerə tətbiq etməliyik, xüsusi bir durum olmadığı təqdirdə adlandırma bizə hər bir şeyi aydınlada bilməlidir
Yanlış informasiya verən adlandırmadan çəkinmək
Adlandırma zamanı diqqət etmək lazımdır ki, qoyduğumuz adlar əlavə qarışıqlıqlar yaratmasınlar. Məsələn əgər biz bir dəyişənə accountList adını qoymuşuqsa gözədiyimiz odur ki, bu dəyişən List şəkilində account-ları saxlayacaq. Əgər bu qeyd olunan şəkildə olmasa əlavə qarışıqlığa gətirə bilər. Bunun əvəzində bu tip dəyişənlərə məsələn accounts, accountGroup və s. adlandırma etmək daha məqsədə uyğun olar. Əlavə olaraq adlandırmada qarışıqlığa səbəb olacaq simvollardan yayınmaq lazımdır. Məsələn kiçik l hərfi və böyük O hərfi bir çox zaman 1 və 0 rəqəmləri ilə diqqət etmədikcə qarışdırıla bilir.
Oxşar şeyləri fəqləndirmək üçün daha düzgün yol izləmək
Bəzən proqramçılar eyni skopda yerləşən fərqli şeylərə eyni adlandırmanı tətbiq edə bilmədiklərindən, adlandırmanın birini müxtəlif şəkildə dəyişirlər. Məsələn dəyişənlərin (a1, a2, a3 .. aN) şəkilində adlandırılması buna misal ola bilər.
public static void CopyChars(char[] a1, char[] a2)
{
for (int i = 0; i < a1.Length; i++)
{
a2[i] = a1[i];
}
}
Bu kod parçası uyğun arqument adları source və destination olsaydı daha yaxşı başa düşülərdi.
Bundan əlavə məsələn Product, ProductInfo, ProductData kimi fərqləndirmələr qarışıqlığa gətirib çıxara bilər. İşin gedişində hər hansı proqramçı bu klaslardan istifadə etmək istəsə klasın içərisinə və gördüyü işə baxmadan hansı klası istifadə edəcəyini bilməyəcək.
Düzgün tələffüz edilə bilən və məna kəsb edən adlar qoymaq
Adlandırma edərkən həm də diqqət etmək lazımdır ki qoyulan adlar tələffüz edilə bilən və məna kəsb edən adlar olsun.
public class DtaRcrd102
{
private DateTime genymdhms;
private DateTime modymdhs;
public string pzsint = "102";
}
Məsələn əgər bu kod parçası haqqında kimə nəsə izah etməyə çalışsanız özünüz dəyişən adlarına əsasən çətliyi görəcəksiniz :)
public class Customer
{
private DateTime generationTimestamp;
private DateTime modificationTimestamp;
public string recordId = "102";
}
Amma bu kod blokunu yuxarıdakı şəkildə yazsaq, siz başqa bir developerə burda olan hər hansı bir məsləni və ya problemi rahatıqla izah edə bilərsiniz. Çünki bütün adlandırmalar rahat tələffüz oluna bilir və məna kəsb edəndir.
Klasların adlandırılması
Klaslar və obyektlər isim və ya isimlərdən ibarət bitişik sözlərdən istifadə olunmaqla adlandırılmaldır, məsələn Customer, WikiPage, Account və s. Klas adlarının sonunda Data, Info və s. bu tipli sözlərdən yayınmaq daha məqsədə uyğundur. Klas adlarının fel olmasından çəkinmək lazımdır.
Metodların adlandırılması
Metodlar fel və feli birləşmələrdən stifadə olunmaqla adlandırılmalıdır. Məsələn saveAccount, deletePage və s. Metodlarda gördüyü işə uyğun olaraq get, set və is prefixlərindən istifadə edilə bilər.
Hər konsept üçün eyni addan istifadə e tmək
Burada məqsəd odur ki, eyni tip əməliyyatları icra edən metodlar eyni adlandırma standartlarına malik olmalıdır. Məsələn, get, fetch, retrive prefixlərini, add, insert, append metod adlarını fərqli yerlərdəeyni tip metodlar üçün istifadə etmək qarışıqlığa səbəb ola bilər. bu tip qarışıqlıqlar olmasın deyə, bir proqramda yalnız eyni tip adlandırma tətbiq olunmalıdır
Həll və problem əsaslı adlandırmadan istifadə etmək
Proqramı yazan proqramçı olduğu kimi oxuyanlar da proqramçılardır. Ona görə hər hansı patternlərdən, data strukturlardan istifadə edən zaman adlandırmada bunlardan istifadə etmək olar. Məsələn, AccountVisitor klasına baxan proqramçı bunun VISITOR patternin implementasiyası olduğunu başa düşür. Və ya əgər siz bir klasa JobQueue adını vermisinizsə bunu heç bir proqramçı başqa cür başa düşməyəcəkdir
Adlandırmada lazımsız şeylərdən yayınmaq
Bəzən adlandırmada lazımsız prefixlər istifadə olunur. Məsələn əgər proqramımızın adı Sale Management Portal-dırsa bu zaman adlandırmada əlavə olaraq SMP prefixindən istifadə etmək qarışıqlığa səbəb olur və kodun oxunaqlığını azaldır.