Өгөгдлийн төрлүүд

Юуны өмнө ОХП-ын хэлүүд болон C# хэлэнд байдаг тодорхой суурь ухагдхууны талаар ойлголтыг авах хэрэгтэй. ОХП-ын хэлэнд бараг бүх обьектууд өгөгдлийн төрлүүд байдаг.

  • Хувьсагч гэдэг нь төрөл бүрийн утгуудыг авч болдог дараа нь тэдгээрийг өөр төрлийн утгаар өөрчилж болдог хэлний элемент юм. Иймээс түүнийг хувьсагч гэж нэрлэдэг. Тогтмол утга гэж бас байдаг. Тогтмол утга нь хувьсагчаас ялгаатай нь өөрийн утгаа компиляц хийх үед ганц удаа аваад тухайн утгаа дахин өөрчилдөггүй. Хувьсагч гэдгийг ямар нэгэн зүйлийг эсхүл тухайн зүйл хаана байгааг заах мэдээллийг хадгалж болдог хайрцагтай зүйрлэж болно.
  • Өгөгдлийн төрөл гэдгийг хувьсагч авч болох утгуудын олонлог гэж ойлгоно. Хэрвээ бид хувьсагчийг бүхэл тоон төрлийнх гэж заавал түүнд зөвхөн бүхэл тоог эсхүл логик төрлийнх гэвэл зөвхөн логик утгыг авна гэсэн үг. Өөрөөр хэлбэл хувьсагч өөрийн төрөлд багтах утгуудын олонлогоос л утгаа авах ёстой гэсэн үг.
  • Обьект гэдэг нь хувьсагч авсан тодорхой утга эсхүл тухайн утгыг авах холбоосын утгыг хувьсагчид олгосонг хэлнэ. Энэ ойлголт нь ОХП-ын үндсэн гол ойлголт байдаг.

Өгөгдлүүдийн төрлүүдийн жишээ.

Дээрх зурагт өгөгдлүүдийн энгийн төрлүүдийн жишээг харууллаа. Хувьсагчид төрөл заан өгснөөр бид түүний авч болох утгуудын олонлогийг өгч байгаа юм. Хэрвээ хувьсагчид бүхэл тоон төрөл өгсөн бол бид түүнд бутархай тоо эсхүл логик утгыг олгож болохгүй зөвхөн бүхэл тоон утгыг л олгох ёстой. Үүнийг "төрлийн хатуу хяналт" гэж нэрлэдэг. C#, JAVA гэх мэт хэлүүд хатуу төрөлжсөн хэлүүдэд ордог. Та програмын коддоо хувьсагчийг ашиглахаасаа өмнө түүний төрлийг заан зарласан байх шаардлагатай. Програмчлалын зарим хэлүүд жишээ нь PHP хувьсагчийн төрлийг заавал заахыг шаарддаггүй.

Дадлагын ажил.

Програмчлалын хэлийг сурах хамгийн сайн арга бол практик. Бид практикийн ажилдаа Visual Studio 2015 -ын C# -ийн Console Application төрлийн төслийг ашиглана. Эхлэн суралцаж байгаа хүмүүст ийм төрлийн програм зохиох нь энгийн. Ийм програм зохиохын тулд Visual Studio боловсруулалтын орчингоо нээгээд File->New->Project гэж ороод нээгдэх цонхны зүүн талын самбарт Visual C# -ийн Windows сонголтыг хийгээд дунд самбараас Console Application төрлийг сонгоорой.

Visual Studio боловсруулалтын орчинг компьютерт суулгахад Visual C# -аас гадна Visual Basic, Visual F#, Visual C++ зэрэг хэлүүдийг цуг суулгадаг. Иймээс самбарын зүүн хэсэгт хэлний сонголтоо хийхээ мартуузай. Name талбарт өгсөн нэртэй ижилхэн Solution үүсгэнэ. Нэг Solution буюу шийдэл .NET фреймворк дэмжих өөр өөр хэл дээр хүртэл бичигдсэн олон төслийг агуулж болдог. Програмын тохиргоонуудаа хийж дуусаад OK товчийг дарахад Visual Studio орчин Console Application төрлийн төслийг үүсгэнэ. Төсөлд Program нэртэй классыг агуулсан доорх агуулга бүхий Program.cs гэсэн файлыг автоматаар оруулан ирнэ.

