Програм зохиох жишээ 1

Практикгүй онол бол хоосон зүйл гэж ярьдаг. Иймээс энэ хичээлээр .NET Framework -ийн стандарт сан WinForms -ийг ашиглан бүрэн хэмжээний програмыг зохиох болно. Хичээлийн зорилго бол өмнөх хичээлүүдэд үзсэн бүх аргчлалуудыг практикт хэрхэн ашиглахыг сурах юм. Эдгээрээс  интерфейсийг ашиглахыг түлхүү үзэх болно. Бидний зохиох програм бол энгийн текст засварлагч байх бөгөөд дараах зүйлсийг хийдэг байхаар боловсруулагдана.

Үүнд:

  1. Текстэн файлыг нээх
  2. Файлын агуулгыг засварлах
  3. Засварлахаар нээгдсэн файлын тэмдэгтийн тоог үзүүлэх
  4. Файлд оруулсан өөрчлөлтийг хадгалах
  5. Файлын агуулгын текстийн фонтын хэмжээг ихэсгэх ба багасгах боломж

Эдгээрийг бид програмын техникийн даалгавар гэж үзэж болох юм. Ингээд програм зохиох ажлаа эхлэе.

Visual Studio дээр төсөл /project/ үүсгэх

Visual Studio -г нээгээд File->New->Project гэж ороход нээгдэх New Project цонхонд зурагт үзүүлснээр тохиргоо хийгээд Ok товчийг дарна.

Төслийн нэрийг TextEditor гэж өгье. Location талбарт төслийг хадгалах хавтасны нэрээ сонгон өгч болно. Ok товчийг дарахад Windows програмын суурь хэвээр төслийг үүсгэнэ.

Ажлын цонх хэсэгт форм, програмын кодын засвар гээд үндсэн ажлуудыг гүйцэтгэнэ. Solution Explorer цонхонд таны төслийн агуулга харагдана. Ажлын дэлгэц дээрх цонхнуудыг View цэсийг ашиглан удирдаж болно. Visual Studio -той ажиллах нь ердийн Windows програмтай ажиллахтай төстэй тул ажиллаж сурахад амархан. Иймд Visual Studio -гийн ажиллагааны талаар хичээлд нарийн авч үзэхгүй. Шаардлагатай зүйлийг тухай бүрд нь тэмдэглээд явна. Нэг шийдэл буюу Solution -д олон төслүүд байж болдог. Одоо манай шийдэлд Windows орчинд шууд ажиллах exe өргөтгөлтэй файл болон компиляц хийгдэх TextEditor гэсэн нэг төсөл байгаа. Бидэнд бас нэгэн төсөл хэрэгтэй. Үүний тулд Solution -ний нэр дээрээс баруун даралт хийхэд гарч ирэх цэснээс Add->New Project командыг өгөхөд шинэ төсөл үүсгэхтэй ижилхэн шинэ төсөл нэмэх цонх нээгдэнэ. Цонхны дунд хэсгээс төслийн төрлийг Class Library гэж сонгоод төслийн нэрийг TextEditor.BL гэж өгье. Ингэснээр манай шийдэл доорх бүтэцтэй боллоо.

Шийдэлд багтсан хоёр төслийн TextEditor нь манай програмын хэрэглэгчид ашиглах төрөл бүрийн удирдах элементүүдийг харуулах интерфейсийн үүргийг гүйцэтгэнэ. Хоёрдахь төсөл TextEditor.BL -нь програмын логикийг агуулсан DLL сан байх юм. Өөрөөр хэлбэл програмын техникийн даалгаварт заагдсан функцуудыг хэрэгжүүлнэ. Програмын хэрэглэгчийн интерфейсийн хэсэг програмын цөмд хэрэгжүүлсэн функцуудыг ашиглах боломжтой болгохын тулд програмын графикийн хэсэг буюу TextEditor төсөлд TextEditor.BL төслийн холбоосыг үүсгэх шаардлагатай. Үүний тулд TextEditor төслийн References хэсгээс баруун даралт хийхэд гарах цэснээс Add Reference цэсээр ороод нээгдэх цонхонд дараах тохиргоог хийгээд

