1. Obyektlər və siniflər
Bugün siz adi bir Java proqramının necə qurulduğunu az da olsa öyrənəcəksiniz. Və əsas xəbər: hər bir Java proqramı siniflər və obyektlərdən ibarətdir.
Siniflərin nə olduğunu artıq bilirsiniz, bəs obyektlər nədir?
Mən analoji ilə başlayacam. Təsəvvür edin ki, siz kiçik bir gəmi düzəltmək istəyirsiniz. Əvvəlcə bir çertyoj hazırlamalısınız, sonra onu zavoda göndərə bilərsiniz, orada həmin çertyoj əsasında gəmi yığacaqlar. Ya da bir neçə gəmi. Düzü, istənilən sayda gəmi. Eyni çertyojla onlarla eyni gəmilər tikilir, vacib olan budur.
Java proqramlaşdırmasında da hər şey eyni cürdür.
Çertyojlar
Proqramçı — layihəçi kimidir. Ancaq layihəçi çertyoj çəkir, Java proqramçısı isə siniflər yazır. Sonra çertyojlar əsasında detalları, siniflər əsasında isə obyektləri yaradırlar.
Əvvəlcə biz siniflər yazırıq (çertyojlar hazırlayırıq), sonra isə proqramın icrası zamanı həmin siniflər əsasında Java maşını obyektlər yaradır. Eynilə çertyoj əsasında gəmilər tikildiyi kimi.
Bir çertyoj var, amma gəmilər çox ola bilər. Gəmilər fərqlidir, onların adları fərqlidir, müxtəlif yüklər daşıyırlar. Amma çox oxşardırlar: hamısı eyni konstruksiyaya malik gəmilərdir və oxşar tapşırıqları yerinə yetirə bilirlər.
Ya da başqa bir bənzətmə...
Qarışqa yuvası
Qarışqa yuvası obyektlərin qarşılıqlı təsirini göstərən gözəl bir nümunədir. Ən sadə qarışqa yuvasında üç qarışqa sinfi var: kraliça, döyüşçülər və işçi qarışqalar.
Hər sinifdən olan qarışqaların sayı fərqlidir. Kraliça — bütün yuva üçün təkdir, döyüşçülər — onlarla, işçi qarışqalar isə yüzlərlədir. Üç sinif və yüzlərlə obyekt. Qarışqalar bir-biri ilə, öz sinifindən olan və digər siniflərin qarışqaları ilə sərt qaydalarla qarşılıqlı əlaqədə olur.
Bu, sadəcə ideal nümunədir. Tipik bir proqramda hər şey eynilə belədir. Əsas obyekt var ki, digər siniflərin bütün obyektlərini yaradır. Obyektlər bir-biri ilə və proqramın xarici mühiti ilə qarşılıqlı əlaqədə olur. Bu obyektlərin daxilində onların davranışları sərt şəkildə proqramlaşdırılıb.
Bu iki izahat eyni medalın iki tərəfidir. Həqiqət ortadadır. Birinci nümunə (çertyoj və gəmilər haqqında olan) bir sinif və həmin sinifin obyektləri arasındakı əlaqəni göstərir. Bənzətmə çox güclüdür. İkinci nümunə (qarışqa yuvası haqqında olan) proqram işləyərkən mövcud olan obyektlər və yazılmış siniflər arasındakı əlaqəni göstərir.
Əvvəlcə siz proqramda mövcud olan bütün obyektlərin siniflərini yazmalısınız, sonra isə onların qarşılıqlı əlaqələrini təsvir etməlisiniz. Bəli, bu belədir, amma bu, göründüyü qədər çətin deyil.
Java-da proqram işləyərkən bütün varlıqlar obyektlərdir və proqram yazmaq müxtəlif obyektlərin qarşılıqlı əlaqə yollarını təsvir etməkdən ibarətdir. Obyektlər sadəcə olaraq bir-birinin metodlarını çağırır və onlara lazım olan məlumatları ötürürlər.
Sənədləşmə
Bəs metodlara hansı məlumatları ötürmək lazımdır? Bütün bunlar artıq sizin üçün hazırlanıb.
Adətən hər bir sinfin bir təsviri var ki, orada onun nə üçün yaradıldığı deyilir. Adətən hər bir public metodu haqqında da təsvir var: nə edir və ona hansı məlumatları ötürmək lazımdır.
Sinifdən istifadə etmək üçün onun nə etdiyini ümumi olaraq bilmək lazımdır. Həmçinin, onun hər metodunun nə etdiyini dəqiq bilmək lazımdır. Ancaq onun bunu necə etdiyini bilməyə ümumiyyətlə ehtiyac yoxdur. Bu, özünəməxsus bir sehrli çubuq kimidir.
Gəlin koda baxaq — faylın kopyalanması:
c:\data.txt faylını c:\result.txt faylına kopyalamaq |
---|
|
Əgər bu kodu sətir-sətir oxusanız, ümumilikdə nə etdiyini təxmin edə bilərsiniz. Baxmayaraq ki, burada təcrübə və praktikaya ehtiyac var. Beləliklə, bir müddətdən sonra bu kod sizə tanış və aydın gələcək.
2. Proqramın layihələndirilməsi
Proqramın layihələndirilməsi — bu tamamilə bir sənətdir. Bu həm sadə, həm də eyni zamanda çətindir. Sadədir, çünki heç bir sərt qayda yoxdur: qadağan edilməyən hər şey icazəlidir. Çətindir də məhz bu səbəbdən: nəyisə etmək üçün çoxlu yollar var və ən yaxşısını tapmaq asan deyil.
Proqram layihələndirmək — kitab yazmaq kimidir. Bir tərəfdən, sadəcə hərflər, sözlər, cümlələr yazırsınız. Digər tərəfdən isə süjet vacibdir, qəhrəmanların xarakterləri, daxili ziddiyyətlər, konfliktlər, rəvayət üslubu, intriqa və s.
Əsas məsələ — kodu kim üçün yazdığınızı başa düşməkdir. Kodunuzu başqa proqramçılar üçün yazırsınız.
Hər hansı bir məhsulun inkişafı — dəyişikliklər etməkdir: buradakı bir şeyi əlavə etdiniz, o biri yerdə bir şey çıxartdınız, haradasa yenidən düzəltdiniz. Beləcə kiçik iterasiyalarla böyük, nəhəng və hədsiz böyük layihələr yaranır.
Kodun əsas tələbi — o, digər proqramçılar üçün başa düşülən olmalıdır. Səhv, amma başadüşülən kodu düzəltmək olar. Doğru və başa düşülməyən kodu yaxşılaşdırmaq mümkün olmayacaq. Onu sadəcə atmaq qalacaq.
Bəs yaxşı və başadüşülən kodu necə yazmalı?
Bunun üçün üç şey etmək lazımdır:
- Metodların içində yaxşı və başadüşülən kod yazmaq — ən asanıdır.
- Proqramda hansı varlıqların olacağına qərar vermək
- Proqramı düzgün olaraq 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 sizdə ən azından başlanğıc səviyyədə ingilis dili biliyi varsa, yəqin ki, koda baxanda onun necə bəzən asan oxunduğunu hiss etmisiniz: ingilis dilində cümlələr kimi oxunur:
class Cat extends Pet
– sinif Cat sinfi Pet sinfini genişləndirirwhile(stream.ready())
– axın hazırkən ...if (a<b) return a; else return b
– əgəra
,b
-dən kiçikdirsə,a
-nı qaytar; əks haldab
-ni qaytar.
Bu məqsədli şəkildə belə edilib. Java — bir neçə dildən biridir ki, burada öz-özünü sənədləşdirən kod yazmaq asandır: izahatlara ehtiyac olmadan anlaşılan kod. Java-da yaxşı kodda bir çox metodlar sadəcə ingilis cümlələri kimi oxunur.
Kod yazarkən sizin məqsədiniz də onu maksimum dərəcədə sadə və qısa etməkdir. Sadəcə düşünün, sizin kodunuzu oxumaq nə qədər asan olacaq, və doğru istiqamətdə irəliləməyə başlayacaqsınız.
Java-da oxunaqlı kod yazmaq adi haldır. İstək odur ki, hər bir metod ekrana tam sığsın (metodun uzunluğu — 20-30 sətir). Bu, bütün Java icması üçün standartdır. Əgər kodu yaxşılaşdırmaq mümkündürsə, onu yaxşılaşdırmaq lazımdır.
Yaxşı kod yazmağı öyrənməyin ən yaxşı yolu — daimi 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 rəy vermələrini xahiş edin.
Və unutmayın ki, özünüzə "belə də gedər" dediyiniz anda inkişafınız dayanır.
Proqramda hansı varlıqların olacağına qərar vermək
Siz digər proqramçılar üçün başa düşülən kod yazmalısınız. Əgər proqramı layihələndirərkən 10 proqramçıdan 9-u orada A, B və C siniflərini yaradırsa, sizin də proqramınızda A, B və C sinifləri olmalıdır. Siz başa düşülən kod yazmalısınız.
Möhtəşəm, işlək, sürətli, qeyri-standart kod — pis koddur.
Başqalarının layihələrini öyrənməlisiniz: bu, onilliklər ərzində İT sənayesində toplanmış müdrikliyi mənimsəməyin ən yaxşı, ən sürətli və ən asan yoludur.
Yeri gəlmişkən, artıq əlinizdə əla, populyar, yaxşı sənədləşdirilmiş bir layihə var — Java SDK. Oradan başlayın.
Sinifləri və siniflərin strukturlarını analiz edin. Fikirləşin, niyə bəzi metodlar statik edilib, bəziləri isə yox. Niyə metodların parametrləri məhz belədir, başqaları deyil. Niyə məhz həmin metodlar, niyə siniflər məhz belə adlanır və məhz bu paketlərdə yerləşirlər.
Bu sualların hamısına cavab tapmağa başladığınız anda digər proqramçılar üçün başa düşülən kod yaza biləcəksiniz.
Ancaq sizə Java SDK metodlarının içindəki kodları təhlil etməkdən çəkinməyi tövsiyyə edirəm. Çünki bir çox metodların kodları maksimal sürət üçün yenidən yazılıb — onların oxunaqlılığı böyük sual altındadır.
Proqramı düzgün olaraq məntiqi hissələrə bölmək
Adətən hər hansı 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üterdə sistem bloku, monitor, klaviatura kimi ayrı, az asılı hissələr var. Üstəlik, onların qarşılıqlı təsiri standartlaşdırılıb: USB, HDMI və s. Əvəzində, əgər klaviaturaya qəhvə töksəniz, onu sadəcə kranın altında yuyub, qurudaraq istifadə etməyə davam edə bilərsiniz.
Ancaq noutbuk — monolit arxitekturanın bir nümunəsidir: məntiqi hissələr mövcuddur, amma daha çox inteqrasiyalıdırlar. MacBookPro-da klaviaturanı təmizləmək üçün yarım noutbuku sökmək lazımdır. Noutbuka qəhvə tökmək — yeni sifariş etmək üçün bir səbəbdir. Yalnız qəhvə yox.
3. Öz siniflərinizi yaratmaq
Ancaq proqramlaşdırmanı yeni öyrəndiyiniz üçün kiçikdən başlamağınız lazımdır — öz siniflərinizi yaratmağı öyrənməlisiniz.
Əlbəttə ki, siz bunları artıq yaratmısınız, lakin proqramda hansı siniflərin olması lazım olduğunu, onların necə adlandırılacağını, hansı metodlara sahib olacağını və necə bir-biri ilə qarşılıqlı əlaqədə olacağını anlamağı öyrənmək lazımdır.
Varlıq siyahısı
Əgər haradan başlayacağınızı bilmirsinizsə, əvvəldən başlayın.
Proqramı dizayn etməyə başladığınızda, sadəcə bir kağıza proqramda olması lazım olan varlıqların (obyektlərin) siyahısını yaza bilərsiniz. Sonra onları bu prinsipə əsasən proqramlaşdırın: hər bir varlıq — ayrı bir sinif.
Nümunə
Güman edək ki, siz şahmat oyunu yazmaq istəyirsiniz. Belə varlıqlara ehtiyacınız olacaq: şahmat taxtası və 6 tipdə fiqur. Fiqurlar fərqli hərəkət edir, dəyərləri fərqlidir — məntiqli olaraq bunlar ayrıca siniflərdir. Ümumiyyətlə, başlanğıcda, siniflər nə qədər çox olsa, bir o qədər yaxşıdır.
İki sinif yerinə on sinif yazan bir yeni proqramçıya rast gəlmək nadirdir. Amma on yerinə iki, hətta bir yazmaq, bu yeni başlayanların sevimli işidir. Ona görə daha çox sinif, əziz proqramçılar. Kodunuz hər kəs üçün daha aydın olacaq, bəlkə də sizin özünüzdən başqa 😛
Şahmat
Güman edək ki, şahmat üçün siniflər yazmağa qərar verdik: bu siniflər necə görünə bilər?
Şahmat taxtası — sadəcə 8-ə 8 bir arraydır? Daha yaxşı olardı ki, onun üçün ayrıca bir sinif yaradasınız, içərisində array-ə link saxlasın. Beləliklə, "şahmat taxtası" sinifinə, məsələn, hüceyrənin boş və ya dolu olduğunu yoxlayan bir çox faydalı metod əlavə edə bilərsiniz.
Ümumilikdə, başlanğıcda həmişə bu prinsipə əsaslana bilərsiniz: Proqram fərqli Varlıqlardan ibarətdir, və Varlığın tipi var. Bax həmin tip — bu da sinif olur.
4. Statik dəyişənlər və metodlar
Eləcə də statik dəyişənlərdən və metodlardan istifadə etməyi unutma. Əgər sənin bir şahmat fiqurun digər fiqurla şahmat taxtasında qarşılıqlı əlaqədədirsə, deməli kodda sənin metodun olmalıdır ki, orada birinci fiqura, ikinci fiqura və şahmat taxtasına linklər ötürülsün.
Həmişə mövcud olan obyektlərin linklərini təkrar-təkrar ötürməmək üçün onları adətən statik dəyişənlər edirlər və onlara proqramın istənilən hissəsindən müraciət etmək mümkündür.
Məsələn, belə:
Kod | Qeyd |
---|---|
|
Tək ChessBoard tipində obyektin linki.İkiölçülü 8×8 massiv, qeyri-statik dəyişən. Fiqurları taxtaya əlavə edirik. |
Həmçinin, statik dəyişən əvəzinə tək obyekt qaytaran metod etmək mümkündür. 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