Galin Iliev

Software Architecture & Development

Èíèöèàëèçèðàíå íà îáåêòè è êîëåêöèè

Ïðåäè äà çàïî÷íåì äà èçïîëçâàìå îáåêòèòå òðÿáâà äà ñúçäàäåì èíñòàíöèÿ è äà ãè èíèöèàëèçèðàìå. Ðàçáèðà ñå, ÷å îò òîâà íÿìà êàê äà èçáÿãàìå àêî èñêàìå äà ñëåäâàìå äîáúð ñòèë è äà ñúçäàäåì ôóíêöèîíèðàùî ïðèëîæåíèå.

Äà ïðèåìåì, ÷å ñìå íàïðàâèëè äèçàéíà íà êëàñîâåòå, ñ êîèòî ùå ðàáîòè ïðèëîæåíèåòî, íàïèñàëè ñìå ÷ëåí ïðîìåíëèâèòå, îáâèëè ñìå ãè â ñâîéñòâà (properties) ñ ïîäõîäÿùè get è set ìåòîäè.

Íåêà äà ðàçãëåäàìå äåêëàðàöèÿòà íà ñëåäíèÿò êëàñ

public class Customer{

    private int id;

    public int Id{

        get { return id; }

        set { id = value; }

    }

  

    private string name;

    public string Name{

        get { return name; }

        set { name = value; }

    }

  

    private string country;

    public string Country{

        get { return country; }

        set { country = value; }

    }

 

    private string city;

    public string City{

          get { return city; }

          set { city = value; }

    }

  

    private string address;

    public string Address{

        get { return address; }

        set { address = value; }

    }

  

    public Customer() { }

  

}

  

 òîçè êëàñ ñà äåêëàðèðàíè ïåò ÷ëåí-ïðîìåíëèâè ñúñ ñúîòâåòíèòå èì ñâîéñòâà. Êëàñúò âå÷å ìîæå äà áúäå èçïîëâàí â ïðèëîæåíèåòî, íî èíèöèàëèçàöÿòà ìó íÿìà äà å ìíîãî óäîáíà. Çà äà çàäàäåì ñòîéíîñòè íà âñè÷êè ñâîéñòâà òðÿáâà äà:

·         Ñúçäàäåì èíñòàíöèÿ íà êëàñà èçâèêâàéêè êîíñòðóêòóðà ìó è

·         Ïðèñâîèì ñòîéíîñò íà âñÿêî ñâîéñòâî ïîîòäåëíî.