OK товчийг дарахад TextEditor төслийн References хэсгийн жагсаалтад TextEditor.BL төсөл орж ирнэ. Одоо TextEditor төслөөс TextEditor.BL төслийн функцуудад хандах боломжтой боллоо.

Програмын бизнес логикийн кодчлол

Програмын боловсруулалтаа бид түүний суурь функцууд буюу цөмөөс эхлэе. Анхдагч байдлаар Visual Studio -гоос TextEditor.BL төсөлд үүсгэсэн Class1.cs нэртэй файлыг устгаад TextEditor.BL төсөлд FileManager.cs шинэ классыг нэмэн өгөөрэй. FileManager класст бид програмын техникийн даалгаварт тусгагдсан бүх функцуудыг хэрэгжүүлэх юм. Visual Studio классыг анхдагч байдлаар үүсгэхдээ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TextEditor.BL
{
    class FileManager
    {

    }
}

гэсэн кодыг оруулан өгдөг. FileManager класст гаднаас хандахын тулд түүнийг public хандалтын төрөлтэй болгох хэрэгтэй. Кодын дээд хэсэгт байгаа using гэсэн удирдамжаар анхдагч байдлаар ашиглах нэрийн орон зайнуудыг зааж байгаа. Жишээ нь using System; гэх мэтээр
namespace буюу нэрийн орон зай гэж юу вэ? Нэрийн орон зай гэдгийг классуудын хавтас гэж ойлгож болно. Классуудыг төрөл зориулалтаар нь өөр өөр нэрийн орон зайд /хавтасуудад/ байрлуулснаар тэдгээрийг илүү нарийн зааглан хандалтыг ойлгомжтой, амархан болгон өгдөг. Та компьютер дээрх файлуудаа бүгдийг нэг хавтаст байрлуулбал ямар байх билээ. Файлуудыг цэгцтэй байлгах үүднээс тэдгээрийг хавтаст хувиарлан байрлуулдагтай адилаар төслийн классуудыг нэрийн орон зай буюу хавтасуудад хуваан өгөх нь цэгцтэй болоод ойлгомжтой болгоно. Жишээ нь манай FileManager класс TextEditor.BL нэртэй нэрийн орон зайд байрлана.
Visual Studio төслийг үүсгэхдээ анхдагч байдлаар оруулан ирсэн нэрийн орон зайнууд ашиглагдахгүй байх нь бий. Ийм тохиолдолд тэдгээрийг төслөөс хасах хэрэгтэй. Үүнийг доорх зурагт үзүүлснээр хасан өгнө.

FileManager классын кодын using удирдамжуудын хэсэгт хулганы заагчийг аваачихад зураг дээрх улаан хүрээн доторх тэмдэг гарч ирэх бөгөөд дүрсний баруун байрлах товчийг дарахад ашиглагдахгүй байгаа орон зайны нэрүүдийг үзүүлнэ. Remove Unnecessary Usings даран  ашиглагдаагүй орон зайн using удирдамжуудыг устгаад файлтай ажиллахад шаардлагатай System.IO орон зай, тект, кодчлол гэх зэрэгтэй ажиллахад хэрэгтэй System.Text орон зайг using System.IO; , using System.Text; гэж нэмэн өгөөрэй.
Манай техникийн даалгаварын 1-р зүйлээр програм текстийн файлыг нээж чаддаг байх ёстой. Энэ функцийг FileManager класс доорх кодод үзүүлснээр хэрэгжүүлнэ.

using System.IO;
using System.Text;

namespace TextEditor.BL
{
    public class FileManager
    {
        public string GetContent(string filePath, Encoding encoding)
        {
            string content = File.ReadAllText(filePath, encoding);
            return content;
        }

    }
}

