Делегат ба үйл явдал 1.

Бид C# төрлийн бүрэлдхүүн хичээлүүдэд төрлийн Үйл явдлууд /Events/ ухагдхуунаас бусад гишүүдийг үзсэн. Иймээс энэ хичээлд Үйл явдлууд /Events/ ойлголтын талаар авч үзье. Үйл явдал делегат /delegate/ гэдэг ойлголт дээр суурилдаг учраас эхлээд делегат ухагдхууныг авч үзээд дараа нь үйл явдал гишүүний талаар авч үзье Delegate гэсэн үгийг монголчилбол "төлөөлөгч" гэж хэлж болох юм. Гэхдээ би делегат гэсэн нэрээр нь шууд ойлгон тогтоон авах нь илүү гэж үзлээ.

Signature - аргын тодорхойлогч

Эхлээд аргын "signature" гэсэн ухагдхуунтай танилцая. Үүнийг аргын тодорхойлогч гэж орчуулж болно. Аргын тодорхойлогч гэдэг нь түүний оролт, гаралтын параметрүүдийн төрөл ба дарааллыг хэлнэ. Үүнийг жишээн дээр харцгаая.

    public class Student
    {
        public string Move(int distance)
        {
            return null;
        }

        public int GetAge()
        {
            return 20;
        }

        public string Grow(int years)
        {
            return null;
        }

        public void SetInfo(string name, int age)
        {

        }

        public void SetSchool(int id, string number)
        {

        }
    }

Жишээнд Student классыг үзүүлсэн. Классын аргуудыг хэрхэн хэрэгжүүлсэн нь одоо бидэнд чухал биш харин тэдгээрийн тодорхойлолт чухал. Жишээний Move, Grow аргууд ижилхэн тодорхойлогчтой байгаа. Яагаад гэвэл эдгээр аргуудаас буцах утгууд ижилхэн string төрөлтэйн дээр оролтын параметрүүд бас ижилхэн int төрөлтэй. Хэдийгээр SetInfo, SetSchool аргуудад буцах утгын төрөл, оролтын параметрүүдийн төрлүүд ижилхэн боловч Move, Grow аргуудаас тодорхойлогчоороо ялгаатай. Учир нь SetInfo, SetSchool аргуудын оролтын параметрүүдийн дараалал өөр байгаа. Иймээс Student класст Move, Grow аргуудыг л ижилхэн тодорхойлогчтой гэж үзнэ. Өөрөөр аргын тодорхойлогчийг бүх параметрүүдийн төрлүүдийг агуулсан хэв байдлаар ойлгож болно. Ийм төрлийн хэдэн хэвийг доор үзүүллээ.

void (int, string) 
bool ()
DateTime (int)

Аргын тодорхойлогчид түүний нэр болон параметрүүдийн нэрүүд ямарч хамааралгүй зөвхөн оролт, гаралтын параметрүүдийн төрөл, дараалал гол үүрэгтэй.

Delegate - төлөөлөгч

Одоо делегат гэж юу болохыг авч үзье. Делегат бол нэгдүгээрт C# -ийн өгөгдлийн төрөл хоёрдугаар холбоосоор өгөгдөх /өөрөөр хэлбэл класс/ өгөгдлийн төрөл гуравдугаарт делегат бол тодорхойлогч нь түүний өөрийн зарлалтын тодорхойлолттой тохирч байгаа аргын холбоосыг хадгалж болдог өгөгдлийн төрөл. Доорх жишээг харна уу.

    public delegate int CountDelegate(string message);

    public class StringHelper
    {
        public int GetCount(string inputString)
        {
            return inputString.Length;
        }

        public int GetCountSymbolA(string inputString)
        {
            return inputString.Count(c => c == 'A');
        }

        public int GetCountSymbol(string inputString, char symbol)
        {
            return inputString.Count(c => c == symbol);
        }
    }

Жишээний эхний мөрөөр зарлагдсан CountDelegate нэртэй делегат string төрлийн ганцхан параметр аваад бүхэл тоон төрлийн утга буцаах аргын тодорхойлогчийг зарласан байгаа. Энд аргын нэр ба параметрийн нэрүүд ямарч хамааралгүй болно. Энэ тодорхойлогчид тохирох арга StringHelper класст хоёр байгаа нь GetCount, GetCountSymbolA аргууд юм. Харин GetCountSymbol арга оролтын хоёр параметртэй тул делегатын тодорхойлолтонд тохирохгүй.
Делегатыг классын төрөл гэж хэлсэн. Үүнийг шалгахын тулд програмаа компиляц хийгээд дизассемблерыг ажиллуулан MSIL кодыг харцгаавал

