Thursday, 11 September 2014

CSharpda Abstract class, Interface va Collectionlardan foydalanish


Using Abstract class, Interface, Collections in C#

       Abstract class – bu class ob’yektini yaratib bo’lmaydigan class turi, uni base class sifatida ishlatish mumkin. Abstract classda abstract yoki abstract bo’lmagan metodlar va memberlardan foydalanish mumkin. Abstract classda maydon(field)ni abstract qilib yaratish MUMKIN EMAS, property(get;set;) va metodlarni abstract qilib yaratish MUMKIN.
Masalan:
 public  abstract class MyClass
{
                public abstract string Name{get;set;}      //Mumkin
                public abstract string ColumnName;       //Mumkin emas, chunki bu FIELD
                public abstract void GetValue()              //Mumkin
{
                //…
}
}

Question 1: Abstract classda aniqlangan abstract metod(yoky property) va abstract bo’lmagan metodning(yoki property) qanday farqi bor?

Answer: abstract classdan inheritance olgan classda abstract classdagi abstract metodlar(propertylar) override qilinib qayta aniqlanishi shart. Abstract metod(yoki property) lar Abstract classda faqatgina e’lon qilinadi uning nima ish bajarishi esa Abstract classdan inheritance olgan classda aniqlanadi.

Masalan:

1)      Methods
public abstract class A
{
public string Name;
public abstract string GetName1();//Bu metodni GetName1(){…} kabi aniqlash mumkin emas
public string GetName2()
{
                return “This is GetName2 method’s result”
}
}
public class B:A
{
//Bu yerda A classdagi GetName1 metodi override qlinib qayta aniqlanishi shart chunki u abstract metod, aks holda  //xatolik yuz beradi.
public override string GetName1()
{
                return “This is GetName1() method’s result”;
}
}
2) abstract properieslarni ishlatish:

abstract class A
{
    protected int myNumber;
    public abstract int numbers
    {
        get;
        set;
    }
}
class B: A
{
    // abstract propertylarni Implement qilamiz 
    public override int numbers
    {
        get
        {
            return myNumber;
        }
        set
        {
            myNumber = value;
        }
    }
}

Question 2: Abstract classning interfacedan  farqi ?

Answer: Abstract sinf abstract memberlardan va abstract bo’lmagan memberlardan iborat bo’lishi mumkin, interfaceda esa barcha memberlar abstract bo’lib, har bir child sinfda override qilinishi shart! Ya’ni interfaceda abstract bo'lmagan member yaratib bo’lmaydi.

interface iSampleInterface
{
  //Betta barcha memberlar avtomatik abstract yaratilvotti
  int AddNumbers(int Num1, int Num2);
  int MultiplyNumbers(int Num1, int Num2);
}

Abstract sinfda abstract memberlarni yaratish interfacedagi kabi bir xil effect beradi
Endi quyidagi CODE yordamida abstract class va interfaceni ishlatamiza:

Task: Ishchi (Worker), Programmist(Programmer), O’qituvchi(Teacher) sinflarini ulardagi logika bo’yicha yaratish

Soluation:
1)      Dastlab IBaseWorker interfaceini yaratamiz:

public interface IBaseWorker : IDisposable
    {
        List<string> GetResume(); //Har bir ishchiga mos RESUME
    }

2)      BaseWorker sinfini abstract ko’rinishda yaratamiz(chunki uning ob’yektini yasash mumkin bo’lmasligi lozim):

public abstract class BaseWorker : IBaseWorker
    {
        public BaseWorker()
        {
            BeforeInit();

            //TODO

            AfterInit();
        }

        public Guid Id { get; set; }

        public string FullName { get; set; }
        public string AddinationalInfo { get; set; }
        public string PhoneNumber { get; set; }

        public int Age { get; set; }
        public string WorkExperience { get; set; }
        public double Salary { get; set; }

        public virtual void AfterInit() { }

        public virtual void BeforeInit()
        {
            Id = Guid.NewGuid();//Initdan oldin har bir workerga ID berish
        }
        public abstract List<string> GetResume();
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                //Bu yerda DISPOSE class ob’yekti qilinadi
            }
        }
    }

3)      Programmer sinfini yaratamiz, bu BaseWorkerning “bolasi” bo’lishi lozim:

public class Programmer:BaseWorker
    {
        public string ProgrammingLanguages { get; set; }
        public string DataBases { get; set; }
        public string ProjectsInfo { get; set; }
//Quyida GetResume metodi override qilinyapdi chunki u Base classda abstract //qilib e’lon qilingan
        public override List<string> GetResume()
        {
            var resume = new List<string>();
            resume.Add("Full Name:" + FullName);
            resume.Add("Age:" + Age);
            resume.Add("Phone Number:" + PhoneNumber);
            resume.Add("Learning Programming Languages:"+ProgrammingLanguages);
            resume.Add("Using Data Bases:" + DataBases);
            resume.Add("Succesfully projects:" + ProjectsInfo);
            resume.Add("Work Expriense (Ishlagan joylari):" + WorkExperience);
            return resume;
        }
    }