using System;

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Program класс Main гэсэн ганц аргатай бөгөөд энэ нь програмын эхлэлийн цэг юм. Програмын хувьд Main нэртэй статик арга ганцхан байж болно. Бусад програмын хэлнүүдийн адилаар C# -д өөрийн өгөгдлийн төрлийг зарлаж болно. Үүний тулд төсөлд _age гэсэн бүхэл тоон талбар бүхий Student гэсэн өгөгдлийн шинэ төрлийг зарлан өгье.

    public struct Student
    {
        public int _age;
    }

Өгөгдлийн төрлийг struct гэсэн түлхүүр үг зааж байгаа юм. Энэ нь бид утга олгогдох өгөгдлийн шинэ төрлийг үүсгэж байгааг компиляторт мэдэгдэнэ. Талбарын нэр доогуур зураасаар эхлэж байгаад анхаарна уу. Бид хичээлдээ "Унгар" тэмдэглэгээ гэж нэрлэдэг бичлэгийн дүрмийг ашиглана. Дүрмийн дагуу төрлийн талбарын нэрүүдийг доогуур зураасаар эхлээд араас нь жижиг үсгээр бичдэг. Ингэснээр төрлийн талбарыг локал хувьсагч, шинжүүдээс ялгахад амар болгоно. "Унгар" тэмдэглэгээнээс өөр програмын кодыг бичих "Camel" гэх мэтийн тэмдэглэгээнүүд бас байдаг. Код бичих аль нэгэн дүрмийг анхнаасаа хэвшил болгон ашиглаж сурах нь чухал. Одоо үүсгэсэн шинэ төрлөө програмдаа ашиглая. Үүний тулд эхлээд төрөлд тохирох хувьсагчийг

Student student = new Student();    

гэж үүсгэн өгнө. Дээрх мөр Student төрлийн student нэртэй хувьсагчийг үүсгэнэ. Бид хувьсагчийн нэрийг төрлийн нэртэй ижилхэнээр гэхдээ жижиг үсгээр өгсөн. C# -хэл том жижиг үсгийн ялгадаг учраас үүнийг алдаа гэж үзэхгүй. new Student(); хэсэг төрлийн байгуулагчийг дуудан түүний хувийг үүсгэн өгнө. Бид төрлийг үүсгэхдээ түүний байгуулагч аргыг бичин өгөөгүй хэдий ч C# -ийн бүх төрлүүдэд компилятор анхдагч байгуулагч аргыг автоматаар хэрэгжүүлэн өгдөг. Ийм болохоор дээрх мөр хувьсагчийг зарлаад зогсохгүй түүнд анхны утгыг олгох ажиллагааг хийж байгаа юм. Student төрлийн хувьсагч үүсгэсэн тул одоо түүний гишүүдэд хандах боломжтой болсон. Манай төрлийн _age гэсэн бүхэл тоон ганцхан талбарт доорх командаар утга олгоё.

student._age = 20;  

Шинэ төрлийг ингэж ашиглана. Энэ хүртэл бичсэн кодыг үзүүлбэл

using System;

namespace Lesson1
{
    public struct Student
    {
        public int _age;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student._age = 20;
        }
    }
}

байгаа. Төрлийг програмд хэрхэн ашиглахыг доорх кодоос харцгаая.

// ...
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student._age = 20;

            Calculate(student);

            Console.WriteLine(student._age);
            Console.ReadLine();
        }

        static void Calculate(Student student)
        {
            student._age += 1;
        }
    }
// ...

