Saturday, 6 September 2014

C#. Nomlanishlar



C# Coding Standards 

            Dasturlashni o’rganishni boshlagandan keyin biron masalani yechishga qaratilgan dasturlarni qilish mumkin. Lekin kodni to’g’ri yo’l bilan yozish uchun ko’p ko’nikma va bilim talab qilinadi. Ko’pchilik programmistlar xatosiz ishlaydigan kod yoza olishadi lekin uni “yaxshi kod” deb aytish qiyn. “yaxshi kod” – sanat asariga o’xshaydi va u programmistdan ko’proq ko’nikma, mantiqiy fikrlash,  YAXSHI USTOZ va albatta tinimsiz o’qib o’rganish talab qiladi. Har bir programmistlar komandasi uchun “yaxshi kod” tushunchasi turlicha bo’lishi mumkin.
                Eng avvalo “yaxshi kod”da minimal ishonchlilik, tushunarli, lozim bo’lganda oson qo’shimcha kiritish yoki to’girlash mumkin bo’lishi kerak.
Ixtiyoriy proyekt qilinishida eng kamida quyidagi 3ta prinsipga amal qilininadi:
1.       Ekspert baholash - Proyektdagi har bir kod boshqa kishi(senior programmist)  tamonidan test qilinishi, uning kodlash standartlariga mos kelish yoki kelmasligini aniqlash, qo’yilgan talablarga javob berish yoki bermasligini aniqlash.
2.       Arxitektor baholashi – komonda arxitektori proyektdagi asosiy modellarni ko’rib chiqishi lozim
3.       Komandadagilarning fikri – proyektdagi  kodlarning lozim bo’lgan qismini komondadagilar bilan tahlil qilish, fikr almashinish

Dasturlashni o'rganishni kodlash standartini o’rganishdan boshlashlagan maqsadga muvofiqdir.

CSharpda kodlash standarti qisman quyidagilardan iborat:
       Nomlanishlarda odatda Pascal Casing(1-harfi bosh har bilan va har bir qism so’z bosh harf bilan) va Camel Casing(1-harfi kichik harf bilan boshlanadi va har bir qism so’z bosh harf bilan)lardan foydalanish mumkin.
Pascal Casing nomlanishlarga misollar: BackGroundColor, TotalsCount, ConnectionString, GetPersons, GetQueryScript;
Camel Casing nomlanishlarga misollar: backGroundColor, totalsCount, connetionString, getPersons, getQueryScript;
CSharpda Nomlanishlar quyidagi asosiy qoidalar yordamida hosil qilinadi:
1.       O’zgaruvchilarni va metod parametrlarini e’lon qilishda doimo Camel Case dan foydalaniladi.
Masalan:
string fisrtName;
int rowsCount;
void GetAxisName(string column)
{
                …
}
2.       Propertilarni(maydon va metodning birgalikdagi ko’rinishi (get, set))  e’lon qilishda Pascal Casedan foydalaniladi
Masalan:
public int Month
{
      get {…}
      set {…}
}
3.       Konstanta o’zgaruvchilarni e’lon qilishda doimo o’zgaruvchi nomidagi harflar barchasi  bosh harf(Upper Case) bo’lishi lozim
4.       Nomlanish hech qachon raqam bilan boshlanmasligi lozim (Odatdan kompilyator bunga yo'l qo'ymaydi ham)
5.       Class, property, metod va hokozolarni nomlashda nom tushinarli bo’lishi losim. Misol uchun class nomi “P” o’rnida “Person” kabi
6.       .Net Freamwork ishlatadigan nomlanishlarni nomlashda ishlatmaslik kerak
7.       “_” suffikisini imkon qadar ishlatmaslik
8.       Interface nomi oldida doimo “I” ni ishlatish lozim. Masalan IDosposabel, IDataMining, IRawData
9.       Exception sinflari nomidan keyin doimo “Exception” suffiksini qo’shish lozim
10.   Sinf nomini uning ichidagi properti nomlari oldidan qo’shmaslik lozim. Masalan Person sinfida PersonFirstName emas FirstName deb aniqlash yetarli
11.   Boolean(mantiqiy) propertilar nomlari oldida doimo “Is”,”Has” yoki “Can” kabi suffikslarni ishlatish lozim. Masalan, IsVisible, HasChildren, HasParent, IsActive, CanFocus, CanExecute
12.   Doimo sinf saqlanayotgan fayl nomi sinf nomiga moas bo’lishi kerak
13.   Fayl nomlanishlarida Pascal Caseni ishlatish lozim
14.   Controllarni nomlashda uning nomi oldidan Control tipini bildiruvchi 3ta harfli qisqartma qo’yish maqsadga muvofiq
Masalan Label –lbl, TextBox –txt, DataGrid – dtg, Button – btn, ImageButton – imb, HyperLink – hlk, DropDownList – ddl, CheckBox – chk, RadioButton – rdo, Image – img, Panel – pnl va hokozo
15.   Sinfni nomlashda Pascal Case dan foydalaniladi
16.   Metod nomlanishida – Pascal Case ishlatiladi, metod nomi metod nima qilishini anglatishi lozim. Masalan Jadvallar sonini aniqlash uchun ishlatiladigan metodni GetCount emas GetTablesCount kabi nomlash to'g'riroq bo'ladi
17.   O’zgaruvchilar nomlari doimo ma’noga ega va tushinarli bo’lishi lozim, ya’ni i, j, k, a, b, … kabi oddiy belgi nomlardan foydalanmaslik kerak. (takrorlanish operatorlarida odatda ko'pchilik i,k,j,a,b,... larni ko'p ishlatishadi)
18.   Boshqa member o’zgaruvchilar tomonidan qiymati o’zgartirilishi mumkin bo’lgan local o’zgaruvchilar nomlari oldidan “_” perifiksini qo’shish lozim
19.   Koddagi bloklarni ajratishda probel emas TABni ishlatish lozim
20.   Har bir metodga Comment(Izoh) yozish lozim
21.   Koddagi kod guruhlarini #region bilan ajratish lozim
Maslan

