1.1 Obyektlər və siniflər
Bu gün siz JavaScript-də tipik bir proqramın necə qurulduğunu öyrənəcəksiniz. Və əsas xəbər budur: hər bir JavaScript proqramı siniflərdən və obyektlərdən ibarətdir. JavaScript — obyekt yönümlü bir dildir və burada hər şey obyektdir: rəqəmlər, sətirlər, funksiyalar və hətta siniflər.
Bəs siniflər nədir?
Analogiyadan başlayım. Təsəvvür edin ki, kiçik bir gəmi qurmaq istəyirsiniz. Əvvəlcə cizgi çəkmək lazımdır, sonra zavoda verin, orada bu cizgi əsasında gəmi yığacaqlar. Və ya onlarla. Hətta istənilən qədər gəmi. Bir cizgi əsasında onlarla eyni gəmi qurulur, bu, vacib məqamdır.
JavaScript-də proqramlaşdırmada hər şey eyni şəkildə olur.
Cizgilər
Proqramçı — həm də bir layihəçidir. Lakin layihəçi cizgilər çəkir, JavaScript-proqramçı isə siniflər yazır. Sonra cizgilər əsasında detallar yaradılır, və siniflər əsasında isə obyektlər.

Əvvəlcə biz siniflər yazırıq (cizgiləri hazırlayırıq), sonra proqramın icrası zamanı bu siniflər əsasında JavaScript obyektləri yaradır. Eynilə gəmi cizgilər əsasında yarandığı kimi.
Cizgi bir ədəddir, amma gəmi çox ola bilər. Gəmilər fərqlidir, onların fərqli adları var, müxtəlif yüklər daşıyırlar. Amma onlar çox oxşayırlar: hamısı eyni quruluşlu gəmilərdir və oxşar tapşırıqları yerinə yetirə bilirlər.
Və ya başqa bir analogiya...
Qarışqa yuvası
Qarışqa yuvası — obyektlərin qarşılıqlı təsirini göstərən yaxşı bir nümunədir. Ən sadə qarışqa yuvasında üç sinif qarışqa var: kraliça, döyüşçülər və işçi qarışqalar.
Hər bir sinifdən olan qarışqaların sayı fərqlidir. Kraliça — bütün yuvada yalnız bir nəfərdir, döyüşçülər — onlarla, işçi qarışqalar isə — yüzlərlə. Üç sinif və yüzlərlə obyekt. Qarışqalar bir-biri ilə, eyni sinifdən olan qarışqalar və digər siniflərin qarışqalar ilə qarşılıqlı təsir edirlər.
Bu sadəcə mükəmməl bir nümunədir. Tipik bir proqramda hər şey eyni şəkildə olur. Əsas bir obyekt var ki, bütün qalan siniflərin obyektlərini yaradır. Obyektlər bir-biri ilə və proqramın "xarici dünyası" ilə qarşılıqlı əlaqəyə başlayır. Bu obyektlərin daxilində onların davranışları dəqiq proqramlaşdırılıb.
Bu iki izahat — bir medalın iki tərəfidir. Həqiqət ortadadır. İlk nümunə (cizgi və gəmi haqqında) sinif ilə onun obyektləri arasındakı əlaqəni göstərir. Analogiya çox güclüdür. İkinci nümunə (qarışqa yuvası haqqında) proqramın işləmə vaxtında mövcud olan obyektlər ilə yazılmış siniflər arasındakı əlaqəni göstərir.
Əvvəlcə siz proqramdakı bütün obyektlər üçün siniflər yazmalısınız, sonra isə onların qarşılıqlı təsirini təsvir etməlisiniz. Bu, mürəkkəb görünür amma əslində daha asandır.
JavaScript-də proqramın işləmə zamanı bütün varlıqlar obyektlərdir və proqram yazmaq müxtəlif obyektlər arasındakı qarşılıqlı təsiri təsvir etməklə bağlıdır. Obyektlər sadəcə bir-birlərinin metodlarını çağırırlar və lazım olan məlumatları onlara ötürürlər.
Dokumentasiya
Bəs metodlara hansı məlumatları ötürmək lazımdır? Bunu artıq sizdən əvvəl kəşf ediblər.
Adətən hər bir sinifin təsviri olur, orada onun nə üçün yaradıldığı göstərilir. Həmçinin adətən hər bir public metodun təsviri olur: onun nə etdiyini və hansı məlumatların ona ötürülməli olduğunu.
Sinifi istifadə etmək üçün onun nə etdiyini ümumi şəkildə bilmək lazımdır. Həmçinin onun hər bir metodunun nə etdiyini dəqiq bilmək lazımdır. Onun bunu necə etdiyi heç də vacib deyil. Belə bir sehirli çubuq kimi bir şey.
Gəlin koda baxaq — faylın kopyalanması:
const fs = require('fs');
// Faylları aç
const src = fs.createReadStream('source.txt');
const dst = fs.createWriteStream('destination.txt');
// source.txt-in məzmununu destination.txt-ə kopyala
src.pipe(dst);
// Kopyalama bitəndən sonra faylları bağla
src.on('end', () => {
src.close();
dst.close();
});
Əgər bu kodu xətt-xətt oxusaq, onun ümumi olaraq nə etdiyini təxmin etmək olar. Amma bunun üçün təcrübə və praktika lazımdır. Belə ki, bir müddət sonra, bu kod sizə tanış və başa düşülən görünəcək.
1.2. Proqramın layihələndirilməsi
Proqramın layihələndirilməsi — tam bir sənətdir. Həm asandır, həm də çətindir eyni anda. Asandır, çünki heç bir sərt qanun yoxdur: qadağan edilməyən hər şey icazəlidir. Amma çətindir də elə bu səbəbdən: çoxlu yollar var nəyisə etmək üçün və ən yaxşısını tapmaq asan deyil.
Proqramı layihələndirmək — kitab yazmağa bənzəyir. Bir tərəfdən sadəcə hərflər, sözlər, cümlələr yazırsınız. Amma digər tərəfdən süjet, qəhrəmanların xarakterləri, daxili ziddiyyətlər, konfliktlər, üslub, intriqa və s. vacibdir.
Əsas olan — kodu kimin üçün yazdığınızı anlamaqdır. Və kodu siz digər proqramçılar üçün yazırsınız.
Hər hansı məhsulun inkişafı dəyişikliklər etməkdən ibarətdir: burada əlavə etdiniz, orada sildiniz, başqa bir yerdə yenidən düzəltdiniz. Beləcə kiçik iterasiyalar ilə böyük, nəhəng və iri layihələr yaranır.
Kod üçün əsas tələb — o, digər proqramçılar üçün anlaşılan olmalıdır. Səhv, amma anlaşılan kod düzəldilə bilər. Doğru, amma anlaşılmayan kodu isə inkişaf etdirmək olmur. O, sadəcə atılır.
Bəs necə yaxşı və anlaşılan kod yazmaq olar?
Bunun üçün üç şey etmək lazımdır:
- Metodlar daxilində yaxşı və anlaşılan kod yazmaq — ən sadəsi
- Proqramda hansı obyektlərin olacağını müəyyən etmək
- Proqramı məntiqi hissələrə düzgün bölmək
Bəs bu anlayışların arxasında nə dayanır?
Metod daxilində yaxşı kod yazmaq
Əgər sizdə azacıq ingilis dili biliyi varsa, bəlkə də diqqət etmisiniz ki, bəzən kod necə asan oxunur — ingilis dilindəki cümlələr kimi:
class Cat extends Pet
— Cat sinfi Pet sinfini genişləndirirwhile (stream)
— stream boş deyil, belə olduğu müddətdə...a < b ? a : b
— əgəra
daha kiçikdirsəb
-dən,a
-nı qaytar, əks haldab
-ni qaytar
Bu məqsədli şəkildə belə hazırlanıb. JavaScript — o proqramlaşdırma dillərindən biridir ki, burada öz-özünü sənədləşdirən kod yazmaq asandır: şərhlər olmadan da başa düşülən kod. JavaScript-də yaxşı kod belədir ki, bir çox metodlar sadəcə olaraq ingilis dilindəki cümlələr kimi oxunur.
Kod yazarkən sizin məqsədiniz də onu maksimum sadə və yığcam etmək olacaq. Sadəcə düşünün ki, sizin kodu oxumaq nə qədər asan olacaq və siz doğru istiqamətdə irəliləməyə başlayacaqsınız.
JavaScript-də rahat oxunan kod yazmağı qəbul ediblər. Mümkünsə, hər bir metod bütövlükdə ekrana sığmalıdır (metod uzunluğu — 20-30 sətr). Bu, JavaScript icması üçün normadır. Əgər kodu təkmilləşdirmək mümkündürsə, onu təkmilləşdirmək lazımdır.
Yaxşı kod yazmağı öyrənmək üçün ən yaxşı yol — müntəzəm təcrübədir. Çox kod yazın, başqalarının kodunu öyrənin, daha təcrübəli həmkarlarınızdan kodunuza nəzər salmağı xahiş edin. Unutmayın ki, "belə də olar" dediyiniz anda inkişafınız dayanır.
Proqramda hansı obyektlərin olacağını müəyyən etmək
Sizin kodunuz, digər proqramçılar üçün anlaşılan bir kod olmalıdır. Əgər proqram layihələndirərkən 10 proqramçıdan 9-u siniflər A, B və C yaradırsa, siz də proqramınızda həmin sinifləri yaratmalısınız. Siz, başqalarına anlaşılan kod yazmalısınız.
Mükəmməl, işləyən, sürətli, qeyri-adi kod — pis koddur.
Siz, başqalarının layihələrini öyrənməlisiniz: onillər ərzində İT sənayesində yığılmış bütün bilikləri mənimsəmək üçün bu ən yaxşı, ən sürətli və ən asan yoldur.
Və əslində artıq sizin əlinizin altında gözəl, məşhur, yaxşı sənədləşdirilmiş bir layihə var — React. Onunla başlayın.
Sinifləri və sinif strukturlarını incələyin. O fikirləşin ki, niyə bəzi metodlar statikdir, digərləri isə deyil. Niyə metodlarda məhz bu parametrlərdir, digər yox. Niyə məhz bu metodlar, niyə siniflər belə adlanır və belə paketlərdə yerləşir.
Bütün bu suallara cavabları anlamağa başladığınızda, digərlərinin başa düşəcəyi kodu yaza biləcəksiniz.
Amma sizi xəbərdar etmək istəyirəm ki, D3.js metodlarındakı kodu təhlil etməyin. Bir çox metodların kodu sürəti maksimum artırmaq məqsədilə yenidən yazılıb — onun oxunaqlılığı şübhə altındadır.
Proqramı məntiqi hissələrə düzgün bölmək
Hər hansı bir proqram adətən hissələrə və ya modullara bölünür. Hər bir hissə proqramın öz aspektinə cavabdehdir.
Məsələn, kompüterin sistem bloku, monitoru, klaviaturası bir-birindən ayrı, bir-birindən az asılı hissələrdir. Üstəlik, onların qarşılıqlı əlaqəsi standartlaşdırılıb: USB, HDMI və s. Məsələn, klaviaturaya qəhvə töksəniz, sadəcə onu kranın altında yuyub qurudub yenidən istifadə edə bilərsiniz.
Amma noutbuk — monolit arxitektura nümunəsidir: məntiqi hissələr guya var, amma daha inteqrasiya olunmuş şəkildədir. Macbook Pro noutbukunun klaviaturasını təmizləmək üçün onun yarısını sökmək lazımdır. Noutbukun üstünə qəhvə tökmək isə — yenisini sifariş etmək üçün səbəbdir. Amma qəhvəsiz.
1.3 Öz siniflərinizi yaratmaq
Siz proqramlaşdırma öyrənməyə yenicə başlamısınız, buna görə kiçikdən başlamaq lazımdır — öz siniflərinizi yaratmağı öyrənmək.
Təbii ki, siz onları artıq yaratmısınız, amma indi öyrənməlisiniz ki, hansı siniflər proqramda olmalıdır, onların adları nə olmalıdır, hansı metodlara sahib olmalıdırlar. Həmçinin, onların bir-biri ilə necə qarşılıqlı əlaqədə olmalarını öyrənin.
Subyektlərin siyahısı
Nədən başlayacağınızı bilmirsinizsə, əvvəldən başlayın.
Proqramın dizaynına yeni başladığınızda sadəcə bir kağıza proqramda olmalı olan subyektlərin (obyektlərin) siyahısını çıxarın. Daha sonra onları belə proqramlaşdırın: hər subyekt - ayrıca bir sinif.
Nümunə
Tutaq ki, şahmat oynamaq üçün bir oyun yazmaq istəyirsiniz. Sizə bu kimi subyektlər lazım olacaq: şahmat taxtası və 6 növ fiqur. Fiqurlar fərqli hərəkət edir, dəyərləri fərqlidir — buna görə də onlar ayrı-ayrı siniflərdir. Ümumilikdə, başlanğıcda nə qədər çox sinif varsa — o qədər yaxşıdır.
İki sinif əvəzinə on sinif yazan bir başlanğıc proqramçı tapmaq çox nadir hallarda olur. Amma on sinif əvəzinə iki, hətta bir yazmaq — bu, başlayanlar arasında daha çox populyardır. Ona görə daha çox siniflər yazın, proqramçılar. Kodunuz hamı üçün daha aydın olacaq, bəlkə sizin özünüz üçün yox 😛
Şahmat
Tutaq ki, şahmat üçün siniflər yazmağa qərar verdik: bu siniflər necə görünə bilər?
Şahmat taxtası — sadəcə 8x8 ölçülü massivdir? Daha yaxşı olar ki, bunun üçün ayrıca bir sinif yaradın, hansının daxilində massivə link saxlanılır. Beləliklə, "şahmat taxtası" sinifinə bir çox faydalı metod əlavə edə bilərsiniz, məsələn, hücrənin boş olduğunu və ya dolu olduğunu yoxlayan metodlar.
Ümumilikdə, başlanğıcda hər zaman bu prinsipə riayət etmək olar: Proqram müxtəlif Subyektlərdən ibarətdir, və Subyektlərdə bir növ var. Bu növ — sinifdir.
GO TO FULL VERSION