Жишээнд Student төрлийн хувийг Calculate аргад параметрээр дамжуулсан байгаа. Calculate арга Student төрлийн нэг параметрийг хүлээн аваад түүний _age талбарын утгыг нэгээр нэмнэ. Програмын кодоос харвал бид эхлээд Student төрлийн student хувийг үүсгээд түүний _age талбарт 20 гэсэн утга олгоод дараа нь хувийг Calculate аргад дамжуулан талбарын утгыг нэгээр нэмээд үүний дараа талбарын утгыг дэлгэцэнд үзүүлэх болно. Энд бид 21 гэсэн утгыг хүлээн авна гэж бодож байгаа ч програмаа ажлуулбал

үр дүнг авах болно. Туршаад үзээрэй. Яагаад ийм үр дүнг авах болов. Програмын кодод багахан засвар оруулъя. Төрлийг зарлахдаа өгсөн struct түлхүүр үгийг class болгон өөрчлөе.

    public class Student
    {
        public int _age;
    }

Ингэснээр бид Student бүтцээр биш Student классаар тодорхойлогдсон өгөгдлийн төрлийг зарлаж байгаа юм. Програмаа дахин ажлуулбал

бидний хүлээж байсан үр дүнд хүрлээ. Ийм үр дүнд хэрхэн хүрснийг одоо тайлбарлая. Учир нь C# -хэлэнд стандарт болон байж болох бүх өгөгдлийн төрлүүд утгаар өгөгдөх өгөгдлийн төрлүүд, холбоосоор өгөгдөх өгөгдлийн төрлүүд гэсэн хоёр хэсэгт хуваагддаг. Бид жишээндээ Student төрлийг struct түлхүүр үгээр тодорхойлоход утгаар өгөгдөх харин class түлхүүр үгээр тодорхойлоход холбоосоор өгөгдөх өгөгдлийн төрлүүдийг үүсгэж байгаа юм.

Эдгээрийн ялгааг тайлбарлая. Ерөнхийдээ манай програмыг биелүүлэхэд ашиглагдах компьютерын санах ойг хоёр хэсэгт хуваан үзэж болно. Эхний хэсгийг "Стек" гэх бөгөөд 1 орчим мегабайт хэмжээний багахан хэмжээний санах ойг эзэлдэг. Програм ажиллагаандаа энэ хэсгийг хамгийн эрчимтэй ашигладаг. Хоёрдугаар хэсгийг "Удирдлагатай багц" гэж нэрлэнэ. Онолын хувьд энэ хэсэг компьютерын санах ойн боломжит бүх сул хэсгийг ашиглаж болох ба том обьектууд эсхүл хэмжээ нь тодорхойгүй обьектуудыг хадгалах зориулалттай. C# -хэлний утгаар өгөгдөх бүх төрлүүд "Стек"-д хадгалагдана. Ийм төрлийн хувьсагч, структурыг ямарч аргад параметрээр дамжуулахад стект байгаа төрлийг хуулбарладаг тул бид Main аргад student хувийг үүсгээд _age талбарт 20 утга олгоод хувийг Calculate аргад дамжуулсан хэдий ч үндсэн аргад үүсгэсэн хувь дамжигдахгүй харин түүний хуулбарыг үүсгэсэн болохоор програмын үр дүн 20 гэж гарч байгаа юм. Өөрөөр хэлбэл Main аргын student хувийн _age талбарт ямарч өөрчлөлт орохгүй. Үүнийг шалгахын тулд програмдаа төрлийг struct түлхүүр үгээр үүсгэсэн хэвээр үлдээгээд Calculate аргад _age талбарын утгыг дэлгэцэнд бичих командыг өгвөл 21, 20 гэсэн үр дүнг харна. C# -хэлэнд утгаар өгөгдөх төрлүүд олон байдаггүй ч эдгээрийг сайн мэдэж байх хэрэгтэй.
Харин холбоосоор өгөгдөх өгөгдлийн төрлүүдийн хувьд асуудал өөр. Бид ямарч нэгэн class -ийг үүсгэхэд тэр нь үнэн хэрэгтээ "Удирдлагатай багц" -д үүсгэгдэнэ. Харин "Стек" -т байрлах class -ийн хувь болох хувьсагчид тухайн обьектын холбоос л зөвхөн агуулагдана. Одоо бид энэ хувьсагчийг аргад параметр хэлбэрээр дамжуулан өгвөл бас л хуулбар үүсэх хэдий ч обьектын хуулбар үүсэхгүй харин түүний холбоосын хуулбар үүснэ. Харин холбоосууд "Удирдлагатай багц" -д байгаа нэг ижил обьектын холбоос учраас Calculate аргад _age талбарын утгыг өөрчилнө гэдэг нь "Удирдлагатай багц" -д байгаа обьектын талбарын утгыг өөрчилж байгаа хэрэг юм. Иймээс бид Student төрлийг class түлхүүр үгээр тодорхойлоход хүлээж байсан үр дүндээ хүрсэн. Үүнийг сайн ойлгон аваарай.
C# -хэлний өгөгдлийн бүх төрлүүд утгаар өгөгдөх, холбоосоор өгөгдөх гэж хуваагдахаас гадна энгийн ба энгийн бус өгөгдлийн төрлүүдэд бас хуваагдана. Үүнийг ойлгохын тулд доорх жишээг харцгаая.

   int myVar = 250;
   Student student = new Student();

