Байгуулагч (Builder)

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

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

  • Шинэ обьект үүсгэх ажиллагаа тухайн обьект хичнээн хэсгээс бүрддэг, эдгээр хэсгүүд өөр хоорондоо ямар холбоотойгоос хамааралгүй явагдах хэрэгтэй үед
  • Обьектыг үүсгэх явцдаа түүний төрөл бүрийн хувилбаруудыг авахыг хангах шаардлагатай үед

Хэвийг UML дээр доорх байдлаар тодорхойлж болно.

patt_12_01

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

class Client
{
    void Main()
    {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.Construct();
        Product product = builder.GetResult();
    }
}
class Director
{
    Builder builder;
    public Director(Builder builder)
    {
        this.builder = builder;
    }
    public void Construct()
    {
        builder.BuildPartA();
        builder.BuildPartB();
        builder.BuildPartC();
    }
}
 
abstract class Builder
{
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract void BuildPartC();
    public abstract Product GetResult();
}
 
class Product
{
    List<object> parts = new List<object>();
    public void Add(string part)
    {
        parts.Add(part);
    }
}
 
class ConcreteBuilder : Builder
{
    Product product = new Product();
    public override void BuildPartA()
    {
        product.Add("Part A");
    }
    public override void BuildPartB()
    {
        product.Add("Part B");
    }
    public override void BuildPartC()
    {
        product.Add("Part C");
    }
    public override Product GetResult()
    {
        return product;
    }
}

Оролцогчид

  • Product - үүсгэх ёстой обьектыг илэрхийлнэ. Тодорхойлолтод обьектын бүх хэсгүүдийг parts жагсаалтад оруулсан.
  • Builder - Product обьектын төрөл бүрийн хэсгүүдийг үүсгэх интерфейсийг тодорхойлно.
  • ConcreteBuilder - Builder -ийн тодорхой хэрэгжүүлэлт. Product обьектыг үүсгээд түүнд хандах интерфейсийг тодорхойлно.
  • Director - Builder обьектыг ашиглан обьектыг үүсгэгч менежер

Хэвийн хэрэглээг талх барих жишээн дээр харцгаая. Ердийн талх гэхэд л олон тооны орцтой гэдгийг бүгд мэднэ. Талх болон түүний орцуудын илэрхийллээр дараах классуудаар ашиглаж болно.

        //гурил
        class Flour
        {
            // гурлын зэрэг
            public string Sort { get; set; }
        }
        // давс
        class Salt
        { }
        // хүнсний нэмэлт
        class Additives
        {
            public string Name { get; set; }
        }

        class Bread
        {
            // улаан буудайн гурил
            public Flour WheatFlour { get; set; }
            // хөх тариан гурил
            public Flour RyeFlour { get; set; }
            // давс
            public Salt Salt { get; set; }
            // хүнсний нэмэлт
            public Additives Additives { get; set; }
            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();

                if (WheatFlour != null)
                    sb.Append("Улаан буудайн гурил " + WheatFlour.Sort + "\n");
                if (RyeFlour != null)
                    sb.Append("Хөх тариан гурил " + RyeFlour.Sort + " \n");
                if (Salt != null)
                    sb.Append("Давс \n");
                if (Additives != null)
                    sb.Append("Нэмэлт: " + Additives.Name + " \n");
                return sb.ToString();
            }
        }

Талх хөх тариан гурил, улаан буудайн гурил, давс, хүнсний нэмэлт гээд төрөл бүрийн орц найрлагатай байж болно. Иймээс програм төрөл бүрийн талх барилтыг хангах хэрэгтэй. Талхны төрлөөсөө хамаараад бүх орцууд орохгүй өөрийн тодорхой орцуудтай байж болох бөгөөд энэ асуудлыг шийдэхдээ Builder хэвийг ашиглая.

        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            // талх баригчийн классыг үүсгэх
            Baker baker = new Baker();
            // хөх тариан гурлын талх баригчийг үүсгэх
            BreadBuilder builder = new RyeBreadBuilder();
            // жигнэх
            Bread ryeBread = baker.Bake(builder);
            Console.WriteLine(ryeBread.ToString());
            // улаан буудайн гурлын талх баригчийг үүсгэх
            builder = new WheatBreadBuilder();
            Bread wheatBread = baker.Bake(builder);
            Console.WriteLine(wheatBread.ToString());

            Console.Read();
        }
    }
    // байгуулагчийн абстракт класс
    abstract class BreadBuilder
    {
        public Bread Bread { get; private set; }
        public void CreateBread()
        {
            Bread = new Bread();
        }
        public abstract void SetWheatFlour();
        public abstract void SetRyeFlour();
        public abstract void SetSalt();
        public abstract void SetAdditives();
    }
    // талх баригч
    class Baker
    {
        public Bread Bake(BreadBuilder breadBuilder)
        {
            breadBuilder.CreateBread();
            breadBuilder.SetWheatFlour();
            breadBuilder.SetRyeFlour();
            breadBuilder.SetSalt();
            breadBuilder.SetAdditives();
            return breadBuilder.Bread;
        }
    }
    // хөх тариан гурлын талх баригч
    class RyeBreadBuilder : BreadBuilder
    {
        public override void SetWheatFlour()
        {
            // ашиглахгүй
        }

        public override void SetRyeFlour()
        {
            this.Bread.RyeFlour = new Flour { Sort = "1 зэрэг" };
        }

        public override void SetSalt()
        {
            this.Bread.Salt = new Salt();
        }

        public override void SetAdditives()
        {
            // ашиглахгүй
        }
    }
    // улаан буудайн гурлын талх баригч
    class WheatBreadBuilder : BreadBuilder
    {
        public override void SetWheatFlour()
        {
            this.Bread.WheatFlour = new Flour { Sort = "дээд зэрэг" };
        }

        public override void SetRyeFlour()
        {
            // ашиглахгүй
        }

        public override void SetSalt()
        {
            this.Bread.Salt = new Salt();
        }

        public override void SetAdditives()
        {
            this.Bread.Additives = new Additives { Name = "жигнэлтийг сайжруулагч" };
        }
    }