гэж харагдана. CountDelegate төрлийн зарлалтанд түүнийг class түлхүүр үгээр зарласан байгаа нь зураг дээрээс харагдана. Энэ нь CountDelegate төрөл бол класс гэдгийг илэрхийлнэ. CountDelegate класс учраас бид ийм төрлийн дурын хувьсагчийг зарлан ашиглаж болно. CountDelegate -ийг ашигласан жишээг харцгаана уу.

    class Program
    {
        static void Main(string[] args)
        {
            StringHelper helper = new StringHelper();

            CountDelegate d1 = helper.GetCount;
            CountDelegate d2 = helper.GetCountSymbolA;

            CountDelegate error = helper.GetCountSymbol;
        }
    }

Дээрх жишээнд бид CountDelegate төрлийн d1, d2 делегатыг зарласан. Эдгээр хувьсагчдын утгууд бол бидний өмнө нь зарласан делегатын тодорхойлолтонд / int (string) /тохирох аргуудын холбоос юм. GetCount, GetCountSymbolA аргууд делегаттай тохирох тодорхойлогчтойг бид мэдэх тул d1, d2 -д эдгээр утгуудыг өгч болно. Харин GetCountSymbol арга / int (string, char) / гэсэн өөр тодорхойлттой тул боловсруулалтын орчин алдаа өгнө. d1, d2 делегатыг хэрхэн ашиглахыг жишээг авч үзэцгээе.

using System;

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringHelper helper = new StringHelper();

            CountDelegate d1 = helper.GetCount;
            CountDelegate d2 = helper.GetCountSymbolA;

            string testString = "LAMP";

            Console.WriteLine("Нийт тэмдэгтийн тоо: {0}", TestDelegate(d1, testString));
            Console.WriteLine("A тэмдэгтийн тоо: {0}", TestDelegate(d2, testString));

            Console.ReadLine();
        }

        static int TestDelegate(CountDelegate method, string testString)
        {
            return method(testString);
        }
    }
}

d1, d2 делегатыг ашиглахын тулд эхний параметрээр шалгах гэж буй аргын холбоосыг харин хоёрдахь параметрээр аргад ашиглах мөрийг авах TestDelegate аргыг зарлан өгье. Дараа нь аргуудад дамжуулах мөрийг string testString = "LAMP"; гэж зарлана. Консолд мөр гаргах эхний операторт TestDelegate аргыг дуудахдаа эхний параметрээр GetCount аргын холбоосыг хоёрдахь операторт GetCountSymbolA аргын холбоосыг өгсөн. Манай TestDelegate аргад юу хийгдэх вэ? Компилятор method хувьсагчаар дамжуулан дуудах аргын холбоосыг аваад түүний тодорхойлогчоор нь дуудна. Өөрөөр хэлбэл string төрлийн оролтын параметр аваад бүхэл тоон төрлийн утга буцаах аргыг дуудна. За ингээд програмаа ажлуулаад үзвэл

бид хүлээж байсан үр дүнгээ авна. Үнэхээр "LAMP" мөрний нийт тэмдэгт 4, мөрөнд "A" тэмдэгт нэг л байгаа. Танд ийм ердийн бус ажиллагаатай делегатууд юунд хэрэгтэй юм, тэдгээрийг хаана, хэрхэн ашигладаг юм вэ? гэсэн бодол төрж байгаа байх. Үүнийг энгийн жишээгээр тайлбарлая. Student класст Move аргыг тодорхойлон өгье.

    public class Student
    {
        public void Move(int distance)
        {
            for(int i=1; i<=distance; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine("Шилжилт хийгдэж байна... {0} километр явлаа.",i);
            }
        }
    }

Арга оролтын параметрээр явсан километрийн хэмжээг аваад явж өнгөрсөн зайн тухай мэдээллийг циклээр өгөх юм. Одоо Move аргыг үндсэн програмаас

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

гэж дуудан ажлуулбал

үр дүнг өгнө. Бүгд хэвийн сайн ажиллаж байгаа биз. Одоо манай Student класс хаа нэг веб серверт байрлаж байгаа гэж бодъё. Энэ тохиолдолд бид класст хандан түүнээс мэдээллийг хүлээн аваад консолд биш интернетээр харуулах эсхүл бид ямар нэгэн Windows програм хийж байгаа бол мэдээллийг графикийн интерфейс бүхий цонхонд үзүүлэх хэрэгтэй болно. Ерөнхий санаа бол бид Move аргаас хүлээн авсан мэдээллийг харуулах аргаас хамааралгүйгээр түүнээс мэдээллийг авах байдлаар зохион байгуулах хэрэгтэй гэсэн үг. Яг үүнийг бид одоо делегатыг ашиглан хэрэгжүүлэх болно. Эхлээд делегатаа зарлан өгье.

    public delegate void ShowMessage(string message);

Бидэнд утга буцаахгүй харин string төрлийн ганцхан параметр аваад түүнтэй ажиллах арга шаардлагатай. Иймээс манай делегатын тодорхойлогч void (string) хэлбэртэй байна. Дараа нь Move аргад энэхүү делегатын хувьсагчийг дамжуулна.

    public void Move(int distance, ShowMessage method)

