Стратег (Strategy)

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

Хэвийг хаана ашиглах  

  • Төлөв байдлаараа ялгаатай нэг төрлийн хэдэн классууд байх үед нэг үндсэн классыг өгөөд төлөв байдлын өөр хувилбаруудыг тусдаа классуудад гаргаад шаардлагатай үед тэдгээрийг хэрэглэх.
  • Нөхцлөөс хамааран алгоритмын хувилбаруудаас амархан сонголт хийх боломжийг хангах хэрэгтэй үед.
  • Програм ажиллах явцдаа обьектуудын төлөв байдлыг өөрчлөх шаардлагатай үед
  • Тодорхой ажиллагааг ашиглаж буй класс түүний хэрэгжүүлэлтийн талаар юуг ч мэдэх ёсгүй үед

Стратег хэвийг UML дээр дараах схемээр илэрхийлж болно.

patt_13_01

Хэвийн бүтцийг C# хэл дээр дараах байдлаар тодорхойлно.

public interface IStrategy
{
    void Algorithm();
}
 
public class ConcreteStrategy1 : IStrategy
{
    public void Algorithm()
    {}
}
 
public class ConcreteStrategy2 : IStrategy
{
    public void Algorithm()
    {}
}
 
public class Context
{
    public IStrategy ContextStrategy { get; set; }
 
    public Context(IStrategy _strategy)
    {
        ContextStrategy = _strategy;
    }
 
    public void ExecuteAlgorithm()
    {
        ContextStrategy.Algorithm();
    }
}

Оролцогчид

  • Algorithm() аргыг тодорхойлсон IStrategy интерфейс. Энэ бол алгоритмын бүх хэрэгжүүлэгчдийн ерөнхий интерфейс. Интерфейсийн оронд энд абстракт классыг ашиглаж болно.
  • IStrategy интерфейсийг хэрэгжүүлэх ConcreteStrategy1, ConcreteStrategy2 классууд өөрийн Algorithm() аргуудыг санал болгоно. Ийм төрлийн хэрэгжүүлэгч классууд олон байж болно.
  • Context класс IStrategy обьектын холбоосыг хадгалах бөгөөд IStrategy интерфейстэй агрегац харьцаагаар холбогдоно.

Тодорхойлолтод IStrategy обьектыг ContextStrategy шинжид авсан байгаа ч түүнд дотоод /private/ хувьсагч тодорхойлсон ч болно. Харин обьетыг динамикаар тогтоох бол тусгай арга ашиглана.

Одоо жишээ авч үзье. Цахилгаан, бензин, хий гэх мэтээр түлшний төрөл бүрийн эх үүсвэртэй суудлын машинууд байдаг. Бүр хосолсон түлштэй ч бий. Ерөнхийдөө бол машинууд төстэй ч голдуу түлшний эх үүсвэрээрээ ялгаатай байдаг. Энэ тохиолдолд стратег хэвийг ашиглах бүрэн боломжтой.

    class Program
    {
        static void Main(string[] args)
        {
            Car auto = new Car(4, "Volvo", new PetrolMove());
            auto.Move();
            auto.Movable = new ElectricMove();
            auto.Move();

            Console.ReadLine();
        }
    }
    interface IMovable
    {
        void Move();
    }

    class PetrolMove : IMovable
    {
        public void Move()
        {
            Console.WriteLine("Бензинээр явдаг");
        }
    }

    class ElectricMove : IMovable
    {
        public void Move()
        {
            Console.WriteLine("Цахилгаанаар явдаг");
        }
    }
    class Car
    {
        protected int passengers; // зорчигчийн тоо
        protected string model; // машины марк, загвар

        public Car(int num, string model, IMovable mov)
        {
            this.passengers = num;
            this.model = model;
            Movable = mov;
        }
        public IMovable Movable { private get; set; }
        public void Move()
        {
            Movable.Move();
        }
    }

Програмыг ажлуулбал

patt_13_02