Кодыг UML диаграм болон C# хэл дээрх бүтцийн тодорхойлолтуудтай харьцуулан харж ойлгон авахыг бодоорой. Програмчлалын хэвийг судлан хэрэглэж сурах ажил шууд биелэгдэхгүй яваандаа практикаар дадлагажин хэрэгжих нарийн явц учраас эхэн үедээ хэвүүд ойлгомжгүй мэт санагдаж магадгүй. Хэвүүдийг цээжлэх гэсний хэрэггүй харин ажиллагааны логикийг сайн ойлгоод програмын хэлэнд хэрхэн ашигласан жишээг UML диаграмтай харицуулан ойлгон авах нь чухал. Програмыг ажлуулбал

patt_12_02

үр дүнг авах болно. Програмд RyeBreadBuilder , WheatBreadBuilder гэсэн тодорхой байгуулагчдаар тодорхой багц бүхий Bread обьектыг үүсгэж байгаа. Обьектыг үүсгэгч менежерийн үүргийг тодорхой байгуулагчдын аргуудыг дуудан шинэ обьектыг үүсгэх Baker класс гүйцэтгэнэ.

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

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

Нэмэлт урсгалтай ажиллах аргачлалын талаарх ээлжит хичээлийг толилуулъя. Та програм хангамжийн чиглэлээр ажилладаг эсхүл суралцдаг бол сайтын C# хэлний хичээлүүдийг бүгдийг үзэхийг зөвлөе. Учир нь C# хэлэнд оруулан өгсөн технологиудийн утгыг сайн ойлгохгүйгээр програм бичнэ гэвэл нилээд хүндхэн асуудал үүснэ шүү. Програмчлалын хэлүүдийн бичлэгийн ерөнхий дүрэм бараг ижилхэн болсон хэдий ч онолын үндсэн аргачлал, технологийг хэл бүр өөрийн онцлогоор хэрэгжүүлсэн байдаг. Иймээс технологийг ойлгохын тулд тухайн хэлийг гүнзгий судалсан байх хэрэгтэй. Технологийг сайн судлаагүй хүмүүс хэлэнд өөрт нь байдаг боломжуудыг өөрсдөө хэрэгжүүлэх гэж цаг хугацаа, хүч хөдөлмөрөө ихээр үрдэг ч үр дүн нь мэдээжээр сайнгүй гардаг гэдгийг санаарай. Хичээлээр нэмэлт урсгалын нэмэлт урсгалд гарсан алдааг хэрхэн зөв боловсруулахыг авч үзье.

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

Entity Framework -ийн талаарх өмнөх хичээлүүдэд бид MSSQL серверт энгийн өгөгдлийн сан үүсгээд түүнд ADO NET -ээр хандах стандарт арга болон EF технологийг ашиглан хандахыг үзсэн. Entity Framework -ийг ашиглан өгөгдлийн санд хандах код нь стандарт аргаас хамаагүй бага бөгөөд уншин ойлгоход амархан байсныг харсан. Одоо програмын кодоос EF технологиор өгөгдлийн санд хандаж болох аргуудын талаар авч үзье.

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

Өмнөх хичээлүүдэд бид

  • Олон урсгал гэж юу болох, түүнийг үүсгэн ажиллах
  • Invoke аргын ажиллагааны зарчим, делегатыг дамжуулах механизм
  • Invoke аргын дээд түвшингийн багцлалт болох SynchronizationContext класс
  • Олон урсгалыг хэрэгжүүлэхэд машины нөөцийг урсгалын багцлалтаар хэрхэн хэмнэх
  • Олон урсгалыг хэрэгжүүлэх дээд түвшиний BackgroundWorker, Task классууд
  • Олон урсгалыг бараг синхрон код байдлаар хэрэгжүүлэх async/await түлхүүр үгүүд

гэх мэтийн олон чухал ухагдхуунуудыг үзсэн. Энэ удаагийн хичээлээр Task классыг ашиглан алдааны боловсруулалт, үйлдлийн цуцлалтыг хэрхэн хийхийг авч үзье.

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

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

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

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

 

Аяга, стакан, ваар, лаазанд сүү, ундаа, квас, ус байжээ. Аяганд ус, сүү байхгүй, ундаатай сав ваар болон квастай савны дунд, лаазанд ундаа, усны аль нь ч байхгүй, стакан лааз ба сүүтэй савтай зэрэгцэн байрласан бол ямар саванд ямар шингэнийг хийсэн бэ.

Жич: Маш сонирхолтой гоё бодлого. Оролдоод үзээрэй.

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

 

илэрхийллийн хялбарчил.

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