Аргыг нуух ба дахин тодорхойлолтын ялгаа

Програмчлалын c# хэл өргөн боломжтой, обьект хандлагат парадигмийг дэмждэг, том төслүүдийн боловсруулалтад өргөнөөр ашиглагддаг, маш универсал хэл. Хэлийг Microsoft хөгжүүлдэг нь л өөрөө ихийг хэлнэ. Миний бодлоор c# -ийн зарим шийдлүүдийг шууд ойлгоход хүндрэлтэй байдаг нь хэлний хийсвэрлэлттэй холбоотой байдаг болов уу. Хэлний боломжийг сайн судлан мэдэхгүйгээр сайн, хүчирхэг гэсэн утгаар төслийн үндсэн хэлээр ашиглах нь зөв биш шийдэл болов уу. Та c# хэл дээр код бичдэг, бичихээр суралцаж байгаа бол хэлний боломж, бололцоог сайн судлахыг зөвлөе.      

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

Дахин тодорхойлох

class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
    public virtual void Print()
    {
        Console.WriteLine(Name);
    }
}
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
        : base(name)
    {
        Company = company;
    }
 
    public override void Print()
    {
        Console.WriteLine($"{Name} {Company} -д ажилладаг");
    }
}

Классуудийг програмд

Person tom = new Employee("Tom", "Microsoft");
tom.Print();        // Tom Microsoft -д ажилладаг

ашиглавал tom.Print() аргыг дуудахад tom хувьсагч Person төрлийнх хэдий ч Employee классийн Print аргын хэрэгжүүлэлт биелэгдэнэ. Компилятор виртуал аргуудтай ажиллахдаа виртуал аргуудын хүснэгтийг (Virtual Method Table эсхүл VMT) бүрдүүлдэг. Хүснэгтэд виртуал аргуудын хаягийг бичдэг. Класс бүрд өөрийн хүснэгтийг үүсгэдэг. Классийн обьект үүсэхэд компилятор обьектийн байгуулагчид VMT хүснэгт обьектийг холбох тусгай кодийг дамжуулдаг. Виртуал аргыг дуудахад обьектоос түүний VMT хүснэгтийн хаягийг аваад VMT хүснэгтээс аргын хаягийг олоод түүнд удирдлагыг шилжүүлдэг. Өөрөөр хэлбэл аргын хэрэгжүүлэлтийг сонгох үйлдэл програмийн ажиллагааны үед хийгддэг. Програмийг ажлуулах орчин эхлээд VMT хүснэгтээс хэрэгтэй аргын хаягийг авах шаардлагатай тул энэ нь програмийн ажиллагааг багахан удаашруулдаг гэдгийг тооцох хэрэгтэй.    

Нуулт

Одоо Person, Employee классуудад дахин тодорхойлолтын оронд нуултыг

class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
 
    public void Print()
    {
        Console.WriteLine(Name);
    }
}
 
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
            : base(name)
    {
        Company = company;
    }
    public new void Print()
    {
        Console.WriteLine($"{Name} {Company} -д ажилладаг");
    }
}

ашиглаад

Person tom = new Employee("Tom", "Microsoft");
tom.Print();        // Tom

дээрх байдлаар дуудвал юу болохыг харцгаая. Person төрлөөр илэрхийлэгдэх tom хувьсагч Employee обьектийн холбоосыг хадгална. Гэхдээ Print аргыг дуудахад Employee классийнх биш Person класст тодорхойлсон аргын хувилбар ажиллана. Яагаад гэвэл Employee класс суурь классаас өвлөн авсан Print аргыг ердөө дахин тодорхойлоогүй үнэндээ шинэ арга тодорхойлсон. Иймээс tom.Print() илэрхийллээр Person классийн Print арга дуудагдана.

Жич: Классийн арга шинжүүдийг дахин тодорхойлох, нуух ямар хэрэгтэй, хэзээ ашиглах юм гэж бодогдож магадгүй. Зарим нэгэн кодлогчид ч үүнийг ашиглаж үзээгүй байж болно. Үнэхээр төслийн архитектор, загвар зохиогчидийн даалгаварт удамшсан класст арга шинжүүдийг дахин тодорхойлох, нуух зүйл тусгагдаагүй бол кодлогч өөрөө дур мэдэн илүү хэрэгжүүлэлтийг хийж болохгүй. Та цаашдаа том төсөлд ажиллахаар болбол ийм зүйлийг ашиглах нь гарцаагүй.  

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

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

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

try
{
    Person person = new Person { Name = "Tom", Age = 17 };
}
catch (Exception ex)
{
    Console.WriteLine($"Алдаа: {ex.Message}");
}
 
class Person
{
    private int age;
    public string Name { get; set; } = "";
    public int Age
    {
        get => age;
        set
        {
            if (value < 18)
                throw new Exception("18 нас хүрээгүй бол бүртгэл хаалттай");
            else
                age = value;
        }
    }
}

Person классийн age шинжид утга олгохдоо шалгалт хийн нас 18 -аас бага бол онцгой нөхцлийг үүсгэнэ.

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

Өгөгдлийн төрлүүд хичээлд төрлүүд ямар утгууд авах, санах ойд хичнээн байт эзэлдэг Арифметик үйлдлүүд хичээлээр төрлүүдэд ямар үйлдлүүдийг хийх талаар үзсэн. C# хэл хатуу төрөлжилттэй хэл тул өгөгдлийн төрлүүд, тэдгээрийн хөрвүүлэлтийг сайн ойлгох хэрэгтэй. Төрлийн хувиргалтууд голдуу нэмэх үйлдлийн үед үүсдэг тул төрөл бүрийн өгөгдлүүдэд нэмэх үйлдлийг хийхийг үзье.

byte a = 4;
int b = a + 70;

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

Төлөв байдлын үүргийн гинж (Chain of responsibility) загварчлалын хэв шаардлагыг хэд хэдэн обьектууд боловсруулах боломжийг олгодог тул шаардлагын дамжуулагч хүлээн авагчтай хатуу уяа /холбоо/ үүсэхээс сэргийлдэг. Боломжит бүх боловсруулагчид гинж үүсгэн аль нэг обьект шаардлагыг боловсруулах хүртэл шаардлага өөрөө энэ гинжээр дамжина. Шаардлагыг хүлээн авсан обьект нэг бол шаардлагыг боловсруулна эсхүл шаардлагыг гүйцэтгүүлэхээр дараагийн обьектод шилжүүлдэг.

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

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

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

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

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

patt_12_01

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

Арифметик прогресийн 5-р гишүүн 8,4 харин 10-р гишүүн 14,4 тэнцүү бол энэ прогресийн 22-р гишүүнийг ол.

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

 

Дарааллын эхний n гишүүний нийлбэр томьёогоор өгөгджээ. Хэрэв энэ дараалал геометр прогресс бол q -г ол, арифметик прогресс бол d -г ол.

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

 

бол M·N=?

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