Òîâà öÿëîòî äåéñòâèå ñ òîçè êîíñòðóêòîð ùå çàåìå 6 ðåäà è íå å ìíîãî åëåãàíòíî ðåøåíèå ( îñîáåíî ñ íîâîâúâåäåíèÿòà â C# 3.0 ). Êàòî âúçìîæíîñò ìîæå äà ðàçøèðèì êîíñòðóêòîðà äà ïðèåìà êàòî ïàðàìåòðè ñòîéíîñòèòå íà ñâîéñòâàòà, êîèòî èñêàìå äà çàäàäåì ïðè ñúçäàâàíåòî íà îáåêòà. Íå òðÿáâà äà çàáðàâÿìå îñíîâíèòå ïðåäíàçíà÷åíèÿ íà êîíñòðóêòîðà:

·         Ñúçäàâà èíñòàíöèÿ íà îáåêòà, êàòî èíèöèàëèçèðà ïðîìåíëèâè è ãè ïîäãîòâÿ çà ðàáîòà.

·         Ïðèåìà êàòî ïàðàìåòðè ìèíèìóì èíôîðìàöèÿ, êîÿòî å íåîáõîäèìà çà ñúçäàâàíå íà îáåêòà. Íàïðèìåð çà ïðè ñúçäàâàíå íà îáåêò îò òèï Customer ìîæå ïîäàäåì ID èëè Name, â çàâèñèìîñò îò èçèñêâàíèÿòà êúì òîçè áèçíåñ îáåêò. Íÿìà ëîãèêà, îáà÷å, íàïèøåì êîíñòðóêòîð, êîéòà çà äà ïðèåìà êàòî ïàðàìåòúð ñàìî ñòîéíîñò çà ñâîéñòâîòî Address, òúé êàòî òî íå ìîæå äà ñëóæè çà óíèêàëíî õàðàêòåðèçèðàíå íà îáåêòà. (Ðàçáèðà èìà è èçêëþ÷åíèÿ, êîãàòî ñå íàëàãà èçïîëçâàíåòî íà ïîäîáåí ïîäõîä, íî òðÿáâà äà ñå èçïîëçâà âíèìàòåëíî)

Ïîñî÷åíèÿò ïðèìåð å ñðàâíèòåëíî ìàëúê, íî àêî ðàçãëåäàìå êëàñ ñúñ 20 ñâîéñòâà è ïî-ñëîæíà áèçíåñ ëîãèêà ùå âèäèì, ÷å òðóäíî ìîæå äà ñå ñúçäàäàò êîíñòðóêòîðè, êîèòî äà îáõâàùàò âñè÷êè âúçìîæíè íà÷èíè íà èíèöèàëèçàöèÿ.

Óñëîæíåíèå, êîåòî íîñÿò ìíîæåñòâîòî êîíñòðóêòîðè å, ÷å âñåêè åäèí îò òÿõ ñúäúðæà ëîãèêà ïî èíèöèàëèçèðàíå íà îáåêòà, êîÿòî å ðàçëè÷íà â çàâèñèìîñò îò ïàðàìåòðèòå, íî è ìíîãî ïîäîáíà, çàùîòî ñòàâà âúïðîñ çà åäèí è ñúùè òèï. Òîâà ìîæå äà äîâåòå äî ñëîæíî íàâúðçâàíå íà êîíñòðóêòîðèòå è ïîâòàðÿíå íà ïðîãðàìåí êîä, êîåòî êàêòî çíàåì å èíäèêàöèÿ íà ëîøî ïîñòðîÿâàíå íà êîäà è ëîø äèçàéí.

Òî÷íî ïî òåçè ïðè÷èíè íå ìîæå íàïúëíî äà èçáÿãàìå îò øàáëîíà:

Customer cust = new Customer();

cust.Id = 1;

cust.Name = "John Atanasov";

Òîçè øàáëîí íîñè îùå ïî-ãîëÿìî óñëîæíåíèå, êîãàòî òðÿáâà äà èíèöèàëèçèðàìå êîëåêöèÿ îò òàêèâà îáåêòè.  òàêúâ ñëó÷àé ñëåäâàò äúëãè è ìîíîòîííè êîíñòðóêöèè êàòî ãîðíèÿò ïðèìåð.

Çà äà ðåøèì òîçè ïðîáëåì ìîæå äà èçïîëçâàìå íîâèòå èçðàçè çà èíèöèàëèçèðàíå íà îáåêòè â C# 3.0. Òàêà èìàìå âúçìîæíîñò çà ñúçäàäåì îáåêò è äà èíèöèàëèçèðàìå ñâîéñòâàòà ìó ñúñ ñëåäíèÿò êîä:

Customer cust = new Customer { Id=1, Name="John Atanasov" };

Íåêà äà âèäèì êàêâî ñòàâà çàä êóëèñèòå. Çà öåëòà ùå èçïîëçâàìå ïîïóëÿðíèÿò äåêîìïèëàòîð Reflector, çà äà âèäèì êîäà äî êîéòî ñå êîìïèëèðà ïðèëîæåíèåòî. ( Êîìïèëàòîðèòå íà .NET åçèöèòå êîìïèëèðàò êîäà äî Common Intermediate Language – CIL, à èçïîëçâà CIL, çà äà ãåíåðèðà C# êîä).

Çà ïîñëåäíèÿò îáåêò êîìïèëàòîðà (îò LINQ Preview (May 2006) ) å ãåíåðèðàë ñëåäíèÿò êîä:

Program.Customer customer2 = new Program.Customer();

customer2.Id = 1;

customer2.Name = "John Atanasov";

Program.Customer customer1 = customer2;

Êàêòî ñå âèæäà êîìïèëàòîðà ñúçäàâà âðåìåíåí îáåêò ,÷èèòî ñâîéñòâà ñå èíèöèàëèçèðàò ïî ñòàíäàðòíèÿò íà÷èí è ïîñëå âðåìåííèÿò îáåêò ñå ïðèñâîÿâà íà îáåêòà, êîéòî ñìå äåôèíèðàíè ( ïîñëåäíîòî áè ñå âèäÿëî ïðè èçïîëçâàíå íà îáåêòà). Îáúðíåòå âíèìàíèå, ÷å èìåíàòà íà ïðîìåíëèâèòå íå îòãîâàðÿò íà äåôèíèðàíèòå â ñîðñ êîäà, íî òîâà å åäèí îò íåäîñòàòúöèòå íà äåêîìïèëàòîðèòå.

Îñâåí, ÷å å ñ ïî-ìàëêî êîä ïîñòèãàìå ñúùèÿò ðåçóëòàò êàêâà å ïðàêòè÷åñêàòà ïîëçà îò òàçè êîíñòðóêöèÿ?

Íàé-ãîëÿìîòî ïðåäèìñòâî ïðè òîçè íà÷èí íà èíèöèàëèçèðàíå íà îáåêòèòå ñå âèæäà ïðè èíèöèàëèçàöèÿ íà êîëåêöèè.

List<Customer> customers = new List<Customer>{

    new Customer { Id=1, Name="John Atanasov" },

    new Customer { Id=2, Name="Galin Iliev" },

    new Customer { Id=3, Name="Bill Gates", Country="USA",                 Address="Seattle" }
   };

Òàêà åëåãàíòíî ìîæå äà ñå èíèöèàëèçèðà êîëåêöèÿ îò îáåêòè. Ìîæå äà ñè ïðåäñòàâÿòå êàê áè èçãëåæäàë êîäà çà èíèöèàëèçàöèÿ ïî ñòàíäàðòíèÿ íà÷èí (áåç äà ñå ïðîìåíÿ äåêëàðàöèÿòà íà êëàñà Customer ).

Îáúðíåòå âíèìàíèå íà ïîñëåäíèÿ îáåêò îò òèï Customer - ïðè íåãî ñà çàäàäåíè ñòîéíîñòè íà äðóãè äâå äîïúëíèòåëíè ñâîéñòâà. Òîâà ïîêàçâà,÷å ìîæå ïðîèçâîëíî äà èçáèðàìå íà êîè ñâîéñòâà äà çàäàâàìå ñòîéíîñòè.

 

Ñëåäâàùà ÷àñò: Ïîäðàçáèðàíå íà òèïà íà ïðîìåíëèâèòå

Content