Стратег (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 класс ашиглана.
Хэвүүд эхэндээ ойлгомж муутай тул нэмэлт материалуудыг судлан практик дадлагыг сайн хийхийг зөвлөе.

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

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

.NET фреймворк ердийн төрлүүдээс гадна ерөнхийлөгдсөн (generics) төрлүүд болон ерөнхийлөгдсөн аргуудын үүсгэлтийг дэмждэг. Энэхүү боломжийн онцлогийг судлахын өмнө ерөнхийлөгдсөн төрлүүд байхгүй бол үүсч болох асуудлуудыг авч үзье. Жишээ нь

class Person
{
    public int Id { get;}
    public string Name { get;}
    public Person(int id, string name)
    {
        Id = id;
        Name = name;
    }
}

гэж хэрэглэгчийн өгөгдлийг хадгалах классийг тодорхойллоо гэж үзье. Person класст Id - хэрэглэгчийн давтагдахгүй идентификатор, Name - хэрэглэгчийн нэр гэсэн хоёр шинжийг тодорхойлсон. Энд хэрэглэгчийн идентификаторийг тоон утгаар өгсөн тул шинж 1, 2, 3, 4 гэх мэтээр утгуудыг авна.

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

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

delegate(параметрүүд)
{
    // командууд
}

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

C# нь хатуу төрөлжилттэй хэл тул програмийн кодод ашиглагдаж буй бүх хувьсагчдийн төрлийг заавал тодорхойлосон байх шаардлагатай. Энд төрлүүдийн хувиргалт ухагдхуун маш чухал үүрэгтэй. Төлвүүдийн хөрвүүлэлтийн логикийг ойлгоогүйгээс үүдэн програмийн ажиллагааны явцад алдаа гарах явдал цөөнгүйн дээр ийм төрлийн алдааг илрүүлэхэд нилээд хүндрэл үүсэх талтай. Иймд хэлний онцлогийг зөв ойлгон эзэмшихийг зөвлөе.
Бид Суурь өгөгдлийн төрлүүдийн хөрвүүлэлт хичээлд энгийн төрлүүдийн обьектийн хувиргалтыг үзсэн. Одоо классийн обьектуудын хувиргалтыг авч үзье.

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

C# хэл дээр програм зохиоход бидэнд юу хэрэгтэй вэ?

  • Програмийн кодоо бичих текст засварлагч.
  • Програмийн кодийг exe өргөтгөлтэй файлд багцлах компилятор /хөрвүүлэгч/
  • Програмийн компиляц, цаашдын ажиллагаанд хэрэгтэй .NET фреймворк

хэрэгтэй.

Програмийн кодийг бичих, тестлэн зүгшрүүлэх ажиллагааг хөнгөвчлөх үүднээс ихэнхдээ тусгай боловсруулалтын орчинг ашигдладаг. Тухайлбал Visual Studio.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

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

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

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

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

a ба b катеттай тэгш өнцөгт гурвалжин ерөнхий тэгш өнцөгтэй квадратыг багтаасан бол квадратын периметрийг ол.

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

 

функцийн графикийн (0,-1) цэгт татсан шүргэгч шулуун ба координатын тэнхлэгүүдээр хашигдсан мужийн талбайг ол.

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

 

тэнцэтгэл бишийн хамгийн их бүхэл шийдийг ол.

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