Теория22
Компоненттік бағдарламалау технологиялары
-
Бағдарламалаудың қандай заманауи парадигмалары бар?
Қазіргі заманғы бағдарламалаудың негізгі парадигмалары:
• Процедуралық (Procedural) — бағдарлама нұсқаулар тізбегінен тұрады (C, Pascal).
• Объектіге бағытталған (OOP) — деректер мен мінез-құлықты объектілерге біріктіреді (Java, C#, Python).
• Функционалдық (Functional) — функциялар негізінде есептеу жүргізіледі, жанама әсерлер болмайды (Haskell, F#).
• Декларативті (Declarative) — «не істеу керек» анықталады, «қалай» емес (SQL, HTML).
• Компоненттік (Component-based) — дайын компоненттерді қайта пайдалануға негізделген.
• Реактивті (Reactive) — деректер ағынына және өзгерістерге жауап беруге бағытталған (RxJS).
• Аспектіге бағытталған (AOP) — кросс-функционалды логиканы бөледі (Spring AOP). -
Процедуралық және объектіге бағытталған бағдарламалаудың айырмашылығы неде?
Процедуралық бағдарламалауда бағдарлама функциялар (процедуралар) жиынтығынан тұрады. Деректер мен функциялар бөлек болады, мысалы C тілінде. Негізгі ойлау тәсілі: «не істеу керек?».
Объектіге бағытталған бағдарламалауда деректер мен мінез-құлық объект ішінде бірге сақталады. Бағдарлама объектілер жиынтығы ретінде қарастырылады. Кодтың қайта пайдаланылуы, модульділігі жоғары. Инкапсуляция, тұқымқуалау, полиморфизм қолданылады.
Негізгі айырмашылық: процедуралықта деректер мен функциялар бөлек, ООП-та олар объектіде біріктірілген.
-
Объектіге бағытталған тәсілдің қандай артықшылықтары бар?
ООП тәсілінің негізгі артықшылықтары:
• Модульділік — код бөліктерге бөлінеді, жеке өзгертуге болады.
• Қайта пайдалану — тұқымқуалау арқылы бар кодты кеңейтуге болады.
• Қолдаудың жеңілдігі — код түсінікті, жүйелі болады.
• Инкапсуляция — ішкі іске асыруды жасырады, интерфейс арқылы қол жеткізіледі.
• Икемділік — полиморфизм арқылы бірдей интерфейс әртүрлі жұмыс жасайды.
• Нақты дүниені модельдеу — нысандар мен объектілердің байланысы табиғи. -
Декларативті және императивті бағдарламалау дегеніміз не?
Императивті бағдарламалауда бағдарламашы «қалай жасау керек» деген нұсқаулар тізбегін жазады. Машинаның орындау қадамдары нақты көрсетіледі. Мысалы: C, Java, Python циклдары.
Декларативті бағдарламалауда бағдарламашы «не алғысы келетінін» сипаттайды, ал орындау тәсілі жүйеге қалдырылады. Мысалдар: SQL сұраныстары, HTML разметкасы, функционалдық тіл конструкциялары.
Мысал: «Тізімнен жұп сандарды алу» — императивте цикл жазылады, декларативте filter() функциясы қолданылады.
- Компоненттік тәсілдің ООП-қа қарағанда ерекшелігі қандай?
ООП кластар мен объектілер деңгейінде жұмыс жасайды, ал компоненттік тәсіл дербес, орналастырылуы мүмкін бірліктер — компоненттер деңгейінде жұмыс жасайды.
Компоненттік тәсілдің ерекшеліктері:
• Компонент «қара жәшік» (black box) ретінде қарастырылады — ішкі іске асыруы жасырылады.
• Компоненттер дербес орналастырылады (deployment) және ауыстырылады.
• Тілге тәуелсіздік — әртүрлі тілдерде жазылған компоненттер бірге жұмыс жасай алады.
• Нақты келісімшарт (contract) — интерфейс арқылы өзара байланысады.
• ООП қайта пайдалануды тұқымқуалау арқылы жасайды, компоненттік тәсіл — композиция арқылы.
-
ООП-тың негізгі принциптерін атаңыз.
ООП-тың төрт негізгі принципі:
• Инкапсуляция (Encapsulation) — деректер мен мінез-құлықты бір объектіде біріктіру және сыртқы қол жеткізуді шектеу.
• Тұқымқуалау (Inheritance) — бір класс екінші класстан қасиеттер мен әдістерді мұраға алады.
• Полиморфизм (Polymorphism) — бір интерфейс арқылы әртүрлі объектілермен жұмыс жасау мүмкіндігі.
• Абстракция (Abstraction) — маңызды белгілерді ерекшелеп, маңызсыздарын жасыру. -
Тұқымқуалау (наследование) дегеніміз не және оның түрлері қандай?
Тұқымқуалау — бір класстың (ұрпақ класс) екінші класстан (ата класс) қасиеттері мен әдістерін мұраға алу механизмі.
Түрлері:
• Жалғыз тұқымқуалау (Single) — бір ата класстан мұраға алу (C#, Java).
• Көп тұқымқуалау (Multiple) — бірнеше ата класстан мұраға алу (C++). C# тілінде интерфейстер арқылы жүзеге асырылады.
• Көп деңгейлі (Multilevel) — A → B → C тізбегімен мұраға алу.
• Иерархиялық (Hierarchical) — бір ата класстан бірнеше ұрпақ класс мұраға алады.
• Гибридтік (Hybrid) — жоғарыдағы түрлердің комбинациясы.
Мысал (C#): class Animal { } → class Dog : Animal { }
- Полиморфизм дегеніміз не және ол қалай жүзеге асады?
Полиморфизм — бір атпен әртүрлі объектілерде әртүрлі мінез-құлық орындалу мүмкіндігі.
Жүзеге асу тәсілдері:
• Компиляция кезіндегі полиморфизм — әдістерді қайта жүктеу (overloading): бірдей атпен, бірақ әртүрлі параметрлермен әдістер.
• Орындалу кезіндегі полиморфизм — виртуалды әдістерді қайта анықтау (overriding): ата класс әдісін ұрпақ класс өзінше іске асырады.
Мысал: Animal базалық класының Speak() әдісі бар. Dog класы Speak() = «Ау», Cat класы Speak() = «Мяу» деп қайта анықтайды. Animal типіндегі айнымалы арқылы шақырғанда нақты класстың әдісі орындалады.
- Инкапсуляция дегеніміз не? Мысал келтіріңіз.
Инкапсуляция — объектінің ішкі деректерін жасыру және оларға қол жеткізуді арнайы әдістер (getter/setter) арқылы ғана рұқсат ету принципі.
Мақсаттары:
• Деректердің бүтіндігін сақтау.
• Ішкі іске асыруды сыртқы кодтан тәуелсіз өзгерту мүмкіндігі.
• Қателіктерді азайту.
Мысал (C#):
class BankAccount {
private decimal balance;
public void Deposit(decimal amount) {
if (amount > 0) balance += amount;
}
public decimal GetBalance() { return balance; }
}
Мұнда balance тікелей өзгертілмей, тек Deposit() арқылы өзгертіледі.
- Абстракцияны ООП-да қалай жүзеге асыруға болады?
Абстракция — нысанның тек маңызды қасиеттерін ерекшелеп, қалғанын жасыру принципі.
Жүзеге асу тәсілдері:
• Абстракт кластар (abstract class) — іске асырылмаған әдістері бар кластар. Тікелей нысан жасалмайды.
• Интерфейстер (interface) — тек сигнатуралар жиынтығы, іске асыруды міндеттейді.
Мысал: Shape абстракт класының Draw() абстракт әдісі бар. Circle, Rectangle кластары Draw() әдісін өз бетінше іске асырады. Пайдаланушы Shape арқылы жұмыс жасайды, нақты іске асырудың мәні жоқ.
- Интерфейс пен абстракт сыныптың айырмашылығы неде?
Абстракт класс:
• Іске асырылған және іске асырылмаған әдістері болуы мүмкін.
• Конструктор, өрістер болуы мүмкін.
• Жалғыз тұқымқуалау (бір ата класс ғана).
• Байланысты кластар үшін ортақ базалық логика ұсынады.
Интерфейс:
• Тек сигнатуралар (C# 8.0-дан бастап default реализация болуы мүмкін).
• Өрістер болмайды (тек қасиеттер).
• Бір класс бірнеше интерфейсті іске асыра алады.
• «Не істей алады» деген келісімшартты анықтайды.
Таңдау ережесі: байланысты кластар үшін — абстракт класс; байланысы жоқ кластарға ортақ мінез-құлық үшін — интерфейс.
- Әдістерді қайта жүктеу (overload) мен қайта анықтау (override) деген не?
Қайта жүктеу (Overloading) — бір класста бірдей атпен бірақ әртүрлі параметрлері бар бірнеше әдіс анықтау. Компиляция кезінде шешіледі (статикалық полиморфизм).
Мысал: int Add(int a, int b) және double Add(double a, double b).
Қайта анықтау (Overriding) — ұрпақ класста ата класстың виртуалды/абстракт әдісін өзінше іске асыру. Орындалу кезінде шешіледі (динамикалық полиморфизм).
Мысал: ата класта virtual void Draw() бар, ұрпақ класта override void Draw() арқылы қайта анықталады.
Айырмашылық: overload — бір класста, compile-time; override — ата-ұрпақ байланысында, runtime.
- Композиция мен агрегация деген не?
Екеуі де объектілер арасындағы «бар» (HAS-A) байланысын білдіреді, бірақ айырмашылықтары бар.
Композиция (Composition) — күшті байланыс. Бөлік тек ие объектіге тиесілі, ие жойылса бөлік те жойылады.
Мысал: Адам — Жүрек. Адам жойылса, жүрек де жойылады.
Агрегация (Aggregation) — әлсіз байланыс. Бөлік ие объектіден тәуелсіз өмір сүре алады.
Мысал: Университет — Профессор. Университет жабылса да, профессор өмір сүре береді.
Есте сақтау ережесі: Композиция = «тиесілі», Агрегация = «байланысты».
- Конструктор мен деструктордың рөлі қандай?
Конструктор (Constructor) — объект жасалған кезде автоматты шақырылатын арнайы әдіс. Мақсаты: объектінің алғашқы күйін орнату, ресурстарды бөлу.
Түрлері: параметрсіз (default), параметрлі, көшіру конструктор (copy constructor).
Деструктор (Destructor) — объект жойылған кезде шақырылатын арнайы әдіс. Мақсаты: бөлінген ресурстарды босату (файлдар, байланыстар, жад).
.NET-та қоқысты жинаушы (GC) жадты автоматты басқарады, сондықтан деструктор орнына IDisposable/Dispose() үлгісі қолданылады. C++-та деструктор критикалық рөл атқарады.
- SOLID принциптері деген не және олар қалай қолданылады?
SOLID — объектіге бағытталған дизайнның 5 принципі:
• S — Single Responsibility (Жалғыз жауапкершілік): Класстың тек бір өзгерту себебі болуы керек.
• O — Open/Closed (Ашық/Жабық): Класс кеңейтуге ашық, өзгертуге жабық болуы керек.
• L — Liskov Substitution (Лисков алмастыруы): Ата класс орнына ұрпақ класс қойса, бағдарлама дұрыс жұмыс жасауы керек.
• I — Interface Segregation (Интерфейсті бөлу): Клиент қажет емес әдістерді іске асыруға мәжбүр болмауы керек.
• D — Dependency Inversion (Тәуелділіктің инверсиясы): Жоғары деңгейлі модульдер төменгі деңгейліге емес, абстракцияға тәуелді болуы керек.
Бұл принциптер кодтың оқылуын, тексерілуін және қолдануын жеңілдетеді.
- Компонент дегеніміз не және ол кластан қалай ерекшеленеді?
Компонент — дербес орналастырылатын, белгілі бір функционалды қамтитын, нақты интерфейс арқылы өзге жүйелермен байланысатын бағдарламалық бірлік.
Кластан айырмашылығы:
• Класс — тек код деңгейіндегі абстракция; компонент — орналастыру деңгейіндегі бірлік.
• Компонент «қара жәшік» — ішкі іске асыруы жасырылған.
• Компонент тілге тәуелсіз — әртүрлі тілдерде жазылған компоненттер бірге жұмыс жасай алады.
• Компонент версияланады, жеке орналастырылады, ауыстырылады.
• Мысал: .NET-тағы Assembly, Java-дағы JAR файлы — компоненттің іске асырылуы.
- Компоненттік бағдарламалау ООП-ты қалай дамытады?
Компоненттік бағдарламалау ООП принциптерін сақтай отырып, оны жаңа деңгейге апарады:
• ООП объект деңгейінде қайта пайдалануды қамтамасыз етсе, компоненттік тәсіл бүкіл модуль деңгейінде жасайды.
• Компоненттер бинарлық деңгейде қайта пайдаланылады — бастапқы кодты ашудың қажеті жоқ.
• Тілдер аралық өзара әрекеттестік мүмкін болады.
• Нұсқаларды (versioning) тәуелсіз басқаруға болады.
• Жүйені бөліктерге бөліп, әр бөлікті дербес жасауға, тексеруге мүмкіндік береді.
• Нәтижесінде бағдарламалық жасақтаманы жинақтаудың (software assembly) мүмкіндігі туады.
- Компоненттерді қайта пайдалану дегеніміз не?
Компоненттерді қайта пайдалану (Reuse) — бір рет жасалған компонентті бірнеше жобада немесе жүйенің әртүрлі бөліктерінде қолдану мүмкіндігі.
Артықшылықтары:
• Даму уақытын қысқартады.
• Сыналған, сенімді кодты қайта пайдалану арқылы сапаны арттырады.
• Шығындарды азайтады.
• Стандарттылықты қамтамасыз етеді.
Талаптар:
• Компонент жалпы мақсатты болуы керек.
• Жақсы құжатталған болуы керек.
• Нақты, тұрақты интерфейсі болуы керек.
• Тәуелділіктері минималды болуы керек.
Мысалдар: .NET-тың стандартты кітапханасы, NuGet пакеттері.
- Компоненттік контракт дегеніміз не?
Компоненттік контракт — компонент пен оны пайдаланушы арасындағы ресми келісім. Контракт компоненттің:
• Не ұсынатынын (provided interface) — экспорттайтын интерфейстер.
• Не қажет ететінін (required interface) — тәуелді болатын интерфейстер.
• Алдын ала шарттарын (preconditions) — шақырудан бұрын орындалуы керек шарттар.
• Кейінгі шарттарын (postconditions) — шақырудан кейін кепілденетін нәтижелер.
• Инвариантарын — компонент барлық уақытта ұстануы керек шарттар.
Анықтайды. Контракт сақталса, ішкі іске асырудың өзгеруі пайдаланушыны сындырмайды.
- Компоненттер арасындағы әлсіз байланыс (loose coupling) деген не?
Әлсіз байланыс (Loose Coupling) — компоненттердің бір-біріне минималды тәуелді болуы принципі. Яғни, бір компоненттің өзгеруі басқа компоненттерге аз әсер етеді.
Жүзеге асыру тәсілдері:
• Интерфейстер арқылы байланысу — нақты іске асыруға емес, абстракцияға тәуелді болу.
• Оқиғалық модель (Event-driven) — компоненттер тікелей шақырмай, оқиғалар арқылы байланысады.
• Тәуелділікті енгізу (Dependency Injection) — тәуелділіктер сырттан беріледі.
• Делдал (Mediator) үлгісі — компоненттер тікелей емес, делдал арқылы байланысады.
Артықшылықтары: компоненттерді тәуелсіз тестілеу, ауыстыру, дамыту мүмкіндігі.
- Компонент интерфейсі дегеніміз не және ол қалай қолданылады?
Компонент интерфейсі — компоненттің сыртқы дүниемен байланысатын нүктелерінің жиынтығы. Интерфейс компоненттің «не ұсынатынын» немесе «не қажет ететінін» сипаттайды.
Түрлері:
• Ұсынылатын интерфейс (Provided) — компонент экспорттайтын функционал.
• Талап етілетін интерфейс (Required) — компоненттің жұмысы үшін қажетті сыртқы функционал.
Пайдалану:
• Компоненттерді іске асыруынан бөлек анықтайды.
• Клиент коды интерфейспен жұмыс жасайды, нақты класспен емес.
• Нысандарды ауыстыруға мүмкіндік береді.
C# мысалы: ILogger интерфейсін FileLogger немесе ConsoleLogger іске асырады.
- Компоненттік бағдарламалаудың қандай стандарттары бар?
Компоненттік бағдарламалаудың негізгі стандарттары мен технологиялары:
• COM/COM+ (Component Object Model) — Microsoft-тың Windows компоненттік стандарты.
• CORBA (Common Object Request Broker Architecture) — платформааралық, тілге тәуелсіз стандарт.
• EJB (Enterprise JavaBeans) — Java Enterprise компоненттер стандарты.
• .NET Assembly — Microsoft .NET платформасының компоненттік моделі.
• OSGi — Java-да динамикалық компоненттер жүйесі.
• WebAssembly (WASM) — заманауи браузерлік компоненттер стандарты.
• UML компонент диаграммалары — архитектуралық сипаттау стандарты.
Барлық стандарттар: тіл тәуелсіздігін, нұсқаларды басқаруды, интерфейстер арқылы байланысуды қамтамасыз етеді.
- Компонентке қатысты «қара жәшік» (black box) түсінігі қандай?
«Қара жәшік» (Black Box) — компонент оның ішкі іске асыруын жасырып, тек интерфейсін ашатын принцип.
Мағынасы:
• Пайдаланушы компоненттің ішінде не болатынын білудің қажеті жоқ.
• Тек кіріс (input) пен шығысты (output) біледі.
• Ішкі логика толық жасырылған.
Артықшылықтары:
• Іске асыруды еркін өзгертуге болады — пайдаланушы байқамайды.
• Зияткерлік меншікті қорғайды.
• Күрделілікті жасырады.
• Тестілеуді жеңілдетеді.
Қарама-қарсы тұжырым: «ақ жәшік» (white box) — ішкі код толық ашық.
- Компоненттер арасындағы өзара әрекеттестік қалай жүзеге асады?
Компоненттер арасындағы өзара әрекеттестіктің негізгі механизмдері:
• Интерфейстер арқылы тікелей шақыру — бір компонент екіншісінің интерфейс әдісін шақырады.
• Оқиғалар мен делегаттар (Events/Delegates) — компоненттер оқиғаларға жазылады (subscribe/publish).
• Хабарламалар (Message Passing) — компоненттер хабарламалар кезегі арқылы байланысады (асинхронды).
• Қашықтан шақыру (RPC/gRPC) — желі арқылы компоненттер шақырылады.
• REST/HTTP API — веб-компоненттер HTTP сұраныстары арқылы байланысады.
• Ортақ деректер қоймасы — компоненттер дерекқор немесе кэш арқылы байланысады.
Таңдау жүйенің талаптарына байланысты: синхронды/асинхронды, жергілікті/желілік.
- Компоненттік жүйелердегі оқиғалық модель (event-driven model) деген не?
Оқиғалық модель (Event-Driven Model) — компоненттер тікелей шақырудың орнына оқиғалар (events) арқылы байланысатын архитектуралық тәсіл.
Жұмыс принципі:
• Оқиға шығарушы (Publisher/Producer) — оқиға орнатады.
• Оқиға тыңдаушы (Subscriber/Consumer) — оқиғаны күтіп, шақырылғанда жауап береді.
• Оқиға брокері (Event Bus/Message Broker) — оқиғаларды тарата алады.
Артықшылықтары:
• Компоненттер арасындағы байланыс өте әлсіз.
• Асинхронды жұмыс мүмкіндігі.
• Жаңа тыңдаушылар оңай қосылады.
Мысалдар: C# делегаттары мен оқиғалары, JavaScript DOM events, Apache Kafka.
- Компоненттік тәсілдің негізгі қағидалары қандай?
Компоненттік тәсілдің негізгі қағидалары:
• Дербестік (Autonomy) — компонент тәуелсіз орналастырылады және жаңартылады.
• Инкапсуляция — ішкі іске асыру жасырылады.
• Қайта пайдалану (Reusability) — компонент бірнеше контекстте қолданыла алады.
• Ауыстырылуы (Replaceability) — бірдей интерфейсті іске асырған компонент ауыстырылады.
• Контракт негізінде байланысу — интерфейстер мен спецификациялар арқылы.
• Нұсқалық үйлесімділік (Versioning) — жаңа нұсқа ескі клиенттерге кері үйлесімді болады.
• Композициялық архитектура — үлкен жүйелер шағын компоненттерден жиналады.
- Компоненттердің қайта пайдаланылуы мен кеңейтілуі қалай қамтамасыз етіледі?
Қайта пайдалануды қамтамасыз ету жолдары:
• Жалпы мақсатты интерфейстер жасау.
• Компоненттің нақты тәуелділіктерін минималдау.
• Параметрлеу (параметр арқылы конфигурация).
• Нұсқаларды тұрақты ұстау.
Кеңейтілуді қамтамасыз ету жолдары:
• Кеңейту нүктелері (Extension Points) қарастыру.
• «Ашық/жабық» SOLID принципін сақтау.
• Plugin архитектурасы — жаңа мүмкіндіктер плагин ретінде қосылады.
• Тәуелділікті енгізу (DI) — тәуелділіктерді сырттан ауыстыруға болады.
• Тұқымқуалау немесе декоратор үлгісі арқылы функционалды кеңейту.
- Компоненттердің үйлесімділігі қалай қамтамасыз етіледі?
Компоненттер үйлесімділігінің түрлері:
• Бинарлық үйлесімділік — ескі компиляцияланған код жаңа нұсқамен жұмыс жасайды.
• Бастапқы код үйлесімділігі — ескі код жаңа нұсқамен қайта компиляциялана алады.
• Семантикалық үйлесімділік — мінез-құлықтың өзгермеуі.
Қамтамасыз ету жолдары:
• Интерфейстерді тұрақты ұстау, өзгерістерді жаңа нұсқаға тасымалдау.
• Семантикалық нұсқалау (SemVer) қолдану: MAJOR.MINOR.PATCH.
• Ескірген функционалды бірден жоймай, deprecated белгілеп, уақыт беру.
• .NET-та Assembly нұсқасын GAC-та тіркеу.
• COM-да интерфейс GUID-ін өзгертпеу.
- Компоненттік модель дегеніміз не?
Компоненттік модель — компоненттерді жасауға, байланыстыруға және орналастыруға арналған ережелер, стандарттар мен инфрақұрылым жиынтығы.
Компоненттік модель анықтайды:
• Компонент қандай форматта болу керек.
• Интерфейстер қалай сипатталады.
• Компоненттер бір-бірімен қалай байланысады.
• Өмірлік циклді кім басқарады.
• Нұсқалар қалай басқарылады.
Мысалдар:
• .NET компоненттік моделі — Assembly, CLR, CTS негізінде.
• EJB моделі — Java EE контейнері басқарады.
• COM моделі — Windows реестрі мен интерфейс IUnknown негізінде.
• OSGi моделі — Java bundle-дар динамикалық жүктеледі.
-
Компоненттің өмірлік циклі қандай кезеңдерден тұрады?
Компоненттің өмірлік циклі (Lifecycle) мына кезеңдерден тұрады: -
Талдау (Analysis) — компоненттің мақсаты, функционалы анықталады.
-
Жобалау (Design) — интерфейстер, архитектура, тәуелділіктер жасалады.
-
Іске асыру (Implementation) — код жазылады.
-
Тестілеу (Testing) — бірлік, интеграция, регрессия тесттері орындалады.
-
Орауыш жасау (Packaging) — DLL, JAR немесе NuGet пакеті жасалады.
-
Орналастыру (Deployment) — жүйеге орнатылады.
-
Пайдалану (Runtime) — компонент жұмыс жасайды: жасалады, конфигурацияланады, іске асады.
-
Техникалық қызмет (Maintenance) — жаңартулар, қателерді жөндеу.
-
Зейнеткерлік (Retirement) — ескірген компонент deprecated белгіленеді, жойылады.
-
Компоненттерді орау (packing) және орналастыру (deployment) қалай жүргізіледі?
Орау (Packaging):
• .NET-та: csproj файлы арқылы Assembly (.dll/.exe) жасалады. NuGet пакеті (.nupkg) ретінде таратылады.
• Java-да: JAR/WAR/EAR файлдары.
• Пакетте: компиляцияланған код, метадеректер, ресурстар, тәуелділіктер тізімі болады.
Орналастыру (Deployment) тәсілдері:
• XCOPY орналастыру — файлдарды көшіру арқылы.
• GAC (Global Assembly Cache) — .NET-тағы ортақ компоненттер репозиторийі.
• NuGet/Maven/npm — пакет менеджерлері арқылы.
• Docker контейнерлері — компонент ортасымен бірге оралады.
• CI/CD pipeline — автоматты орналастыру процесі.
Нұсқаларды бір уақытта қолдау (side-by-side execution) .NET-та GAC арқылы мүмкін.
- .NET контексінде «жинақ» (assembly) деген не?
.NET-тағы Assembly — компиляцияланған кодтың орналастыру бірлігі. Бұл .dll немесе .exe форматындағы файл.
Assembly құрамы:
• IL (Intermediate Language) коды — платформатәуелсіз аралық код.
• Метадеректер (Metadata) — типтер, әдістер, қасиеттер туралы ақпарат.
• Манифест (Manifest) — Assembly атауы, нұсқасы, тәуелділіктер.
• Ресурстар — суреттер, жолдар, т.б.
Түрлері:
• Private Assembly — тек бір қосымша пайдаланады.
• Shared Assembly — GAC-та тіркелген, бірнеше қосымша қолданады.
• Satellite Assembly — локализация ресурстары үшін.
Assembly .NET-тағы компонентті орналастырудың негізгі бірлігі болып табылады.
- Компоненттердің нұсқаларын басқару қалай жүргізіледі?
Нұсқаларды басқару (Versioning) тәсілдері:
• Семантикалық нұсқалау (SemVer): MAJOR.MINOR.PATCH форматы. MAJOR — кері үйлесімсіз өзгерістер, MINOR — жаңа функционал, PATCH — қате жөндеу.
• .NET-та Assembly нұсқасы:
- AssemblyVersion — CLR нұсқасы.
- AssemblyFileVersion — файл нұсқасы.
- AssemblyInformationalVersion — адамға арналған нұсқа.
• GAC side-by-side execution — бір компоненттің бірнеше нұсқасын қатар орнатуға болады.
• NuGet — пакет тәуелділіктерін нұсқасымен бірге басқарады.
• Deprecated белгілеу — ескі нұсқаны бірден жоймай, Obsolete атрибуты қойылады.
- Компоненттер қалай тестіленеді?
Компоненттерді тестілеу деңгейлері:
• Бірлік тестілеу (Unit Testing) — компоненттің жеке әдістерін тестілеу. Жалған нысандар (Mock/Stub) пайдаланылады. Мысал: xUnit, NUnit (C#), JUnit (Java).
• Компонент тестілеу (Component Testing) — бүкіл компонентті изоляцияда тестілеу.
• Интеграциялық тестілеу (Integration Testing) — бірнеше компоненттің бірге жұмысын тестілеу.
• Контракт тестілеу (Contract Testing) — компонент интерфейс контрактысын сақтайтынын тексеру.
Үздік тәжірибелер:
• Тестілеуге ыңғайлы дизайн — DI, интерфейстер.
• Автоматтандырылған CI/CD тесттері.
• Код жабындылығы (Code Coverage) өлшеу.
- Инверсия управления және тәуелділікті енгізу (Dependency Injection) дегеніміз не?
Басқарудың инверсиясы (IoC — Inversion of Control) — объектілердің өздері тәуелділіктерін жасамайды, оларды сырттан алатын принцип.
Тәуелділікті енгізу (DI — Dependency Injection) — IoC-ты іске асырудың нақты тәсілі. Тәуелділіктер сырттан берілетін механизм.
Енгізу тәсілдері:
• Конструктор арқылы (Constructor Injection) — ең жиі қолданылатын тәсіл.
• Қасиет арқылы (Property Injection).
• Әдіс арқылы (Method Injection).
Артықшылықтары:
• Кодтың тестілеуі жеңіл — Mock нысандар оңай беріледі.
• Байланыс төмен — компоненттер нақты іске асыруға тәуелді емес.
• Конфигурация арқылы ауыстыруға болады.
Мысал: ASP.NET Core IoC контейнері services.AddScoped<ILogger, FileLogger>();
- .NET платформасының негізгі архитектуралық ерекшеліктері қандай?
.NET платформасының архитектуралық ерекшеліктері:
• Ортақ тіл орындалу ортасы (CLR) — IL кодын орындайды, жадты басқарады.
• Ортақ тип жүйесі (CTS) — барлық .NET тілдеріне бірыңғай тип жүйесі.
• Ортақ тіл спецификациясы (CLS) — тілдер аралық өзара жұмыс ережелері.
• Негізгі класс кітапханасы (BCL) — дайын класстар мен компоненттер жиынтығы.
• Assembly негізіндегі компоненттік модель.
• Тілге тәуелсіздік — C#, F#, VB.NET, т.б. бір CLR-де жұмыс жасайды.
• Кросс-платформалық қолдау — .NET 5+ нұсқаларынан Windows, Linux, macOS.
• JIT компиляция — IL орындалу кезінде машина кодына аударылады.
- CLR (Common Language Runtime) деген не?
CLR (Common Language Runtime) — .NET қосымшаларын орындайтын виртуалды машина.
CLR атқаратын негізгі міндеттер:
• IL кодын JIT арқылы машина кодына аудару.
• Жадты басқару (Memory Management) — объектілерді heap-те орналастыру.
• Қоқысты жинау (Garbage Collection) — пайдаланылмаған объектілерді тазалау.
• Тип қауіпсіздігін (Type Safety) қамтамасыз ету.
• Қатені өңдеу (Exception Handling) механизмі.
• Ағындарды (Threads) басқару.
• Қауіпсіздік саясатын (Code Access Security) орындау.
• Метадеректерді жүктеу және рефлексияны (Reflection) қолдау.
CLR басқарылатын (managed) кодтың жұмысын толық бақылайды.
- CTS (Common Type System) рөлі қандай?
CTS (Common Type System) — .NET-тің барлық тілдеріне ортақ тип жүйесі.
ЦТС рөлі:
• Тілдер аралық өзара жұмысты (interoperability) қамтамасыз ету. C#-та жасалған класс VB.NET-та қолданыла алады.
• Барлық .NET тілдеріне бірыңғай тип иерархиясын береді.
• Барлық типтер System.Object-тен туындайды.
Негізгі тип санаттары:
• Мән типтері (Value Types) — struct, enum, примитивтер. Stack-та сақталады.
• Анықтамалық типтер (Reference Types) — class, interface, delegate, array. Heap-та сақталады.
• Указательдер (Pointers) — unsafe кодта.
CTS тілдер аралық компонент алмасуының негізі болып табылады.
- .NET-тағы жинақ (assembly) құрылымы қандай?
.NET Assembly — компиляцияланған кодтың логикалық контейнері. Физикалық форматы PE (Portable Executable) — .dll немесе .exe.
Assembly ішкі құрылымы:
• Манифест (Assembly Manifest) — Assembly атауы, нұсқасы, мәдениеті, тәуелділіктер тізімі, ішіндегі файлдар тізімі.
• Тип метадеректері (Type Metadata) — экспортталатын типтер, олардың мүшелері туралы ақпарат.
• IL коды (MSIL) — компиляцияланған, платформатәуелсіз код.
• Ресурстар — кірістірілген мәтіндер, суреттер, т.б.
Assembly бір немесе бірнеше модульден (module) тұрауы мүмкін. Assembly шекарасы қауіпсіздік, нұсқалау және орналастырудың бірлігі болып табылады.
- .NET-та қосымшалар архитектурасы қалай ұйымдастырылған?
.NET қосымшалар архитектурасының негізгі деңгейлері:
• Презентация деңгейі (Presentation Layer) — пайдаланушы интерфейсі (ASP.NET MVC, Blazor, WPF, MAUI).
• Бизнес логика деңгейі (Business Logic Layer) — қолданбалық логика.
• Деректерге қол жеткізу деңгейі (Data Access Layer) — Entity Framework, Dapper, ADO.NET.
• Деректер сақтау деңгейі — SQL Server, PostgreSQL, т.б.
Жиі қолданылатын архитектуралар:
• N-Tier (N-деңгейлі) архитектура.
• Clean Architecture — тәуелділіктер ішке қарай бағытталады.
• Domain-Driven Design (DDD) — домен моделі орталықта.
• Microservices — әр сервис дербес .NET қосымшасы.
Dependency Injection Container (IoC) барлық деңгейлерді байланыстырады.
- Басқарылатын (managed) және басқарылмайтын (unmanaged) код дегеніміз не?
Басқарылатын код (Managed Code):
• CLR бақылауында орындалатын код.
• Жады автоматты басқарылады (GC).
• Тип қауіпсіздігі қамтамасыз етіледі.
• Қауіпсіздік саясаттары орындалады.
• C#, VB.NET, F# — басқарылатын тілдер.
Басқарылмайтын код (Unmanaged Code):
• CLR-дан тыс, операциялық жүйе деңгейінде тікелей орындалатын код.
• Жады қолмен басқарылады (malloc/free, new/delete).
• C, C++ тілдерінде жазылған код.
• Windows API, COM компоненттері.
.NET-та P/Invoke немесе COM Interop арқылы басқарылатын код басқарылмайтын кодты шақыра алады. unsafe кілт сөзі арқылы C#-та жад тікелей басқарылады.
- .NET-тағы қосымшалардың түрлері қандай (консольдік, web, WPF және т.б.)?
.NET-та жасауға болатын қосымша түрлері:
• Консольдік қосымша — терминал арқылы жұмыс жасайды. Жай және жылдам.
• ASP.NET Core — веб-қосымшалар мен API. RESTful сервистер, MVC.
• Blazor — веб-браузерде C# арқылы SPA қосымшалар (WebAssembly немесе Server).
• WPF (Windows Presentation Foundation) — Windows үшін бай графикалық интерфейс.
• WinForms — Windows-тың дәстүрлі форма негізіндегі интерфейсі.
• MAUI (.NET Multi-platform App UI) — iOS, Android, Windows, macOS үшін бір кодбаза.
• gRPC сервистері — жоғары өнімді RPC байланысы.
• Worker Service — фондық жұмыс жасайтын сервистер.
• Azure Functions — serverless бұлттық функциялар.
• Unit Test жобалары — xUnit, NUnit негізінде.
- .NET-тағы қоқысты жинау (garbage collection) қалай жұмыс істейді?
Қоқысты жинаушы (GC — Garbage Collector) — CLR-дің жадты автоматты басқаратын компоненті.
Жұмыс принципі:
• Heap-тегі объектілердің «тіршілік» (reachability) графын талдайды.
• Еш сілтемеге ие емес объектілер «қоқыс» деп белгіленеді.
• Жадты босатады және дефрагментациялайды.
Үш ұрпақ (Generation) механизмі:
• Generation 0 — жаңа, қысқа өмірлі объектілер. Жиі тазаланады.
• Generation 1 — Gen 0-дан аман өткен объектілер.
• Generation 2 — ұзақ өмірлі объектілер (static, кэш).
Гибридтік GC .NET 5+-та сервер мен жұмыс үстелі режимдерін қолдайды. IDisposable/using арқылы нұсқайтын ресурстар (файл, байланыс) қолмен жабылады.
- Метадеректер дегеніміз не және олар компоненттерде қалай қолданылады?
Метадеректер (Metadata) — кодтың өзін сипаттайтын ақпарат. .NET Assembly-де IL кодымен бірге сақталады.
Метадеректер қамтиды:
• Типтер тізімі (кластар, интерфейстер, структуралар).
• Әрбір типтің мүшелері (өрістер, қасиеттер, әдістер, оқиғалар).
• Параметрлер мен қайтару мәндерінің типтері.
• Атрибуттар (Attributes) — пайдаланушы жазған метадеректер.
Компоненттерде қолданылуы:
• Рефлексия (Reflection) — орындалу кезінде типтер туралы ақпарат алу.
• Сериализация — объектілерді JSON/XML-ге айналдыру.
• Тәуелділікті енгізу (DI) контейнерлері типтерді метадеректер арқылы табады.
• ORM (Entity Framework) — атрибуттар арқылы дерекқор схемасы анықталады.
• IDE IntelliSense — метадеректерді оқиды.
- .NET-та код қауіпсіздігі қалай қамтамасыз етіледі?
.NET-тағы код қауіпсіздігін қамтамасыз ету механизмдері:
• Тип қауіпсіздігі (Type Safety) — CLR типтерді тексереді, рұқсат етілмеген конверсияны тосады.
• Жад қауіпсіздігі — Managed код буфер толуынан (buffer overflow) қорғайды.
• Код қол жеткізу қауіпсіздігі (CAS) — Assembly-ге берілетін рұқсаттарды шектейді.
• Сандық қол қою (Strong Naming) — Assembly-дің аутентификациясы.
• Сандық сертификаттар (Authenticode) — Assembly шығарушысын растайды.
• .NET Runtime аутентификация — HttpContext.User, Identity, JWT.
• HTTPS, TLS — деректерді тасымалдауда шифрлау.
• Секреттерді басқару — Azure Key Vault, ASP.NET Core Data Protection.
• Аудит жазулары — қауіпсіздік оқиғаларын тіркеу.
- .NET-та атау кеңістігі (namespace) деген не және оның мақсаты қандай?
Атау кеңістігі (Namespace) — типтерді логикалық топтарға ұйымдастыру механизмі.
Мақсаттары:
• Атаулардың қақтығысын (naming collision) болдырмайды. Екі кітапхана бірдей атты класс жариялай алады.
• Кодты логикалық топтарға бөліп, навигацияны жеңілдетеді.
• IntelliSense-ке ыңғайлы іздеу мүмкіндігін береді.
Мысал: System.Collections.Generic — System (платформа), Collections (тип санаты), Generic (жалпы коллекциялар).
Қолданылуы:
• using System; — стандартты атау кеңістігін қосу.
• namespace MyCompany.MyApp.Services { } — жаңа кеңістік анықтау.
Атау кеңістігі Assembly-ден логикалық тұрғыда бөлек — бір namespace бірнеше Assembly-ге, бір Assembly бірнеше namespace-ке ие болуы мүмкін.
- Өз атау кеңістігін қалай жасауға болады?
C#-та атау кеңістігін жасау өте қарапайым.
Синтаксис:
namespace CompanyName.ProjectName.LayerName {
public class MyClass { }
public interface IMyInterface { }
}
Үздік тәжірибелер:
• Атау конвенциясы: CompanyName.ProductName.Feature форматы.
• Папка құрылымымен сәйкес болуы ұсынылады.
• Тым жалпы атауларды болдырмау (Utils, Helpers).
• Мазмұнын нақты сипаттау.
C# 10-да File-scoped namespace (файлдық кеңістік):
namespace MyApp.Services;
public class OrderService { }
— бүкіл файл осы кеңістікте болады, шашыраңқылық азаяды.
Қосымша файлдарда: using MyApp.Services; арқылы қолданылады.
- Әртүрлі тілдерде жазылған компоненттер арасында өзара әрекеттестік қалай жүреді?
.NET-та тілдер аралық өзара әрекеттестік (Interoperability) мүмкіндіктері:
• CTS/CLS арқылы — барлық .NET тілдері бірыңғай тип жүйесін қолданады. C#-та жасалған класс VB.NET немесе F#-та тікелей қолданылады.
• COM Interop — .NET компоненттері COM компоненттерімен және керісінше жұмыс жасайды. RCW (Runtime Callable Wrapper) және CCW (COM Callable Wrapper) автоматты жасалады.
• P/Invoke (Platform Invocation Services) — .NET-тан Windows API немесе C/C++ DLL функцияларын шақыру.
[DllImport("user32.dll")] — атрибуты арқылы.
• Managed C++ (C++/CLI) — C++ кодын .NET-пен байланыстыратын «көпір» тілі.
• gRPC, REST API — желі арқылы кез-келген тілдегі компоненттерді байланыстыру.
- CLI (Common Language Infrastructure) деген не?
CLI (Common Language Infrastructure) — Ecma-335 халықаралық стандарты. .NET платформасының негізін анықтайтын ашық спецификация.
CLI анықтайды:
• CTS (Common Type System) — тип жүйесі.
• CLS (Common Language Specification) — тілдер аралық үйлесімділік ережелері.
• VES (Virtual Execution System) — виртуалды орындалу жүйесі (CLR-дің спецификациясы).
• IL (Intermediate Language) — аралық тіл форматы.
• Метадеректер форматы — Assembly-дің сипаттамасы.
• BCL (Base Class Library) — кірістірілген типтер жиынтығы.
CLI іске асырулары:
• Microsoft .NET / .NET Core — негізгі іске асыру.
• Mono — Linux/macOS үшін ашық бастапқы іске асыру.
• .NET Compact Framework — мобильді құрылғылар үшін.
CLI-дің болуы .NET-ты ашық стандарт ретінде қамтамасыз етеді.
- .NET қандай бағдарламалау тілдерін қолдайды және бұл компоненттік тәсілге қалай әсер етеді?
.NET қолдайтын бағдарламалау тілдері:
• C# — .NET-тің негізгі тілі, ең кең қолданылатын.
• F# — функционалдық бағдарламалауға арналған тіл.
• VB.NET — Visual Basic-тің .NET нұсқасы.
• C++/CLI — C++ пен .NET арасындағы «көпір» тіл.
• IronPython, IronRuby — сыртқы іске асырулар.
• PowerShell — сценарийлер жазуға арналған тіл.
Компоненттік тәсілге әсері:
• CTS/CLS — барлық тілдерде жазылған компоненттер бір-бірімен үйлесімді жұмыс жасайды.
• Assembly — тілге тәуелсіз орналастыру бірлігі.
• C#-та жасалған кітапхана F# жобасында тікелей қолданылады.
• Бұл тілдер аралық компоненттерді жасауға және кең экожүйені пайдалануға мүмкіндік береді.
• Команда мүшелері өз таңдаулы тілінде жаза алады, ал компоненттер бір жүйеде жұмыс жасайды.