Эхний мөрөөр бүхэл тоон төрлийн myVar хувьсагч зарлаад түүнд 250 гэсэн утга олгосон. Харин 2-р мөрөөр Student төрлийн student нэртэй хувьсагчийг new түлхүүр үгийг ашиглан үүсгээд төрлийн байгуулагчаар анхны утгыг олгож байгаа. .NET фреймворкийн компилятор new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр 1-р мөрөөр үзүүлсэнтэй адилаар хэсэг өгөгдлийн төрлийг зарлахыг дэмждэг. Гэхдээ 1-р мөрөөр зарлагдаж буй int төрлийн myVar хувьсагчийн цаана үнэндээ бол .NET фреймворкт стандартаар байдаг утгаар олгогдох struct төрлийн int32 төрөл байдаг. Иймээс манай кодын 1-р мөр доорх кодтой ижилхэн юм.

    Int32 myVar = new Int32();
    myVar = 250;

Хувьсагчийг ийм бичлэгээр зарлах нь ажиллагаа ихтэй учраас програмын кодыг хураангуйлах, ихээр ашигладаг төрлүүдийн өгөгдлийг удирдах ажиллагааг хөнгөн байлгах үүднээс энгийн төрлүүдийг оруулсан. new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр зарлаж болох төрлүүдийг энгийн төрлүүд гэж нэрлэдэг. C# -д ашигладаг өгөгдлийн энгийн төрлүүд ба тэдгээрийн .Net фреймворк дэх харгалзааны жагсаалтыг доорх зургаас харна уу.

Өгөгдлийн энгийн төрлүүд заавал бүтэц /structure/ эсхүл утгаар өгөгдөх төрлүүд байх албагүй гэдгийг дурдая. Хүснэгтийн доод хэсэгт байгаа string, object, dynamic төрлүүд бол холбоосоор өгөгдөх төрлүүд буюу классууд болно.
Програмчлалын хэлийг үзэхэд тухайн хэлний өгөгдлийн төрлүүдийг сайн ойлгож авах нь маш чухал суурь байдаг тул хичээлийн материалыг сайтар ойлгон авахыг хичээгээрэй.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 233 Төлбөртэй

Програмчлалын C# хэл хатуу төрөлжилттэй тул өгөгдөлтэй ажиллах үед null утга асуудал үүсгэх тохиолдол их. Үүнийг тооцолгүй бичигдсэн код бүр ажлын /production/ хувилбараар ажиллаж байхдаа алдаа өгөх тал бий. Кодийн тестийг хийхдээ тухайн хувьсагчид null утга олгогдох тохиолдолыг тооцохгүй байх нь ийм асуудал гарах үндсэн шалтгаан хэдий ч кодлогч энэ талаар өөрөө бодон кодлох хэрэгтэй.   

null -ийн шалгалт. Null guard /хамгаалагч/

Коддоо null утга авдаг өөрөөр хэлбэл nullable төрлийн хувьсагч болон параметрүүд ашиглах болбол NullReferenceException алдаа гарахаас сэргийлэн null -ийг шалгах хэрэгтэй. Жишээ нь

