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

Юуны өмнө ОХП-ын хэлүүд болон 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 төрлүүд бол холбоосоор өгөгдөх төрлүүд буюу классууд болно.
Програмчлалын хэлийг үзэхэд тухайн хэлний өгөгдлийн төрлүүдийг сайн ойлгож авах нь маш чухал суурь байдаг тул хичээлийн материалыг сайтар ойлгон авахыг хичээгээрэй.

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

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

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр програм зохиогчид массив эсхүл коллекцийн обьектуудыг татан авдаг foreach циклтэй ажиллаж үзсэн байх. Энэ үед коллекцийн нийлмэл классуудад өөрийн бүтэц ба төлвөөрөө ялгаатай олонлог оршиж байдаг. Коллекцийг foreach -р гүйлгэн обьектуудыг авах боломжийг олгож байгаа түлхүүр хэрэгсэл бол давталт хэв буюу энгийнээр хэлбэл IEnumerable , IEnumerator хоёр интерфейс юм.

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

Манай энэ удаагийн хичээлийн сэдэв бол олонлог. C# -д олонлогийн хэдэн төрлүүд байдаг. Олонлогийн тухай ойлголт интерфейс ба ерөнхийлөлтэй их холбоотой тул хичээлийг үзэхээс өмнө интерфейс , ерөнхийлөл сэдвийн хичээлүүдийг судлахыг зөвлөе.

Олонлог гэж юу вэ?

C# -д олонлогийг ямар нэгэн обьектуудын багц гэж ойлгоно. Жишээ нь бүхэл тоонуудын массив int[] a; бол бүхэл тоонуудыг багц учраас олонлог. list<string> lst; - мөрүүдийн жагсаалт бас л олонлог. Энд ухагдхууны хувьд тодорхой төөрөгдөл үүсдэг. Ном, интернет нийтлэлүүдэд цуглуулга /collection/, жагсаалтын талаар авч үзэхдээ тэдгээрийг олонлог гэж үзсэн байдаг. Үнэн хэрэгтээ цуглуулга /collection/, жагсаалт, дарааллууд бол олонлогийн тухайн тохиолдол юм. Эдгээрийн ялгааг бид хичээлээр үзэх болно.

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

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

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

Entity Framework -ийн талаарх өмнөх хоёр хичээлд бид технологийн талаарх ойлголт, өгөгдлийн санд уламжлалт аргачлалаар хандах програмын кодыг хийсэн. Энэ хичээлд өмнөх хичээлийн жишээг Entity Framework -ийг ашиглан хэрхэн хийхийг авч үзэцгээе. Таны ашиглаж байгаа .NET фреймворкийн хувилбарт Entity Framework -ийн арай өмнөх хувилбар байж болох талтай. Иймээс Entity Framework -ийн сүүлийн хувилбарыг Nuget механизмаар татан суулгаарай. Nuget бол төрөл бүрийн шинэчлэлүүдийн классын санг автоматаар татан суулгах систем юм.

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

Арифметик прогресийн 5-р гишүүн 8,4 харин 10-р гишүүн 14,4 тэнцүү бол энэ прогресийн 22-р гишүүнийг ол.

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

 

Дарааллын эхний n гишүүний нийлбэр томьёогоор өгөгджээ. Хэрэв энэ дараалал геометр прогресс бол q -г ол, арифметик прогресс бол d -г ол.

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

 

бол M·N=?

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