Java kodlash bo'yicha eng yaxshi amaliyotlarning qisqacha mazmuni

Oracle, Google, Twitter va Spring Framework kodlash standartlariga asoslanadi

Ushbu maqolaning maqsadi sizga bajarilgan ishlar to'g'risida qisqacha ma'lumot berish, boshqacha qilib aytganda Oracle, Google, Twitter va Spring Framework kabi gigantlarning kodlash standartlariga asoslanmaslik va ularni oldini olishdir.

Siz bu erda keltirilgan ba'zi ilg'or tajribalar bilan rozi bo'lmasligingiz mumkin yoki kodlash standartlari mavjud ekan, bu juda yaxshi.

Nega avval kodlash standartlari? Agar siz Google-dan foydalansangiz, juda ko'p sabablar bor va men sizni quyidagi rasm bilan qoldiraman

Kodlash standartlari to'g'risidagi hujjat uzoq va zerikarli bo'lishi mumkin. Ushbu maqola cherry Google, Oracle, Twitter va Spring tomonidan o'tkazilgan kodlash konventsiyalaridan parcha va qismlarni tanlab oladi va maqsadi sizning kodingizni o'qish va saqlashni oson qilish uchun sizga oson va zerikarli usullar to'plamini taqdim etishdir.

Deyarli har doim siz mavjud dasturiy ta'minot bilan ishlaydigan jamoalarga qo'shilasiz va ko'pgina mualliflarning turli xil loyihalarni tark etgan yoki almashtirganligi sizni insoniyatni shubha ostiga qo'yadigan kod qismlariga qoldirib ketish ehtimoli katta.

Keling, kodlashning turli xil standartlaridan foydalaning.

Java manba fayli

Quyida java manbali fayllar haqida gap ketganda, eng yaxshi amaliyot deb hisoblanadi.

  • Fayl uzunligi 2000 satrdan past
  • Manba fayli hujjat izohi, paket deklaratsiyasi, so'ngra sinf sharhi, quyida ko'rsatilgandek guruhlangan import (statik oxirgi), sinf / interfeys imzosi va boshqalar bilan tashkil qilingan.
com.example.model to'plami;
/ **
 * Ishlab chiquvchilar o'qishi uchun amalga oshirilmagan istiqbol
 * qo'lida manba kodi bo'lmasligi mumkin
 *
 * @ muallif x, y, z
 * @ kun
 * @ o'zgartirish
 * @ mualliflik huquqi
 *
 * /
import com.example.util.FileUtil;
/ *
 * Ixtiyoriy sinfga xos sharh
 *
 * /
jamoat klassi SomeClass {
  // Ko'rinish tartibida statik o'zgaruvchilar
  umumiy statik yakuniy son PUBLIC_COUNT = 1;
  PROTECTED_COUNT statik yakuniy butun son = 1;
  shaxsiy statik yakuniy son PRIVATE_COUNT = 1;
  // Ko'rinish tartibidagi lahzali o'zgaruvchilar
  public String nomi;
  Pochta indeksi
  shaxsiy qator manzili;
  // Konstruktor va ketma-ketlikda ortiqcha yuklangan
  ommaviy SomeClass () {}
  public SomeClass (satr nomi) {
    this.name = ism;
  }
  // Usullari
  public String doSomethingUseful () {
    qaytish "foydali narsa";
  }
  // getters, setters, teng, hashCode va toString oxirida
}

Nomlash

Sinf va interfeys nomlari CamelCase bo'lib, butun so'zni ishlatish va qisqartmalar yoki qisqartmalardan qochish tavsiya etiladi. Masalan, Raster yoki ImageSprite klassi

  • Paket - com.deepSpace yoki com.deep_space orqali com.deepspace nomini beradi
  • Fayl nomlari - CamelCase va sinf nomiga mos keladigan .java bilan tugaydi. Har bir fayl uchun bitta umumiy sinf mavjud, uning faylida har bir yuqori darajali sinf mavjud
  • Metod - ismlar aralash harflar bilan fe'l bo'lishi kerak, masalan har bir bosh so'z bilan bosh harf bilan yozilishi kerak (); yoki runFast ();
  • Konstantalar - har bir so'zni ajratuvchi "_" harfi bilan bosh harf bo'lishi kerak, masalan int MIN_WIDTH = 44; va int MAX_WIDTH = 99;
  • O'zgaruvchan - bu dasturni o'quvchiga o'zgaruvchining nimani anglatishini bildiradigan ism, ya'ni agar siz test bahosini saqlayotgan bo'lsangiz, vs vs1 ni tanlang. O'zgaruvchan nomlarni qisqa tuting, shu jumladan metadata ham.