4)      Teacher sinfini yaratamiz(Bu sinf ham BaseWorker sinfinig “bolasi” sifatida yaratiladi):

public class Teacher:BaseWorker
    {
        public string Specialty { get; set; }//Mutaxasisligi
        public int Category { get; set; } //Toifasi
        public string Degree { get; set; }
        public override List<string> GetResume()
        {
            var resume = new List<string>();
            resume.Add("Full Name:" + FullName);
            resume.Add("Age:" + Age);
            resume.Add("Phone Number:" + PhoneNumber);
            resume.Add("Specialty:" + Specialty);
            resume.Add("Category:" + Category);
            resume.Add("Degree:" + Degree);
            resume.Add("Work Expriense (Ishlagan joylari):" + WorkExperience);
            return resume;
        }
    }

5)      Programmers kolleksiya sinfini yaratamiz, bu sinf ob’yektida barcha Programmer sinfi ob’yektlari saqlanadi:

public class Programmers:List<Programmer>
   {
   }

6)      Teachers kolleksiya sinfini yaratamiz:
public class Teachers:List<Teacher>
   {
   }

Yuqorida yaratilgan sinflardan foydalanish:

namespace AbstractClassInterfaceCollectionTestByMansur
{
    class Program
    {
        static void Main(string[] args)
        {
            var teachers=GetTeachers();
            var programmers = GetProgrammers();
            var resumes = new List<string>();
            Console.WriteLine("> Programmers resume:");
            programmers.ForEach(f =>
                {
                    f.GetResume().ForEach(r =>
                        Console.WriteLine(r));
                    Console.WriteLine("_".PadRight(50,'_'));
                });
            Console.WriteLine("> Teachers resume:");
            teachers.ForEach(f =>
            {
                f.GetResume().ForEach(r =>
                    Console.WriteLine(r));
                Console.WriteLine("_".PadRight(50, '_'));
            });
           
            Console.ReadLine();
          }

        private static Teachers GetTeachers()
        {
            var teachers = new Teachers();
            teachers.Add(new Teacher()
            {
                FullName = "Qosimov A.",
                Degree = "dotsent",
                Category = 1,
                AddinationalInfo = "Buxoro city",
                Salary = 2000,
                Specialty = "Mathmatics",
                WorkExperience = "year1 - year2. Work exp.1; year2-year3. Work exp2;"
            });
            teachers.Add(new Teacher()
            {
                FullName = "Axmedov H.",
                Degree = "dotsent",
                Category = 1,
                AddinationalInfo = "Jondor city",
                Salary = 1500,
                Specialty = "Mathmatics",
                WorkExperience = "year1 - year2. Work exp.1; year2-year3. Work exp2;"
            });
            return teachers;
        }
        private static Programmers GetProgrammers()
        {
            var programmers = new Programmers();
            programmers.Add(new Programmer()
            {
                FullName = "Hayotov Hayot Rahmonovich",
                Age = 28,
                DataBases = "MS Sql 2005,2008,2012, Oracle, Postgres",
                ProgrammingLanguages ="C#, Java",
                Salary =1500000,
                WorkExperience = "2013-2014, Tashkent West Minster University; 2014 - ..., Sunet;",
                ProjectsInfo = "Document oborot, Buxgalteriya",
                PhoneNumber = "123-45-67",
                AddinationalInfo = "Lives in Uzb.,Tashkent"
            });
            programmers.Add(new Programmer()
            {
                FullName = "Eshonqulov Hamza",
                Age = 28,
                DataBases = "MS Sql 2005,2008,2012",
                ProgrammingLanguages = "C#, Java, Pascal",
                Salary = 1000000,
                WorkExperience = "2010-..., Bukhara State University;",
                ProjectsInfo = "Avtomatlashtirilgan Ijro intizomi tizimi, Buxgalteriya",
                PhoneNumber = "123-45-67",
                AddinationalInfo = "Lives in Uzb.,Bukhara city"
            });
            return programmers;
        }
    }

}

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())
{
    // ...
}

Ifloslangan havoda yugurish bilan shug’ullanish: xavflar, maslahatlar va Toshkentdagi vaziyat

  Bugun(19.11.2025) Toshkentning havo ifloslanish darajasi — AQI 200–250oralig’ida bo’ldi Yugurish paytida o‘pka orqali o‘tadigan havo hajm...