Өөрөөр хэлбэл тодорхойлогчид тохирох аргын холбоосыг дамжуулна. Одоо мэдээллийг консолд үзүүлэх мөрийг

    method(string.Format("Шилжилт хийгдэж байна... {0} километр явлаа.",i));

дамжин ирэх аргаар солино. Student классын кодыг үзүүлбэл

    public delegate void ShowMessage(string message);

    public class Student
    {
        public void Move(int distance, ShowMessage method)
        {
            for(int i=1; i<=distance; i++)
            {
                System.Threading.Thread.Sleep(1000);
                method(string.Format("Шилжилт хийгдэж байна... {0} километр явлаа.",i));
            }
        }
    }

болоод байгаа. Ингэснээр бид юунд хүрсэн вэ? Одоо Move арга өөрийн мэдээллийг консолд гаргахын оронд түүнийг ямар нэгэн өөр аргад дамжуулна. Ямар арга гэдгийг Move арга өөрөө ч мэдэхгүй. Түүнд энэ аргын холбоосыг удирдах код гаднаас өгсөн. Ингэснээр бид мэдээллийг хэрэглэгчийн интерфейст гаргах аргыг бүрэн хийсвэрлэж чадлаа. Энэхүү аргыг хэрхэн ашиглах вэ? Жишээний үндсэн кодыг харуулбал

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student.Move(10);
        }
    }
}

байгаа. Одоо дараах өөрчлөлтийг хийе. Эхлээд делегатын void (string) тодорхойлогчид тохирох Show аргыг нэмнэ.

        static void Show(string message)
        {
            Console.WriteLine(message);
        }

Тэгэхлээр одоо түүний холбоосыг оруулах хэрэгтэй. Үүнийг

ShowMessage method = Show;

гэж хийнэ. Дээрх оператор манай Show аргын холбоосыг method хувьсагчид олгож байгаа юм. Одоо student классын Move аргад method хувьсагчийг хоёрдахь параметрээр өгцгөөе.

student.Move(10,method);

Ингээд гүйцээ. Манай үндсэн програмын код

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();

            ShowMessage method = Show;

            student.Move(10,method);
        }

        static void Show(string message)
        {
            Console.WriteLine(message);
        }
    }
}

хэлбэртэй болсон. Програмаа ажлуулбал

гэсэн яг ижилхэн үр дүнг авна. Кодыг анхааралтай ажиглабал одоо Show аргад мэдээллийг үзүүлэхдээ та веб интерфейс, десктоп интерфейсээр гэх мэтээр дурын аргыг ашиглах боломжтой болсон нь харагдана. Делегат ямар хэрэгтэйг ойлгосон гэж бодож байна. Энэ хичээлийг ингээд өндөрлөе. Дараагийн хичээлд үйл явдлын талаар үргэлжлүүлэн үзэх тул делегатын талаар сайн ойлгон аваарай.

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

  Нээгдсэн тоо: 368 Нийтийн

Нөхцөлт илэрхийлэл тусдаа үйлдлийн багц. Ийм үйлдлүүд bool төрлийн логик утгыг буцаадаг. Нөхцөлт илэрхийлэл үнэн бол true, илэрхийлэл худал бол false утгыг буцаана. Ийм үйлдлүүдэд харьцуулах, логик үйлдлүүд хамаарагдана.

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

Ажиглагч (Observer) бол нэг -> олон (1->∞) харьцааг илэрхийлэх төлөв байдлын хэв. Энэ утгаараа ажиглагдах нэг харин ажиглагч олон обьектууд байдаг. Ажиглагдаж буй обьектын өөрчлөлтүүд ажиглагчдад автоматаар тараагдана. Нийтлэгч, бүртгүүлэгчийн харилцаа нь энэхүү хэвийн үйлдлийг тодорхойлдог болохоор бас Publisher-Subscriber (нийтлэгч - бүртгүүлэгч) гэж ч нэрлэдэг. Жишээ нь бүртгүүлэгч буюу хэрэглэгчид сайтаас цахим шуудангаар мэдээлэл авахаар бүртгүүлэгч болно.

  Нээгдсэн тоо: 7569 Нийтийн

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

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

  Нээгдсэн тоо: 178 Нийтийн

Төслийн кодийн файл дахь ямар нэгэн нэрийн орон зайг ашиглах хэрэгтэй бол ашиглах гэж буй бүх файлд түүнийг анхдагчаар холбон оруулах хэрэгтэй болно.
Жишээ нь төсөлд кодийн гурван файл байлаа

гэж үзье.

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

react програмд олон хуудас үүсгэн удирдахын тулд react -ийн бүрэлдхүүнд ордоггүй ч түүнтэй нягт холбоотой ажилладаг нэмэлт пакетийг…

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

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

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

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

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

 

илэрхийллийн a=36,7 тэнцүү байх утгыг ол.

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

 

a ба b нь 3x2-x-1=0 тэгшитгэлийн шийдүүдтэй тэнцүү бол илэрхийллийн утгыг ол.

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