// Afzallik () - o'zgaruvchan nomlar qisqa va ular nimani saqlayotganini tasvirlab bering
int schoolId;
int [] filteredSchoolIds;
int [] noyobSchooldIds;
Map  usersById;
Satr qiymati;
// (X) saqlaning - juda o'zgaruvchan nomlash
int schoolIdentificationNumber;
int [] userPvedidedSchoolIds;
int [] schoolIdsAfterRemovingDuplicates;
Map  idToUserMap;
String valueString;

Yodda tuting - o'zgaruvchan ism qisqa bo'lishi kerak va o'quvchiga u nimani anglatishini osongina aytib berishi kerak. O'zingizning qaroringizdan foydalaning.

Afzal ko‘ring va saqlaning

Formatlash va belgilash bu sizning kodingizni o'qishni osonlashtirish uchun tashkil qilish bilan bog'liq bo'lib, bo'sh joy, satr uzunligi, sarlavhalar va tanaffuslar va boshqalarni o'z ichiga oladi.

  • Shartnoma - 2 yoki 4 bo'sh joydan foydalaning va izchil bo'ling
  • Chiziq uzunligi - o'qish qobiliyatiga bog'liq ravishda 70 dan 120 gacha belgilar. Gorizontal o'tish zarurligini bartaraf etish va vergul va operatordan keyin chiziqlarni ajratish muhimdir.

Usullar - bu erda eng yaxshi amaliyotlar ro'yxati keltirilgan

// Afzallik () Chiziqlar o'zboshimchalik bilan va verguldan keyin uziladi.
String downloadAnInternet (Internet Internet, quvurlar,
    Blog muhiti bloglari, miqdori  o'tkazish qobiliyati) {
  naychalarni yuklab olish (internet);
}
// saqlaning (x) Qattiq farq qilish usuli usul tanasiga dalillar
String downloadAnInternet (Internet Internet, quvurlar,
    Blog muhiti bloglari, miqdori  o'tkazish qobiliyati) {
    naychalarni yuklab olish (internet);
}
// Afzal ko'ring () Chuqur ichi bo'sh joy uchun 8 (2 yoki 4 juft) bo'sh joy qo'shing
shaxsiy statik sinxron horkingLongMethodName (int anArg,
        ObjectArg, String yetAnotherArg,
        Ob'ekt vaStillAnother) {
  ...
}
// Afzallik () Oson skanerlash va ustunlar uchun qo'shimcha joy.
public String downloadAnInternet (
    Internet,
    Quvurlar
    Blog muhiti bloglari,
    Miqdor  o'tkazish qobiliyati) {
  naychalarni yuklab olish (internet);
  ...
}
Birlikni sinash shuni anglatadimi?

If-chexlar - IMO-ning yaxshi formatlangan kodni yozishi xatolarni va xatolarni muallifga va kodni sharhlovchilarga aniqlashni osonlashtiradi, quyida ko'rib chiqing:

// (x) saqlaning {E'tibor bermang {}
agar (shart)
  bayonot;
// (x) oldini oling
if (x <0) manfiy (x);
// (x) oldini oling
agar (a == b && c == d) {
...
}
// Afzallik ()
agar ((a == b) && (c == d)) {
...
}
// Afzallik ()
if (shart) {
  bayonotlar;
} else if (shart) {
  bayonotlar;
} else if (shart) {
  bayonotlar;
}
// (x) oldini oling
if ((1-shart && shart2)
    || (shart3 && shart4)
    ||! (shart5 && shart6)) {// YANGI YO'QLAR
    doSomethingAboutIt (); // BU YO'QNI YO'Q QILING
}
// Afzallik ()
if ((1-shart && shart2)
        || (shart3 && shart4)
        ||! (shart5 && shart6))) {
    doSomethingAboutIt ();
}

Ternary operatori - Va quyida amaliyot tavsiya etiladi

alfa = (aLongBooleanExpression)? beta: gamma;
alfa = (aLongBooleanExpression)? beta-versiya
        : gamma;
