Хадгалагч (Memento)

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

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

  • Дараа нь сэргээх боломжтойгоор обьектын төлвийг хадгалах хэрэгтэй бол
  • Обьектын төлвийн хадгалалт хайрцаглалтын зарчмыг зөрчихгүйгээр хийгдэх хэрэгтэй бол

Энэхүү хэвийн түлхүүр ойлголт нь дотоод төлөв, хайрцаглалтын зарчим хоорондын балансыг сахин хадгалах юм. Хэрвээ бид хайрцаглалтыг зөрчихгүй бол обьектын төлвийг ердийн хувьсагчид хадгалах боломжтой шүү дээ. Харин эдгээр хувьсагчдад хандан утга олгох /setter/, утгыг авах /getter/ арга эсхүл шинжүүд үргэлж байгаад байдаггүй. Жишээ нь тоглоомд баатрыг удирддаг. Баатрын зэвсэг, амины хэмжээ, хүч гэх мэтээр бусад үзүүлэлтүүд тухайн баатрын обьект дотор агуулагддаг. Сүүлд өмнөх түвшиндээ буцан тоглоомыг шинээр эхлүүлэхийн тулд эдгээр бүх үзүүлэлтийг гадна хадгалах тохиолдол олонтаа гардаг. Энэ тохиолдолд хадгалагч хэв тусалж болно.
Хэвийн бүтцийн диаграмыг дараах байдлаар дүрсэлж болно.

patt_22_01

Хэвийн бүтцийг C# -аар харуулбал

class Memento
{
    public string State { get; private set;}
    public Memento(string state)
    {
        this.State = state;
    }
}
 
class Caretaker
{
    public Memento Memento { get; set; }
}
 
class Originator
{
    public string State { get; set; }
    public void SetMemento(Memento memento)
    {
        State = memento.State;
    }
    public Memento CreateMemento()
    {
        return new Memento(State);
    }
}

Оролцогчид

  • Memento - Originator обьектын төлвийн хадгалагч ба зөвхөн энэхүү Originator обьетод бүрэн хандалтыг олгоно.
  • Originator - өөрийн төлвийг хадгалах хадгалагч обьектыг үүсгэнэ.
  • Caretaker - зөвхөн Memento обьектыг хадгалах үүргийг гүйцэтгэх бөгөөд түүнд хадгалагчид хандах бүрэн эрх байхгүй. Өөрөөр хэлбэл класс хадгалах үйлдлээс өөр юуг ч хийж чадахгүй.

Одоо бодит жишээ авч үзье. Бидэнд тоглоомын баатрын төлвийг хадгалах хэрэг гарлаа гэе.

    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            Hero hero = new Hero();
            hero.Shoot(); // Буудлага хийлээ, 9 сум үлдсэн
            GameHistory game = new GameHistory();

            game.History.Push(hero.SaveState()); // тоглоомыг хадгалах

            hero.Shoot(); // Буудлага хийлээ, 8 сум үлдсэн

            hero.RestoreState(game.History.Pop());

            hero.Shoot(); // Буудлага хийлээ, 8 сум үлдсэн

            Console.Read();
        }
    }

    // Originator
    class Hero
    {
        private int patrons = 10; // сумны тоо
        private int lives = 5; // амины тоо

        public void Shoot()
        {
            if (patrons > 0)
            {
                patrons--;
                Console.WriteLine("Буудлаа. {0} сум үлдсэн", patrons);
            }
            else
                Console.WriteLine("Сум дууссан");
        }
        // төлвийн хадгалалт
        public HeroMemento SaveState()
        {
            Console.WriteLine("Тоглоомыг хадгалах. Параметрүүд: {0} сум, {1} амь", patrons, lives);
            return new HeroMemento(patrons, lives);
        }

        // төлвийн сэргээлт
        public void RestoreState(HeroMemento memento)
        {
            this.patrons = memento.Patrons;
            this.lives = memento.Lives;
            Console.WriteLine("Тоглоомыг сэргээх. Параметрүүд: {0} сум, {1} амь", patrons, lives);
        }
    }
    // Memento
    class HeroMemento
    {
        public int Patrons { get; private set; }
        public int Lives { get; private set; }

        public HeroMemento(int patrons, int lives)
        {
            this.Patrons = patrons;
            this.Lives = lives;
        }
    }

    // Caretaker
    class GameHistory
    {
        public Stack<HeroMemento> History { get; private set; }
        public GameHistory()
        {
            History = new Stack<HeroMemento>();
        }
    }

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

patt_22_02

үр дүн гарна. Энд Originator -ийн үүргийг төлөв нь сум, амины тоогоор тодорхойлогдох Hero класс гүйцэтгэнэ. HeroMemento класс тоглоомын баатрын төлвийг хадгалахад зориулагдсан. Hero обьект өөрийн төлвийг SaveState() аргаар HeroMemento -д хадгалаад RestoreState() аргаар сэргээнэ. GameHistory класс төлвийг хадгалахад зориулагдсан бөгөөд бүх төлвүүдийг стекд хадгалах тул сүүлийн төлвийг амархан гарган ирэх боломжтой.
Memento хэв дараах давуу талтай.

  • Системийн холбоог багасгана
  • Мэдээллийг хайрцаглан хадгална
  • Төлвийг хадгалах, сэргээхэд энгийн интерфейсийг тодорхойлно

Хэрвээ их хэмжээний мэдээллийг хадгалах хэрэгтэй болбол бүх төлвийг хадгалахад зардал /хугацаа, санах ой/ ихсэх тул нөөцийн дутагдалтай тулгарч мэднэ.

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

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

Entity Framework технологийн тухай ээлжит хичээлийг нийтэллээ. Хичээлээр чиглүүлэгч шинжүүд гэж юу болох тэдгээртэй хэрхэн ажиллахыг авч үзье. Entity Framework манай өгөгдлийн сангийн хэрэглэгчдийн Customer хүснэгтэд

namespace DbDemo
{
    using System;
    using System.Collections.Generic;
    
    public partial class Customer
    {
        public Customer()
        {
            this.Orders = new HashSet<Order>();
        }
    
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
    
        public virtual ICollection<Order> Orders { get; set; }
    }
}

кодыг үүсгэсэн байгаа.

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

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

 

илэрхийллийн x=3 утгыг ол.

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

 

16 см суурьтай, 10 см хажуу талтай адил хажуут гурвалжин өгөгджээ. Гурвалжинд багтсан болон гурвалжинг багтаасан тойргуудын радиус болон тойргуудын төв хоорондын зайны нийлбэрийг ол.

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