22.   Imkon qadar metodlarni qismlarga ajratish lozim, 1ta metod 25qatordan o’tmasligi kerak
23.   Metod 1ta ishni bajarishga mo’ljallangan bo’lishi lozim
Maslan
To’g’ri yaratilgan metodlar:
       void SaveAddress ( string address )
       {
              // adressni saqlash.
              // ...
       }
      
       void SendEmail ( string address, string email )
       {
              // address o’zgarganligi haqida email jo’natish.
              // ...
        }
Xato aniqlangan metodlar:
      void SaveAddress ( string address, string email )
       {
              // 1-ISH.
              // adressni saqlash.
              // ...

              // 2-ISH.
              // address o’zgarganligi haqida email jo’natish.
              // ...
       }

24.   Imkon qadar System namespaceda aniqlangan tiplardan foydalanish
Masalan int (int16,int32,int64 lar emas), string (String emas), object (Object emas)
25.   Kodning hardcode bo’lmasligiga harakat qilish (sonlarni fayl yuqori qismida const qilib e’lon qilish, stringlarni resurse faylidan olib kelish lozim)
26.   Stringlarni taqqoslashdan oldin Lowercase yoki UpperCasega o’girish
27.   “” ning o’rnida String.Empty dan foydalanish
28.   Enum dan foydalanganda string bo’yicha tekshirmaslik
Maslan,
enum MailType
       {
              Html,
              PlainText,
              Attachment
       }
To’g’ri:

       void SendMail (string message, MailType mailType)
       {
              switch ( mailType )
              {
                     case MailType.Html:
                           // ... biron amallar bajarish ...
                           break;
                     case MailType.PlainText:
                           // ... biron amallar bajarish ...
                           break;
                     case MailType.Attachment:
                           // ... biron amallar bajarish ...
                           break;
                     default:
                           // ... biron amallar bajarish ...
                           break;
              }
       }


Noto’gri:

       void SendMail (string message, string mailType)
       {
              switch ( mailType )
              {
                     case "Html":
                           // ... biron amallar bajarish ...
                           break;
                     case "PlainText":
                           // ... biron amallar bajarish ...
                           break;
                     case "Attachment":
                           // ... biron amallar bajarish ...
                           break;
                     default:
                           // ... biron amallar bajarish ...
                           break;
              }
       }

29.   Bironta Control eventidagi metodni eventni chaqirib ishlatmaslik lozim
Masalan Button controli uchun click eventidagi metodni  programma orqali buttonni click qilib chaqirmaslik lozim
30.   Dastur joylashgan yo’lni kodda ishlatishda hardcode qimaslik (var appPath = Environment.CurrentDirectory; ni ishlatish kerak)
31.   Foydalanuvchiga Xatoliklar haqida xabar berish va bu xabar xatolikni bartaraf qilishda tushinarli bo’lishi lozim.
32.   1ta oddiy faylda bordan ortiq classni aniqlamaslik lozim
33.   Juda ko’p parametrli metod yaratmaslik lozim, agar metodda 4-5tadan ko’p parameter bo’lsa uni class yordamida aniqlash lozim
34.   Collection qaytaruvchi metodlarda null o’rnida empty collection qaytarish lozim, chunki nullga tekshirishdan ko’ra count() tezroq ishlaydi
35.   Proyektda ichma-ich papkalarni imkon qadar ishlatmaslik
36.   Agar kodda database connection, socket, filestreamlar ishlatilgan bo’lsa doimo finally qismida close() qilish lozim
37.   Satrlarni birlashtirishda doimo StringBuilderni ishlatish lozim. Masalan var queryScript= String.Format("select {0} from {1} where {2}",totalFunctionScript,tableName,whereScript);
38.   Commentlar qayerda zarur bo’lsa o’sha yerga comment yozish, koddagi har bir qatorga yoki har bir e’lon qilingan o’zgaruvchiga comment yozish shart emas
Bundan tashqari agar class ko’p resursdan foydalanishga mo’ljallangan bo’lsa unda IDisposable interfeysidan foydalanish lozim, uning Dipose() metodi yordamida class ob’yekti ishlatilib bo’lingach uni tozalash mumkin. (IDisposabe interfaseidan foydalanib yaratilgan class ob’yektini using() {} bloke yordamida ishlatganda Dispose() metodi avtomatik chaqiriladi)
Maslan
using (CubeSchemaDataSource cubeSchemaDataSource = DataSource.GetCubeSchema())
{
    // ...
}

No comments:

Post a Comment

Note: only a member of this blog may post a comment.

Tasks and Threads

  Differences Between Task And Thread: 1. The Thread class is used for creating and manipulating a thread in Windows.  2. A Task represents ...