Бид класст эхний параметрээр файлын замыг, хоёрдахь параметрээр файлын кодчлолыг авах GetContent аргыг тодорхойлон өгсөн. Арга File статик классын ReadAllText аргыг ашиглан өгөгдсөн файлын агуулгыг content хувьсагчид уншин аваад түүнийг удирдах кодод буцаана. Кодод бид File классын хувийг үүсгэлгүй шууд ашиглаж байгаа учраас энэ нь статик класс гэдгийг бид урд нь үзсэн. File класс System.IO орон зайд байрладаг. Нэрийн орон зайнд ямар классууд байдгийг мэддэг байх шаардлагатай.
Бид ихэнх тохиолдолд тодорхой кодчлолтой /өөрөөр хэлбэл UTF/ файлуудыг ашиглана гэдгийг бодох хэрэгтэй. Үүний тулд GetContent аргын хэт ачаалалтай /overloaded/ зөвхөн файлын замыг параметрээр авах аргыг тодорхойлоод файлын кодчлолыг талбараар заан өгсөн кодыг нэмье.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        public string GetContent(string filePath)
        {
            return GetContent(filePath, _defaultEncoding);
        }

        public string GetContent(string filePath, Encoding encoding)
        {
            string content = File.ReadAllText(filePath, encoding);
            return content;
        }

    }

Кодод _defaultEncoding талбар үүсгээд түүнд анхдагч кодчлолын кодыг олгосон. Дараа нь хэт ачаалалтай зөвхөн файлын замыг параметрээр авах GetContent арга өмнө зарлагдсан байсан GetContent аргыг дуудахдаа _defaultEncoding талбарыг хоёрдахь параметр болгон дамжуулна. Ингэснээр бид програмын уян хатан байдлыг хангаж өгнө. Хэрвээ кодчлолыг заан өгөөгүй бол _defaultEncoding талбарын утгыг анхдагчаар авна. Үүнээс гадна нээх гэж байгаа файлын кодчлол _defaultEncoding талбарын утгаас өөр гэдгийг мэдэж байвал бид агуулыг уншихдаа түүний кодчлолыг шууд заан өгөх боломжтой. Хэт ачаалалтай аргын утга санаа үүнд л оршиж байгаа юм. Файлын агуулгыг унших ажиллагааг дээрх хоёр арга гүйцэтгэх болно.
Техникийн даалгаварын бас нэгэн шаардлага болох файлын агуулгыг хадгалах ажиллагааг нэмэн оруулъя.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

     // ...

        public void SaveContent(string content, string filePath)
        {
            SaveContent(content, filePath, _defaultEncoding);
        }

        public void SaveContent(string content, string filePath, Encoding encoding)
        {
            File.WriteAllText(filePath,content,encoding);
        }
    }

Файл хадгалах ажиллагаа нь агуулгыг уншихтай төстэй. Файлын агуулга, файлын зам, кодчлолыг параметрээр авах SaveContent арга File классын WriteAllText стандарт аргыг ашиглан агуулгыг заагдсан файлд хадгална. Үүний зэрэгцээ анхдагч кодчлолыг ашиглах SaveContent аргын хэт ачааллагдсан хувилбарыг тодорхойлсон.
Одоо FileManager класс файлын агуулгыг унших, түүнийг хадгалах боломжтой болсон. Гэхдээ дикс дээрх файлд хандахын өмнө тухайн файл үнэхээр байгаа эсэхийг шалгасан нь илүү. Файл байгаа эсэхийг шалгахын тулд IsExist аргыг

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        public bool IsExist(string filePath)
        {
            bool isExist = File.Exists(filePath);
            return isExist;
        }

        // ...
    }

гэж хэрэгжүүлье. Арга энгийн. Өгөгдсөн замаар файл байгаа эсэхийг File классын Exists стандарт аргыг ашиглан шалгана. Exists арга файл байвал True байхгүй бол False утгыг буцаана.   
Эцэст нь FileManager классын сүүлийн функционал болох файлын тэмдэгтийн тоолох GetSymbolCount аргыг тодорхойлон өгцгөөе.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        // ...

        public int GetSymbolCount(string content)
        {
            int count = content.Length;
            return count;
        }
    }

Арга файлын агуулгыг аваад түүний уртыг буцаах энгийн логиктой. FileManager классын аргуудын хэрэгжүүлэлтүүд танд их энгийн мэт санагдаж байж магадгүй. Энэ нь хичээлээр ямар нэгэн нарийн логиктой асуудлыг шийдэх програм зохиох зорилгыг тавиагүй харин програмыг хэрхэн зөв зохион байгуулах талаар үзэж байгаатай холбоотой. Иймээс жишээнд энгийн шийдэлтэй логикийг хэрэглэж байгаа юм. Таны програмын логик ямарч байсан програмаа хичээлд үзэж байгаа хэлбэрээр зохион байгуулах нь чухал. Програмын бүрдүүлэгчдийн зохион байгуулалтыг зөв хийх нь код бичихээс илүү нарийн төвөгтэй асуудал гэдгийг сайн тогтоон аваарай.

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

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

