Байгуулагч (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 класс гүйцэтгэнэ.

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

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

Энэ хичээлээс эхлэн бид C# хэлний илүү нарийн ухагдхуунуудыг судлах тул тэдгээрийн суурь болох гурван механизмын талаар авч үзнэ. Эдгээрт   

  1. Тодорхой бус /далд/ төрөлжилт
  2. Нэргүй төрлүүд
  3. Өргөжүүлэлтийн аргууд

багтана. Эдгээр ухагдхуунууд тийм хүнд биш учраас ойлгоход онцын хүндрэлгүй.

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

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

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

хэрэгтэй.

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

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

Мэдээллийн технологийн салбарын хөгжлийг дагаад кодлогчийн хэрэгцээ жилээс жилд өссөөр байна. Програмийн кодлогч болоход туслах зорилгоор сайтад орчин үед өндөр эрэлттэй байгаа хэлүүдийн хичээлүүдийг цувралаар оруулсаар байх болно. Аливаа зүйлийг сурах суурь бол таны хүсэл эрмэлзлэл гэдгийг Суралцах хир хэцүү вэ? нийтлэлийг уншаад эргэцүүлэн бодоорой.

Хичээлээр консолоос өгөгдөл оруулах, консолд өгөгдлийг үзүүлэхийг судлах болно.

Консолийн гаралт

Өмнөх хичээлүүдэд консолд мэдээлэл үзүүлэхдээ компиляторын Console.WriteLine аргыг хэрэглэсэн. Хэрвээ консолд мэдээллийг гаргах хэрэгтэй түүнийг Console.WriteLine аргад дамжуулах хэрэгтэй. Жишээ нь төслийн Program.cs файлд

string hello = "Сайн уу Монгол";
Console.WriteLine(hello);
Console.WriteLine("C# -д тавтай морил!");
Console.WriteLine("Баяртай Монгол...");
Console.WriteLine(24.5);

командуудыг (statement) өгөөд төслийг ажлуулбал консолд

гэж харуулна.

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

Гурван суурь I хичээлд бид C# хэлний Тодорхой бус /далд/ төрөлжилт, Нэргүй төрлүүдийн талаар үзсэн. Энэ удаад Өргөжүүлэлтийн аргуудын талаар авч үзнэ. Ямарч програмын хэлийг сайн эзэмшихийн тулд тухайн хэлний нарийн механизмуудыг ойлгосон байх хэрэгтэй. Түүнээс давталт, нөхцөлт операторууд гэх мэтийн бүх хэлэнд байдаг цөөн тооны ерөнхий ойлголтоор програмын кодыг бичнэ гэвэл бараг бүтэхгүй зүйл. Бичсэн байсан ч таны код эхлэн суралцагч эсхүл сонирхогчийн түвшинд л харагдахын дээр тавигдсан асуудлыг бүрэн шийднэ гэхэд хэцүү.

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

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

 

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

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

 

Тооны хуваагдах шинж гэдэг нь хуваах үйлдлийг хийхгүйгээр тоо хуваагчид үлдэгдэлгүй хуваагдах эсэхийг тогтоох аргачлал буюу тооны өөрийн…

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

 

Өмнөх Хулганы товч даралтын боловсруулалт хичээлд асуулт, түүний хариултуудын хувилбарууд, зөв хариултын…

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

 

Нийлбэрт нэмэх үйлдлийн үр дүн мэдэгдэхгүй байхад нийлбэрийг хэрхэн олох аргыг судлан сураад байгаа. Тэгвэл нийлбэрийн нэг бүрдүүлэгч…

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

 

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

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

 

Тоонуудын нэмэх үйлдэл ашигладаг аргачлалуудын талаар авч үзье.

Нэг оронтой тоонуудыг нэмэх

Нэг оронтой…

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

 

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

Хэвийг хаана…

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

 

Нийлбэр дэх бүрдүүлэгчдийг нэгтгэн нэмэх дүрэм -ийг үндэслэн дараах хоёр дүрэм гарч ирдэгийг…

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

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

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

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

 

AB, CD суурьтай ABCD трапецын талууд AB=30, BC=20, CD=5 ба DA=15 байг.

  1. Трапецын дундаж шугамын урт
  2. Трапецын өндөр
  3. Трапецын талбай

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

 

бол .

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