void PrintUpper(string? text)
{
    if (text!=null)
    {
        Console.WriteLine(text.ToUpper());
    }    
}

Дээрх кодод text параметр null -тэй тэнцүү биш бол мөрийн тэмдэгтүүдийг том үсэг болгох ToUpper() аргыг дуудна.

  Нээгдсэн тоо: 131 Бүртгүүлэх

Төлөв байдлын үүргийн гинж (Chain of responsibility) загварчлалын хэв шаардлагыг хэд хэдэн обьектууд боловсруулах боломжийг олгодог тул шаардлагын дамжуулагч хүлээн авагчтай хатуу уяа /холбоо/ үүсэхээс сэргийлдэг. Боломжит бүх боловсруулагчид гинж үүсгэн аль нэг обьект шаардлагыг боловсруулах хүртэл шаардлага өөрөө энэ гинжээр дамжина. Шаардлагыг хүлээн авсан обьект нэг бол шаардлагыг боловсруулна эсхүл шаардлагыг гүйцэтгүүлэхээр дараагийн обьектод шилжүүлдэг.

  Нээгдсэн тоо: 327 Төлбөртэй

Хувьсагчид утгыг хадгалдаг бол аргууд тодорхой үйлдлийг хийх командуудын багцыг агуулдаг. Үнэндээ арга гэдэг нь тодорхой үйлдлийг хийх нэрлэгдсэн кодийн блок.
Аргын ерөнхий иодорхойлолт

[модификатор] буцаах_утгын_төрөл аргын_нэр([параметрүүд])
{
    // аргын бие
}

байна. Модификатор, параметрүүд заавал байх албагүй.

  Нээгдсэн тоо: 164 Төлбөртэй

Хэвүүдийг /паттерн/ судлахын өмнө обьект хоорондын үндсэн харилцааг ойлгосон байх нь асуудлын ухагдхуун хоорондын холбоог ойлгон тэдгээрийг хэвүүдэд ашиглахад танд туслана. Обьект хоорондын харилцаанаас удамшилт /inheritance/ , хэрэгжүүлэлт /implementation/, ассоциац /association/, композиц /composition/, агрегац /aggregation/ гэсэн үндсэн харилцаануудыг онцолж болно.

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 131

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 194

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 196

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 218

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 214

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 296

 

Хуваах нь нэг тоо нөгөө тоонд хэдэн удаа агуулагдаж буй тодорхойлох арифметикийн үйлдэл.
Хуваалтыг нэг бус удаа…

Нээгдсэн тоо : 224

 

Зуучлагч (Mediator) нь олон тооны обьектууд бие биетэйгээ холбоос үүсгэхгүйгээр харилцан ажиллах боломжийг хангах загварчлалын хэв юм. Ингэснээр…

Нээгдсэн тоо : 218

 

Делегатууд хичээлд ухагдхууны талаар дэлгэрэнгүй үзсэн ч жишээнүүд делегатийн хүчийг бүрэн харуулж чадахааргүй байсан.…

Нээгдсэн тоо : 221

 
Энэ долоо хоногт

функц өгөгдөв.

  1. f(x) функцын x0=5 абсцисстай M цэгт татсан шүргэгч шулууны тэгшитгэл
  2. f(x) функцын график, дээрх шүргэгч шулуун болон координатын тэнхлэгүүдээр хүрээлэгдсэн дүрсийн талбай  
  3. f(x) функцын графикийг M цэгт шүргэх, төв нь OX (абсцисс) тэнхлэг дээр орших тойргийн тэгшитгэл

Нээгдсэн тоо : 2835

 

20 хувийн концентрацитай 18 гр уусмал дээр концентрацийг нь 4 хувиар нэмэгдүүлэхийн тулд 26 хувийн концентрацитай хичнээн грамм уусмал нэмж хийх шаардлагтай вэ?

Нээгдсэн тоо : 1270

 

тэгшитгэлийн шийдийг ол.

Нээгдсэн тоо : 1386