үр дүнг авна.
Жишээнд IStrategy -ийн үүргийг Move() аргыг тодорхойлсон IMovable интерфейс гүйцэтгэн харин интерфейсийг хэрэгжүүлэгч алгоритмуудын бүлгийг ElectricMove, PetroleMove классууд илэрхийлнэ. Алгоритмыг Car класс ашиглана.
Хэвүүд эхэндээ ойлгомж муутай тул нэмэлт материалуудыг судлан практик дадлагыг сайн хийхийг зөвлөе.

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

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

Хааяа өөр өөр параметрүүдийн багцтай нэг аргыг үүсгэх шаардлага гардаг. Ирсэн параметрүүдээс хамааран аргын тодорхой хэрэгжүүлэлтийг хэрэглэнэ. Ийм боломжийг аргын хэт ачаалал (method overloading) нэрлэдэг. overloading нэрийн хэт ачаалал орчуулга сайнгүй болсон байх талтай. Иймээс нэрийг overloading гээд тогтоогоод явах нь илүү ч байж болно.  
C# хэлэнд класст өөр өөр сигнатуртай /тодорхойлогч/ нэг ижил нэртэй олон аргыг үүсгэх боломжтой. Сигнатур гэж юу вэ? Сигнатур дараах зүйлүүдээс бүрдэнэ.

  • Аргын нэр
  • Параметрүүдийн тоо
  • Параметрүүдийн төрлүүд
  • Параметрүүдийн дараалал
  • Параметрүүдийн модификаторууд

Гэхдээ параметрүүдийн нэрүүд сигнатурт орохгүй.

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

Энэ удаагийн хичээлээр бид generalization буюу ерөнхийлөл гэдэг төрөл бүрийн обьектуудын төлөв байдлын хэвийг тодорхойлох нилээд хүчирхэг хэрэгслийн талаар үзнэ.  

Ерөнхийлөл гэж юу вэ?

Ерөнхийлөл гэдэг бол класс эсхүл аргуудыг удирдах хувьсах өгөгдлийн төрөл юм. Ерөнхийлөл ашиглах өгөгдлийн төрлүүдийг урьдчилан тодорхойлохгүйгээр тэдгээрийг програмын явцад сүүлд тодорхойлох боломжийг олгодог. Үүнийг жишээгээр харцгаая. Бидэнд int төрлийн оролтын параметртэй string төрлийн гаралттай

string Move(int distance)

Move гэсэн арга байлаа гэж бодъё.

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

Удамшуулалтад суурь классаас өвлөн ирсэн аргын ажиллагааг удамшсан класст өөрчлөх хэрэгцээ ихээр гардаг. Энэ тохиолдолд удамшсан класст суурь классийн арга, шинжүүдийг дахин тодорхойлж болдог.
Удамшсан класст дахин тодорхойлж болох арга, шинжүүдийг суурь класст virtual модификатороор тэмдэглэнэ. Ийм арга, шинжүүдийг виртуал гэж нэрлэдэг. Удамшсан класст эдгээр аргуудыг дахин тодорхойлохдоо override модификаторийг ашиглана.

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

C# хэлний төрлийн бүрэлдхүүний талбар шинжүүдийн талаар өмнөх хичээлд үзсэн. Энэ хичээлээр төрлийн чухал бүрэлдхүүн болох шинжинй талаар авч үзэх болно. Хичээлд Төрлийн бүрэлдхүүн. Талбар Шинж хичээлийн жишээг ашиглах болно.

Шинжүүд.

Шинжүүд гэж юу болохыг ойлгохын тулд жишээндээ _age талбарын утгыг буцаах public int Getage(), _age талбарт утга олгох public void SetAge(int age) аргуудыг нэмэн өгье. 

        public int Getage()
        {
            return _age;
        }

        public void SetAge(int age)
        {
            _age = age;
        }

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

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

 

Долоон хүнийг 2 ба 5 хүнтэй хоёр багт хуваах нийт боломжийн тоог ол.

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

 

Гадаад шүргэлтээр байрласан R ба r радиустай хоёр тойрогт дотоод ерөнхий болон гадаад хоёр шүргэгчийг татжээ. Гадаад шүргэгчдийн хооронд үүсэх дотоод шүргэгч дээрх хэрчмийн уртыг ол.

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