alfa = (aLongBooleanExpression)
        ? beta-versiya
        : gamma;

O'tkazish - almashtirish haqida gap ketganda, eng yaxshisi

  • Hatto kodsiz ham har doim odatiy holatlar mavjud
  • Boshqarish keyingi holatga tushishini ko'rsatish uchun * / tugmasidan foydalaning
switch (holat) {
  ABC holati:
    bayonotlar;
  / * tushadi * /
  DEF holati:
    bayonotlar;
    sindirish;
  standart:
    bayonotlar;
     sindirish;
}

Istisno xabarlar - Istisno tashlash paytida bu erda yaxshi va yomon ajratilmagan xabarlarning namunalari mavjud.

// (x) saqlaning - O'qish oson emas
yangi IllegalStateException ("so'rovni bajarib bo'lmadi" + request.getId ()
    "" foydalanuvchi uchun "+ user.getId () +" so'rov: '"+ query.getText ()
    + "'");
// Afzallik () - O'qish ancha oson
yangi IllegalStateException ("ishlov berilmadi"
    + "so'rov" + request.getId ()
    + "foydalanuvchi uchun" + user.getId ()
    + "so'rov: '" + query.getText () + "'");

Iteratorlar va oqimlar - Oqimlar odatiy holga aylanib bormoqda va ba'zan bu juda murakkab bo'lishi mumkin, shuning uchun o'qish oson bo'lishi uchun ajratish kerak.

// (x) saqlaning - O'qish oson emas
Qayta tiklanadigan  modullari = ImmutableList.  builder (). Add (new LifecycleModule ())
    .add (yangi AppLauncherModule ()). addAll (application.getModules ()). build ();
// Afzallik () - O'qish ancha oson
O'zgartirilishi mumkin bo'lgan  modullari = ImmutableList.  builder ()
    .add (yangi hayot tsikliModuli ())
    .add (yangi AppLauncherModule ())
    .addAll (application.getModules ())
    .qurmoq();
Kodlash standartiga amal qiling - har qanday haqiqatan ham

Deklaratsiyalar va Topshiriqlar - Har bir satrda bitta deklaratsiya tavsiya etiladi, chunki u quyida ko'rsatilgan sharhlarni qo'llab-quvvatlaydi.

// Afzallik ()
int darajasi; // ajratish darajasi
int sizeMeter; // jadval hajmi
// Yuqoridan foydasiga (x) dan saqlaning
int darajasi, sizeMeter;
// Afzallik () - Birlikni o'zgaruvchan nom yoki turga qo'shing
uzoq so'rovlar;
int fileSizeGb;
Miqdor  fileSize;
// (x) aralashtirish turlaridan saqlaning
int foo, fooarray [];
// (x) saqlaning - vergul bilan ajratmang
Format.print (System.out, "xato"), chiqish (1);
// (x) bir nechta topshiriqlardan saqlaning
fooBar.fChar = barFoo.lchar = 'c';
// ishlashni oshirish yoki chiziqni saqlashga urinish uchun (x) kiritilgan topshiriqlardan saqlaning. Bunga men aybdorman :(
d = (a = b + c) + r;
// Yuqoridan ustun ()
a = b + c;
d = a + r;
// Afzallik ()
String [] args
// (x) oldini oling
String args []
// afzal ko'ring () 1 bilan chalkashmaslik uchun "L" o'rniga "L" harfidan foydalaning
uzoq kutish vaqti = 3000000000L;
// (x) saqlaning - oxirgi harfni aytish qiyin emas l va 1 emas
uzoq kutish vaqti = 3000000000l;

Deklaratsiyani faqat bloklarning boshiga qo'ying (blok - bu {va} jingalak qavs bilan o'ralgan kod). O'zgaruvchilar birinchi marta ishlatilgunga qadar ularni e'lon qilishni kutmang; u keraksiz dasturchini chalkashtirib yuborishi va ushbu kod ichidagi kodni ko'chirishga xalaqit berishi mumkin.

// Afzallik () blokning boshida e'lon qilinadi.
ommaviy bo'shliq doSomething () {
  int whatRepresent; // usul blokining boshi
  if (shart) {
    int someFlag; // "agar" blokining boshlanishi
    …
  }
}