Боловсруулагчид C# дээр програм зохиохдоо голдуу Visual Studio эсхүл ямар нэгэн JetBrains компаний Rider мэтийн IDE (integrated development environment) боловсруулалтын хэрэгслийг ашигладаг. Гэхдээ бүхий л IDE -нууд боловсруулалтын ажиллагааг хөнгөвчилж өгдөг ч програм үүсгэх ажиллагааны олон жижиг зүйлүүдийг цаанаа хийдэг. Үнэн хэрэгтэй бид зөвхөн .NET CLI -ийн боломжийг ашиглан боловсруулалтын орчингүйгээр ажиллах боломжтой.

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

Бид өмнөх хичээлээр C# хэлний generalization буюу ерөнхийлөл гэдэг төрөл бүрийн обьектуудын төлөв байдлын хэвийг тодорхойлох механизмын талаар үзсэн. Энэ удаагийн хичээлээр сэдвийг үргэлжлүүлэн авч үзэцгээе. Ерөнхийлөлд тодорхой хязгаарлалтууд үйлчилдэг.

Ерөнхийлөлийн хязгаарлалт  

Ерөнхийлөлд тавигдах хязгаарлалтууд түүнтэй ажиллах ажиллагааг илүү уян хатан болгодог нь сонирхолтой.

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

Бүх классууд ямар нэгэн орон зайд агуулагдан эдгээрийг ашиглахын тулд тэдний орон зайг холбох эсхүл орон зайн нэртэй холбосон классийн бүрэн нэрийг ашиглах хэрэгтэй ч Visual Studio 2022 , .NET 6 , C# 10 -аас эхлэн бид програмийн файлд зүгээр л

Console.WriteLine("Hello");

гэж бичиж болдог болсон. Ингэхдээ Console классийг агуулдаг System нэрийн орон зайг илээр оруулан ирээгүй ч энэ класст төслийн C# кодийн дурын файлаас хандаж болно.

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

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

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

хэрэгтэй.

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

Класс ба структурт ердийн талбар, арга, шинжүүдээс гадна статик талбар, арга, шинжүүд байж болдог. Статик талбар, арга, шинжүүд…

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

 

Хичээлээр useState -тэй тун төстэй useRef хукийн талаар авч үзье. useRef хукийн онцлог ашиглалтыг компонент хэдэн удаа дахин…

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

 

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

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

 

Нийтлэлээр графикийн хэвүүдийн /GUI pattern/ түүхийг авч үзье. Боловсруулалтын графикийн хэвүүдийг 30 гаруй жилийн туршид боловсруулж байгаа бөгөөд…

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

 

Хааяа өөр өөр параметрүүдийн багцтай нэг аргыг үүсгэх шаардлага гардаг. Ирсэн параметрүүдээс хамааран аргын тодорхой хэрэгжүүлэлтийг хэрэглэнэ. Ийм…

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

 

Ямарч програмын ажиллагааны чухал хэсэг бол төрөл бүрийн мэдээллийн боловсруулалт, тэдгээртэй ажиллахтай холбоотой байдаг. Иймээс энэ хичээлээс vuejs

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

 

Хичээлээр react -ийн хукуудаас их өргөн ашиглагддаг useEffect -ийн талаар авч үзье. useEffect -ийн ажиллагааг судлах хуудасны кодийг

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

 

Илэрхийлэл бол математикийн хэлний үндэс болсон суурь ойлголтуудын нэг. Математикийн илэрхийллийг тооцооны алгоритм, аксиом, теорем, бодлогын нөхцлүүд гээд…

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

 

Програм зохиох бол нарийн төвөгтэй ажил. Ямар ч програмын хувьд өөрийн хийх ажлаа гүйцэтгэхийн чацуу цаашдаа хөгжих, ажлын…

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