1. Obyektlər və siniflər
Bu gün sizə Java'da tipik bir proqramın necə qurulduğunu öyrənəcəksiniz. Və əsas xəbər: Hər bir Java proqramı siniflərdən və obyektlərdən ibarətdir.
Siniflərin nə olduğunu artıq bilirsiniz, bəs obyektlər nədir?
Mən bir analoji ilə başlayacağam. Təsəvvür edin ki, kiçik bir gəmi hazırlamaq istəyirsiniz. Əvvəlcə çertyoj hazırlamaq, sonra bu çertyoj əsasında zavoda göndərmək lazımdır. Zavodda isə bu çertyoja əsasən gəmilər hazırlanır. Və ya onlarla. Ümumiyyətlə, istədiyiniz qədər gəmi. Bir çertyoj əsasında onlarla eyni gəmilər inşa olunur, bax bu vacibdir.
Java proqramlaşdırmada hər şey eynilə belədir.
Çertyojlar
Proqramçı - o layihəçi kimidir. Yalnız layihəçi çertyojlar çəkir, Java proqramçısı isə siniflər yazır. Sonra isə çertyojlara əsasən detalları, siniflərə əsasən isə obyektləri yaradırıq.
Əvvəlcə sinifləri yazırıq (çertyojlar hazırlayırıq), sonra proqramın icrası zamanı Java maşını bu siniflər əsasında obyektlər yaradır. Eynilə, çertyojlar əsasında gəmilər hazırlanır.
Çertyoj bir dənədir, amma gəmilər çox ola bilər. Gəmilər fərqli, adları fərqli, daşdıqları yüklər fərqli. Amma çox oxşardırlar: hamısı - eyni quruluşa malik gəmilərdir və oxşar vəzifələri yerinə yetirə bilərlər.
Yaxud başqa bir analoji...
Çoxlu Durmağazlı Ev
Çoxlu durmağazlı ev - obyektlərin qarşılıqlı təsirinin yaxşı bir nümunəsidir. Sadə bir çoxlu durmağazlı evdə üç qrup qarışqa var: kraliça, döyüşçülər və işçi qarışqalar.
Hər qrup qarışqanın sayı fərqlidir. Kraliça bütün çoxlu durmağazlı evdə birdir, döyüşçülər onlarla, işçi qarışqalar isə yüzlərlədir. Üç qrup və yüzlərlə obyekt. Qarışqalar bir-biri ilə, eyni qrupdan olanlarla və digər qruplardan olanlarla sərt müəyyən edilmiş qayda ilə qarşılıqlı təsir göstərir.
Bu, sadəcə ideal bir nümunədir. Tipik bir proqramda hər şey eynilə belədir. Bütün qrupların obyektlərini yaradan baş obyekt var. Obyektlər bir-biri ilə və proqramın "xarici dünyası" ilə qarşılıqlı təsir göstərməyə başlayır. Bu obyektlərin içərisində onların davranışları sərt təyin olunub.
Bu iki izah - medalin iki tərəfidir. Həqiqət ortadadır. Birinci nümunə (çertyoj və gəmilər haqqında) sinif və bu sinifin obyektləri arasındakı əlaqəni göstərir. Analojisi çox güclüdür. İkinci nümunə (çoxlu durmağazlı ev haqqında) proqramın işləmə zamanı mövcud olan obyektlərin yazılmış siniflərlə əlaqəsini göstərir.
Öncə proqramda mövcud olan bütün obyektlər üçün sinifləri yazmalısınız, sonra isə onların qarşılıqlı təsirini təsvir etməlisiniz. Bəli, belədir, amma göründüyündən daha asandır.
Java-da proqramın işləmə zamanı bütün subyektlər obyektlərdir və proqramı yazmaq müxtəlif obyektlərin qarşılıqlı təsir yollarını təsvir etmək deməkdir. Obyektlər sadəcə bir-birlərinin metodlarını çağırır və lazım olan məlumatları onların içərisinə ötürür.
Dokumentasiya
Bəs metodlara hansı məlumatları ötürmək lazımdır? Burada sizdən əvvəl düşünülmüşdür.
Adətən hər bir sinifin təyinatını göstərən bir təsviri olur. Həmçinin, adətən hər bir metodun da təsviri var: nə edir və hansı məlumatları ona ötürmək lazımdır.
Sinifdən istifadə etmək üçün onun nə etdiyini ümumi şəkildə bilmək lazımdır. Həmçinin, hər bir metodun nə etdiyini dəqiq bilmək lazımdır. Onun necə etdiyini bilmək isə vacib deyil. Bu bir az da sehrli çubuq kimidir.
Gəlin koda baxaq - faylın kopyalanması:
Faylın kopyalanması c:\data.txt faylından c:\result.txt faylına |
---|
|
Bu kodu sətir-sətir oxuyaraq ümumi şəkildə nə etdiyini başa düşmək olar. Amma burada təcrübə və praktika lazımdır. Bir müddət sonra bu kod sizə tanış və anlaşıqlı gələcək.
2. Proqramın dizaynı
Proqramın dizaynı - bu, bir sənətdir. Bu həm asan, həm də çətin bir vaxtda. Asandır, çünki sərt qanunlar yoxdur: qadağan olunmayan hər şey icazəlidir. Amma çətindir, çünki bir şeyi etmək üçün çox sayda yol var və ən yaxşısını tapmaq asan deyil.
Proqramın dizaynı kitab yazmaq kimidir. Bir tərəfdən, siz sadəcə hərfləri, sözləri, cümlələri yazırsınız. Digər tərəfdən - süjet, qəhrəmanların xarakterləri, daxili ziddiyyətlər, konfliktlər, təhkiyə üslubu, intriqa və s. vacibdir.
Əsas - kodu kim üçün yazdığınızı anlamaqdır. Kodu başqa proqramçılar üçün yazırsınız.
Hər hansı bir məhsulun inkişafı dəyişikliklərin edilməsidir: buraya əlavə edirik, oradan silirik, burada dəyişdiririk. Belə kiçik iterasiyalarla böyük, nəhəng və çox böyük layihələr doğulur.
Koda qoyulan əsas tələb - o başa düşülən olmalıdır. Yanlış, anlaşılan kod düzəldilə bilər. Doğru və anlaşılmaz kodu təkmilləşdirmək mümkün olmayacaq. Onu sadəcə atmaq qalacaq.
Bəs yaxşı və başa düşülən kodu necə yazmaq olar?
Bunun üçün üç şey etmək lazımdır:
- Metodların içində yaxşı və başa düşülən kod yazmaq - ən asan şey.
- Proqramda hansı subyektlər olmalıdır həll etmək
- Proqramı doğru şəkildə məntiqi hissələrə bölmək
Bəs bu anlayışların arxasında nə dayanır?
Metodların içində yaxşı kod yazmaq
Əgər sizin ən azı başa düşülə bilən İngilis dili səviyyəniz varsa, bəzən necə asan oxunan kod olduğunu görmüş ola bilərsiniz: necə ki, İngilis dilində cümlələr kimi:
class Cat extends Pet
– sinif Cat sinif Pet'i genişləndirirwhile(stream.ready())
– axın hazır olduqda ...if (a<b) return a; else return b
– əgəra
b
dən kiçikdirsə,a
qaytar, əks haldab
qaytar.
Bu xüsusi olaraq belə edilir. Java - həm də asanlıqla özü izah olunan kod yazmağa imkan verən bir neçə dillərdən biridir: şərhlər olmadan başa düşülən kod. Java-da yaxşı kodda bir çox metodlar sadəcə İngilis dilindəki cümlələr kimi oxunur.
Yazdığınız kodu mümkün qədər sadə və yığcam etmək sizin vəzifənizdir. Sadəcə düşünün, kodunuzu nə qədər asan oxuyuruq və düzgün istiqamətə doğru hərəkət etməyə başlayacaqsınız.
Java-da asan oxunan kod yazmaq adətdir. Arzu edilir ki, hər bir metod tamamilə ekranda yerləşsin (metodun uzunluğu - 20-30 sətir). Bu, bütün Java kommuuniti üçün normadır. Əgər kodu yaxşılaşdırmaq mümkündürsə, o yaxşılaşdırılmalıdır.
Yaxşı kod yazmağın ən yaxşı yolu - daimi praktika. Çox kod yazın, başqalarının kodunu öyrənin, daha təcrübəli həmkarlarınızdan kodunuzu icmallarını istəyin.
Və unutmayın ki, "və belə də gedər" dediyiniz anda, inkişafınızı dayandırırsınız.
Proqramda hansı subyektlərin olmalıdır həll etmək
Başqa proqramçılar üçün başa düşülən kod yazmanız gərəkir. Əgər 9-dan 10 proqramçı proqramın dizaynında A, B və C siniflərini yaradırsa, siz də proqramınızda A, B və C siniflərini yaratmalısınız. Başqa proqramçılar üçün başa düşülən kod yazmalısınız.
Mükəmməl, işlək, sürətli, qeyri-ənənəvi kod - pis koddur.
Başqalarının layihələrini öyrənin: bu, İT industriyasına on illər ərzində toplanan bütün bilikləri öyrənmənin ən yaxşı, ən sürətli və ən asan yoludur.
Və sizdə artıq əlinizdə mükemmel, populyar, yaxşı sənədləşdirilmiş bir layihə var - Java SDK. Onunla başlayın.
Sinifləri və siniflərin strukturlarını analiz edin. Fikirləşin, niyə bəzi metodlar static edilib, bəs digərləri - edilməyib. Niyə metodların məhz bu parametrləri var, başqaları yox. Niyə məhz bu metodlar, niyə oğlanlar məhz belə adlanır və niyə məhz belə paketlərdə yerləşirlər.
Bütün bu suallara cavab verməyə başladığınızda başqaları üçün başa düşülən kod yaza biləcəksiniz.
Lakin sizi Java SDK metodlarının içindəki kodların analizindən xəbərdar etmək istəyirəm. Bir çox metodların kodu iş sürətini maksimuma çatdırmaq üçün dəyişdirilmişdir ki, onun oxunaqlılığı böyük şübhə altındadır.
Proqramı doğru şəkildə məntiqi hissələrə bölmək
Adətən hər bir proqram hissələrə və ya modullara bölünür. Hər bir hissə proqramın öz aspektinə cavab verir.
Məsələn, kompüterin sistem bloku, monitoru, klaviaturası var və bütün bu ayrı, az asılı olan hissələrdir. Üstəlik, onların qarşılıqlı təsiri standartlaşdırılıb: USB, HDMI və s. Amma əgər klaviaturanın üzərinə qəhvə töksəniz, sadəcə onu kranın altında yuyub, qurutub, sonra istifadə edə bilərsiniz.
Ama laptop monolit bir memarlıq nümunəsidir: məntiqi hissələr var kimi, amma daha sıx inteqrasiya olunub. MacBookPro-da klaviaturanı təmizləmək üçün laptopun yarısını sökmək lazımdır. Laptopa tökülən qəhvə - yeni birini sifariş etməyin səbəbidir. Yalnız qəhvə deyil.
3. Öz siniflərinizi yaratmaq
Ama siz hələ də proqramlaşdırmanı öyrənirsiniz, kiçikdən başlamalısınız - öz siniflərinizi yaratmağı öyrənməkdən başlayın.
Əlbəttə, siz onları artıq yaradalmışdınız, amma proqramda hansı siniflərin olmalıdır, onların necə adlanmalıdır, hansı metodlarının olmalıdır və onların bir-birləri ilə necə qarşılıqlı təsir göstərməlidir anlamağı öyrənməlisiniz.
Subyektlərin siyahısı
Əgər haradan başlayacağınızı bilmirsinizsə, əvvəlindən başlayın.
Proqramın dizaynının əvvəlində sadəcə kağızda proqramda olmalıdır olan subyektlərin (obyektlərin) siyahısını yaza bilərsiniz. Sonra onları bu prinsiplə proqramlaşdırın: hər bir subyekt - ayrı bir sinifdir.
Nümunə
Tutaq ki, şahmat oyununu yazmaq istəyirsiniz. Sizə aşağıdakı subyektlər lazım olacaq: şahmat taxtası və 6 növ fiqur. Fiqurlar fərqli şəkildə hərəkət edir, fərqli qiymətə malikdirlər - bu ayrıca siniflərdir. Ümumiyyətlə, ən başda, nə qədər çox siniflər - o qədər yaxşıdır.
İki sinifi yazmaq əvəzinə onlarını yazan bir yeni proqramçı çox nadir hallarda rast gəlinər. Amma onını yazmaq əvəzinə ikisini, ya da birini yaza bilər - bu yeni başlayanlar sevirlər. Belə ki, daha çox siniflər, proqramçı dostlarım. Kodunuz sizin üçün başa düşülən olacaq, amma ola bilsin ki, sizin üçün deyil 😛
Şahmat
Tutaq ki, şahmat üçün siniflər yazmağa qərar verdik: bu siniflər necə görünərdi?
Şahmat taxtası - sadəcə 8x8 ölçülü massivdir? Onun üçün ayrıca sinif yaradın, hansı ki, daxildə massivə bir bağlantı saxlayır. O zaman şəahmat taxtası sinifinə çox faydalı metodlar əlavə edə bilərsiniz ki, məsələn, hücrənin boş və ya dolu olduğunu yoxlayır.
Ümumiyyətlə, əvvəldə, həmişə bu prinsipdən istifadə edə bilərsiniz: Proqramın müxtəlif Subyektləri var, və Subyektin bir tipi var. Bu tip - sinifdir.
4. Static dəyişənlər və metodlar
Həmçinin static dəyişənləri və metodları istifadə etməyi unutmayın. Əgər şahmat taxtasında olan şahmat fiquru başqa bir fiquru ilə qarşılıqlı təsir göstərərsə, kodunuzda ilkin fiqura, ikinci fiqura və şahmat taxtasına bağlantıları ötürən metod olmalıdır.
Obyektlərə daima bağlantılar ötürməmək üçün, onları adətən static dəyişənlər edirlər və onlara proqramın hər yerindən müraciət edə bilərsiniz.
Məsələn, belə:
Kod | Qeyd |
---|---|
|
ChessBoard tipindəki tək obyektə bağlantı. 8×8 ölçülü ikiölçülü massiv, static dəyişən deyil. Taxtaya fiqurlar əlavə edirik. |
Yaxud, static dəyişən əvəzinə, yeganə obyekti geri qaytaran bir metod yarada bilərsiniz. Məsələn, belə:
public class ChessBoard
{
private static ChessBoard board = new ChessBoard();
public static ChessBoard getBoard()
{
return board;
}
public ChessItem[][] cells = new ChessItem[8][8];
...
}
public class Game
{
public static void main(String[] args)
{
var board = ChessBoard.getBoard();
board.cells[0][3] = new King(Color.WHITE);
board.cells[0][4] = new Queen(Color.WHITE);
...
}
}
GO TO FULL VERSION