Bundan tashqari, yuqori darajadagi deklaratsiyalarni yashiradigan mahalliy deklaratsiyalardan qochish va quyida ko'rsatilgandek chalkashliklar oldini olish kerak

int hisoblash;
...
ommaviy bo'shliq doSomething () {
  if (shart) {
    int hisoblash; // AVOID!
    ...
  }
  ...
}

Bo'shliqlar va qatorlar oralig'i - 1-2 satr kodlarini o'qish qulayligi hisobiga saqlash vasvasasidan saqlaning. Bo'sh joylar va bo'sh chiziqlar haqida gap ketganda, bu erda eng yaxshi amaliyotlar mavjud (Bo'sh joy o'zgaradi)

  • Usullar va Bahorni ishlab chiquvchilar orasidagi bitta (1) bo'sh chiziq, konstruktorlardan, statik blokdan, maydonlardan va ichki sinfdan keyin ikkita (2) bo'sh qatorni tavsiya qiladi.
  • Kosmik pad operatorlari, ya'ni int foo = a + b + 1 dan foydalaning; over int foo = a + b + 1;
  • Bo'sh joyni ishlatadigan operandlardan "ikkalasini" tashqari barcha ikkilik operatorlarni ajrating
  • "{" Ochiq qavs deklaratsiya bayonnomasi yoki usuli bilan bir qatorning oxirida paydo bo'ladi va "}" yopilish chizig'i o'z-o'zidan ajratilgan qatorni boshlaydi.
// Afzallik () - "vaqt" va undan oldin "("
while (true) {
  ...
}
// (x) saqlaning - yuqoridagi bo'sh joydan farqli o'laroq
while (true) {
  ...
}
// Afzallik () - "doSomething" va "(" o'rtasida) bo'sh joy yo'q.
ommaviy bo'shliq doSomething () {
  ...
}
// (x) saqlaning - yuqoridagi bo'shliqdan farqli o'laroq
ommaviy bo'shliq doSomething () {
  ...
}
// Afzallik () - tortishuvdan keyin bo'sh joy qo'shing
ommaviy bo'shliq doSomething (int a, int b) {
  ...
}
// Afzallik () - Operand va operatorlar orasidagi bo'sh joy (ya'ni +, =)
a + = c + d;
a = (a + b) / (c * d);
vaqt (d ++ = s ++) {
  n ++;
}

Hujjatlar va sharhlar

Shuni ta'kidlash kerakki, deyarli barcha kodlar uning hayoti davomida o'zgarib turadi va ba'zida siz yoki kimdir aniq blokirovka qilinmagan murakkab kodlar, usullar yoki sinflarning qaysi blokini amalga oshirishni rejalashtirganini bilib olishga harakat qiladi. Haqiqat deyarli har doimgidek

Ba'zida murakkab kod, usul, sinf haqidagi sharh hech qanday qiymat bermaydi yoki uning maqsadiga xizmat qilmaydi. Odatda bu uning nomini sharhlashda yuz beradi.

Sharhlar kodga qisqacha ma'lumot berish va kodning o'zida mavjud bo'lmagan qo'shimcha ma'lumotlarni taqdim etish uchun ishlatilishi kerak. Qani boshladik. Sharhlarning ikki turi mavjud

Amalga oshirish bo'yicha sharhlar - kodni sharhlash yoki kodning biron bir amalga oshirilishini sharhlash uchun mo'ljallangan.

Hujjatlar bo'yicha sharhlar - ishlab chiquvchilar o'qishi kerak bo'lgan kodning spetsifikatsiyasini amalga oshirilmagan nuqtai nazardan tavsiflash uchun mo'ljallangan, ular dastlabki kodga ega bo'lishi shart emas.

Ba'zida sharhlarning chastotasi kodning past sifatini aks ettiradi. Agar siz sharh qo'shishga majbur bo'lsangiz, uni yanada aniqroq qilish uchun kodni qayta yozishni o'ylab ko'ring.

Amalga oshiriladigan sharhlarning turlari

Amalga oshiriladigan sharhlarning to'rtta (4) turi quyida ko'rsatilgan

  • Sharhni bloklash - quyidagi misolga qarang
  • Bir qatorli sharh - agar sharh chiziqdan uzun bo'lmasa
  • Izohli izohlar - Juda qisqa sharh to'g'ri oxiriga o'tkazildi
  • Qator izohining oxiri - yangi satrda davom etadigan sharhni boshlaydi. U to'liq yoki faqat qisman chiziqni sharhlashi mumkin. Matn sharhlari uchun ketma-ket ketma-ket keladigan qatorlarda ishlatilmasligi kerak; ammo, kod kodlarini sharhlash uchun ketma-ket ketma-ket ketma-ketlikda foydalanish mumkin.
// Sharhni bloklash
/ *
 * Foydalanish: fayllar, usullar, ma'lumotlar tuzilmalari tavsifini beradi
 * va algoritmlar. Har bir faylning boshida foydalanish mumkin va
 * har bir usuldan oldin. A ga to'g'ri kelmaydigan uzoq sharhlar uchun ishlatiladi
 * bitta qator. 1 Blok sharhidan keyin davom etish uchun bo'sh chiziq.
 * /
// Bir qatorli sharh
if (shart) {
 / * Shartni hal qiling. * /
  ...
}
// Izohli izoh
if (a == 2) {
 qaytish TRUE; / * alohida holat * /
} else {
 return isPrime (a); / * faqat toq a uchun ishlaydi / /
}
// satr sharhining oxiri
if (foo> 1) {
  // Ikki marta almashtirish.
  ...
} else {
  return false; // nima uchun bu erda ekanligini tushuntiring.
}
// agar (bar> 1) {
//
// // Uchburchakni bajaring.
// ...
//}
// yana
// return false;

Hujjatlarga izohlar (ya'ni Javadoc)

Javadoc bu HTML hujjatlarni yaratuvchi vosita bo'lib, sizning java kodingizni / ** bilan boshlanadigan va * / bilan tugaydigan izohlardan foydalangan holda yaratadi - Javadoc qanday ishlashi yoki o'qishni davom ettirishi haqida ko'proq ma'lumot olish uchun Vikipediyaga qarang.

Javadoc-ga misol

/ **
 * Keyin ekranda rasm chizish mumkin bo'lgan rasm ob'ektini qaytaradi.
 * URL manzili mutlaq {@ link URL} ni ko'rsatishi kerak. Ism
 * argument - bu url argumentiga nisbatan aniqlovchi.
 * 

 * Ushbu usul har doim, darhol yoki darhol qaytib keladi  * rasm mavjud. Ushbu ilova rasmni chizishga harakat qilganda  * ekranda, ma'lumotlar yuklanadi. Grafika ibtidoiylari  * rasmni chizadigan narsa ekranda bosqichma-bosqich bo'yaladi.  *  * @param URL manzili rasmning asosiy joylashuvini beradi  * @ param, url argumentiga nisbatan rasmning joylashgan joyini nomlang  * @ rasmni belgilangan URL manziliga qaytaring  * Rasmni ko'rish  * /  public Image getImage (URL manzili URL manzili, satr nomi) {         urinib ko'ring {             return getImage (yangi URL manzili (URL, ism));         } qo'lga olish (MalformedURLException e) {             return null;         }  }

Va yuqoridagi kod javadoc yuqorida ko'rsatilgan kodga qarshi ishlaganda HTML kabi bo'ladi

Ko'proq ma'lumot olish uchun bu yerga qarang

Bu erda siz yaratgan java hujjatlari sifatini oshirish uchun foydalanishingiz mumkin bo'lgan ba'zi bir teglar mavjud.

@author => @ muallif Raf
@code => {@ kodi A  C}
@deprecated => @ eskirgan eskirgan xabar
@exception => @exception IOException qachon tashlanadi
@link => {@link pack.class # a'zolar yorlig'i}
@param => @param parametr-ism tavsifi
@return => Qaytargan usul
@see => @see "string" Yoki @see  
@since => Agar hammaga ochiq usul qo'shilsa, ushbu versiyani ko'rsatish uchun

To'liq ro'yxat va batafsil ma'lumot uchun bu erda qarang

Twitter kodlash standarti @author yorlig'ini ishlatishga qarshi maslahat beradi

Kod ishlash davomida qo'llarni bir necha bor o'zgartirishi mumkin va ko'pincha bir necha marotaba qilingan ishlardan keyin manba faylining asl muallifi ahamiyatsiz bo'ladi. Kod tanasiga egalik huquqini aniqlash uchun biz topshiriq tarixi va OWNERS fayllariga ishonganimiz ma'qul.

Twitterda kodlash standartida bayon etilganidek, tushunarli bo'lgan hujjat izohini qanday yozishingiz mumkinligi haqida quyidagi misollar keltirilgan

// Yomon.
// - Hujjat usul deklaratsiyasini qilmaganligi haqida hech narsa aytmaydi.
// - bu "to'ldiruvchi hujjat". Bu uslub tekshiruvlaridan o'tadi, lekin
hech kimga yordam bermaydi.
/ **
 * Satr ajratadi.
 *
 * @param s Bir satr.
 * @ satrlar ro'yxatini qaytaring.
 * /
List  split (String s);
// Yaxshisi.
// - Biz usul nimaga bo'linishini bilamiz.
// - Hali ham aniqlanmagan xatti-harakatlar.
/ **
 * Bo'sh joyni ajratadi.
 *
 * @ param s Ajraladigan satr. {@ Kod null} satri bo'sh satr sifatida ko'rib chiqiladi.
 * @ Orqaga bo'sh joy ajratilgan qismlarining ro'yxatini qaytaring.
 * /
List  split (String s);
// Ajoyib.
// - yana bir yangi ishni ochadi.
/ **
 * Bo'sh joyni ajratadi. Bo'sh joy belgilarini takrorlash
 * qulab tushdi.
 *
 * @ param s Ajraladigan satr. {@ Kod null} satri bo'sh satr sifatida ko'rib chiqiladi.
 * @ Orqaga bo'sh joy ajratilgan qismlarining ro'yxatini qaytaring.
 * /
List  split (String s);

Sharh yozishda professional bo'lish juda muhimdir

// (x) oldini oling
// Men xml / sovunni juda yomon ko'raman, nega buni men uchun qilolmaydi !?
urinib ko'ring {
  userId = Integer.parseInt (xml.getField ("id"));
} catch (NumberFormatException e) {
  ...
}
// Afzallik ()
// TODO (Jim): kutubxonada yuk maydonini tekshirish.
urinib ko'ring {
  userId = Integer.parseInt (xml.getField ("id"));
} catch (NumberFormatException e) {
  ...
}

Va agar amalga oshirish o'zgarmasa, bekor qilingan usulni hujjatlashtirmaslik kerak.

Va yana bir nechta narsani yodda tutish kerak

  • Joker kartasini import qilishdan saqlaning - Twitter kodlash standartlarida aytilganidek, bu sinf manbasini kamroq aniq qiladi. Men Eclipse va IntelliJ foydalanuvchilari aralashgan jamoada ishlayman va Eclipse-ning yovvoyi karta importini olib tashlaganini va IntelliJ uni joriy qilganini bilib oldim. Ehtimol, uni o'chirish uchun variant mavjud, shunchaki ikkalasiga sukut bo'yicha ishora qilishni xohlagan edingiz.
  • Hech qachon bekor qilishda har doim @Oride of annotation-dan foydalaning
  • Maydon yoki usul bekor qilinganida @Nullable dan foydalanishni rag'batlantiring
  • Kelgusidagi ish uchun maxsus izohlardan foydalaning va o'zingizning ma'lumotnomangizni qoldirishni unutmang, shunda boshqalar Y savolini kim bilishini, uni olib tashlamaslik yoki git aybni tekshirishning o'rniga, kim qo'shganini topish uchun bilishlarini bilishadi. Eclipse va IntelliJ singari ba'zi bir IDE-lar bu oson kirish uchun eslatma sifatida ham ularni ro'yxatlashda yordam beradi.
// FIXME (Raf): Amalga oshiriladigan xabar nima qilish kerakligini tasvirlaydi
// TODO (Raf): Amalga oshiriladigan xabar nima qilish kerakligini tasvirlaydi

Yakuniy o'yin - bu kelajakdagi mualliflar va xizmat ko'rsatuvchilarning hayotini osonlashtiradigan kod yozish.

Yakuniy o'yin

Boshqa tegishli o'qish materiallari

Toza, yaxshi tuzilgan, o'qilishi oson va parvarish qilinadigan yozuv kodi bilan bog'liq bo'lgan tegishli maqolalar ro'yxati. Agar siz ko'proq o'qishni istasangiz, albatta quyidagilarni tavsiya eting

toza kodni yozish bo'yicha yana bir yaxshi maslahatlar