OneCompiler

Теория22

45

Компоненттік бағдарламалау технологиялары

  1. Бағдарламалаудың қандай заманауи парадигмалары бар?
    Қазіргі заманғы бағдарламалаудың негізгі парадигмалары:
    • Процедуралық (Procedural) — бағдарлама нұсқаулар тізбегінен тұрады (C, Pascal).
    • Объектіге бағытталған (OOP) — деректер мен мінез-құлықты объектілерге біріктіреді (Java, C#, Python).
    • Функционалдық (Functional) — функциялар негізінде есептеу жүргізіледі, жанама әсерлер болмайды (Haskell, F#).
    • Декларативті (Declarative) — «не істеу керек» анықталады, «қалай» емес (SQL, HTML).
    • Компоненттік (Component-based) — дайын компоненттерді қайта пайдалануға негізделген.
    • Реактивті (Reactive) — деректер ағынына және өзгерістерге жауап беруге бағытталған (RxJS).
    • Аспектіге бағытталған (AOP) — кросс-функционалды логиканы бөледі (Spring AOP).

  2. Процедуралық және объектіге бағытталған бағдарламалаудың айырмашылығы неде?
    Процедуралық бағдарламалауда бағдарлама функциялар (процедуралар) жиынтығынан тұрады. Деректер мен функциялар бөлек болады, мысалы C тілінде. Негізгі ойлау тәсілі: «не істеу керек?».

Объектіге бағытталған бағдарламалауда деректер мен мінез-құлық объект ішінде бірге сақталады. Бағдарлама объектілер жиынтығы ретінде қарастырылады. Кодтың қайта пайдаланылуы, модульділігі жоғары. Инкапсуляция, тұқымқуалау, полиморфизм қолданылады.

Негізгі айырмашылық: процедуралықта деректер мен функциялар бөлек, ООП-та олар объектіде біріктірілген.

  1. Объектіге бағытталған тәсілдің қандай артықшылықтары бар?
    ООП тәсілінің негізгі артықшылықтары:
    • Модульділік — код бөліктерге бөлінеді, жеке өзгертуге болады.
    • Қайта пайдалану — тұқымқуалау арқылы бар кодты кеңейтуге болады.
    • Қолдаудың жеңілдігі — код түсінікті, жүйелі болады.
    • Инкапсуляция — ішкі іске асыруды жасырады, интерфейс арқылы қол жеткізіледі.
    • Икемділік — полиморфизм арқылы бірдей интерфейс әртүрлі жұмыс жасайды.
    • Нақты дүниені модельдеу — нысандар мен объектілердің байланысы табиғи.

  2. Декларативті және императивті бағдарламалау дегеніміз не?
    Императивті бағдарламалауда бағдарламашы «қалай жасау керек» деген нұсқаулар тізбегін жазады. Машинаның орындау қадамдары нақты көрсетіледі. Мысалы: C, Java, Python циклдары.

Декларативті бағдарламалауда бағдарламашы «не алғысы келетінін» сипаттайды, ал орындау тәсілі жүйеге қалдырылады. Мысалдар: SQL сұраныстары, HTML разметкасы, функционалдық тіл конструкциялары.

Мысал: «Тізімнен жұп сандарды алу» — императивте цикл жазылады, декларативте filter() функциясы қолданылады.

  1. Компоненттік тәсілдің ООП-қа қарағанда ерекшелігі қандай?
    ООП кластар мен объектілер деңгейінде жұмыс жасайды, ал компоненттік тәсіл дербес, орналастырылуы мүмкін бірліктер — компоненттер деңгейінде жұмыс жасайды.

Компоненттік тәсілдің ерекшеліктері:
• Компонент «қара жәшік» (black box) ретінде қарастырылады — ішкі іске асыруы жасырылады.
• Компоненттер дербес орналастырылады (deployment) және ауыстырылады.
• Тілге тәуелсіздік — әртүрлі тілдерде жазылған компоненттер бірге жұмыс жасай алады.
• Нақты келісімшарт (contract) — интерфейс арқылы өзара байланысады.
• ООП қайта пайдалануды тұқымқуалау арқылы жасайды, компоненттік тәсіл — композиция арқылы.

  1. ООП-тың негізгі принциптерін атаңыз.
    ООП-тың төрт негізгі принципі:
    • Инкапсуляция (Encapsulation) — деректер мен мінез-құлықты бір объектіде біріктіру және сыртқы қол жеткізуді шектеу.
    • Тұқымқуалау (Inheritance) — бір класс екінші класстан қасиеттер мен әдістерді мұраға алады.
    • Полиморфизм (Polymorphism) — бір интерфейс арқылы әртүрлі объектілермен жұмыс жасау мүмкіндігі.
    • Абстракция (Abstraction) — маңызды белгілерді ерекшелеп, маңызсыздарын жасыру.

  2. Тұқымқуалау (наследование) дегеніміз не және оның түрлері қандай?
    Тұқымқуалау — бір класстың (ұрпақ класс) екінші класстан (ата класс) қасиеттері мен әдістерін мұраға алу механизмі.

Түрлері:
• Жалғыз тұқымқуалау (Single) — бір ата класстан мұраға алу (C#, Java).
• Көп тұқымқуалау (Multiple) — бірнеше ата класстан мұраға алу (C++). C# тілінде интерфейстер арқылы жүзеге асырылады.
• Көп деңгейлі (Multilevel) — A → B → C тізбегімен мұраға алу.
• Иерархиялық (Hierarchical) — бір ата класстан бірнеше ұрпақ класс мұраға алады.
• Гибридтік (Hybrid) — жоғарыдағы түрлердің комбинациясы.

Мысал (C#): class Animal { } → class Dog : Animal { }

  1. Полиморфизм дегеніміз не және ол қалай жүзеге асады?
    Полиморфизм — бір атпен әртүрлі объектілерде әртүрлі мінез-құлық орындалу мүмкіндігі.

Жүзеге асу тәсілдері:
• Компиляция кезіндегі полиморфизм — әдістерді қайта жүктеу (overloading): бірдей атпен, бірақ әртүрлі параметрлермен әдістер.
• Орындалу кезіндегі полиморфизм — виртуалды әдістерді қайта анықтау (overriding): ата класс әдісін ұрпақ класс өзінше іске асырады.

Мысал: Animal базалық класының Speak() әдісі бар. Dog класы Speak() = «Ау», Cat класы Speak() = «Мяу» деп қайта анықтайды. Animal типіндегі айнымалы арқылы шақырғанда нақты класстың әдісі орындалады.

  1. Инкапсуляция дегеніміз не? Мысал келтіріңіз.
    Инкапсуляция — объектінің ішкі деректерін жасыру және оларға қол жеткізуді арнайы әдістер (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() арқылы өзгертіледі.

  1. Абстракцияны ООП-да қалай жүзеге асыруға болады?
    Абстракция — нысанның тек маңызды қасиеттерін ерекшелеп, қалғанын жасыру принципі.

Жүзеге асу тәсілдері:
• Абстракт кластар (abstract class) — іске асырылмаған әдістері бар кластар. Тікелей нысан жасалмайды.
• Интерфейстер (interface) — тек сигнатуралар жиынтығы, іске асыруды міндеттейді.

Мысал: Shape абстракт класының Draw() абстракт әдісі бар. Circle, Rectangle кластары Draw() әдісін өз бетінше іске асырады. Пайдаланушы Shape арқылы жұмыс жасайды, нақты іске асырудың мәні жоқ.

  1. Интерфейс пен абстракт сыныптың айырмашылығы неде?
    Абстракт класс:
    • Іске асырылған және іске асырылмаған әдістері болуы мүмкін.
    • Конструктор, өрістер болуы мүмкін.
    • Жалғыз тұқымқуалау (бір ата класс ғана).
    • Байланысты кластар үшін ортақ базалық логика ұсынады.

Интерфейс:
• Тек сигнатуралар (C# 8.0-дан бастап default реализация болуы мүмкін).
• Өрістер болмайды (тек қасиеттер).
• Бір класс бірнеше интерфейсті іске асыра алады.
• «Не істей алады» деген келісімшартты анықтайды.

Таңдау ережесі: байланысты кластар үшін — абстракт класс; байланысы жоқ кластарға ортақ мінез-құлық үшін — интерфейс.

  1. Әдістерді қайта жүктеу (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.

  1. Композиция мен агрегация деген не?
    Екеуі де объектілер арасындағы «бар» (HAS-A) байланысын білдіреді, бірақ айырмашылықтары бар.

Композиция (Composition) — күшті байланыс. Бөлік тек ие объектіге тиесілі, ие жойылса бөлік те жойылады.
Мысал: Адам — Жүрек. Адам жойылса, жүрек де жойылады.

Агрегация (Aggregation) — әлсіз байланыс. Бөлік ие объектіден тәуелсіз өмір сүре алады.
Мысал: Университет — Профессор. Университет жабылса да, профессор өмір сүре береді.

Есте сақтау ережесі: Композиция = «тиесілі», Агрегация = «байланысты».

  1. Конструктор мен деструктордың рөлі қандай?
    Конструктор (Constructor) — объект жасалған кезде автоматты шақырылатын арнайы әдіс. Мақсаты: объектінің алғашқы күйін орнату, ресурстарды бөлу.
    Түрлері: параметрсіз (default), параметрлі, көшіру конструктор (copy constructor).

Деструктор (Destructor) — объект жойылған кезде шақырылатын арнайы әдіс. Мақсаты: бөлінген ресурстарды босату (файлдар, байланыстар, жад).

.NET-та қоқысты жинаушы (GC) жадты автоматты басқарады, сондықтан деструктор орнына IDisposable/Dispose() үлгісі қолданылады. C++-та деструктор критикалық рөл атқарады.

  1. SOLID принциптері деген не және олар қалай қолданылады?
    SOLID — объектіге бағытталған дизайнның 5 принципі:

• S — Single Responsibility (Жалғыз жауапкершілік): Класстың тек бір өзгерту себебі болуы керек.
• O — Open/Closed (Ашық/Жабық): Класс кеңейтуге ашық, өзгертуге жабық болуы керек.
• L — Liskov Substitution (Лисков алмастыруы): Ата класс орнына ұрпақ класс қойса, бағдарлама дұрыс жұмыс жасауы керек.
• I — Interface Segregation (Интерфейсті бөлу): Клиент қажет емес әдістерді іске асыруға мәжбүр болмауы керек.
• D — Dependency Inversion (Тәуелділіктің инверсиясы): Жоғары деңгейлі модульдер төменгі деңгейліге емес, абстракцияға тәуелді болуы керек.

Бұл принциптер кодтың оқылуын, тексерілуін және қолдануын жеңілдетеді.

  1. Компонент дегеніміз не және ол кластан қалай ерекшеленеді?
    Компонент — дербес орналастырылатын, белгілі бір функционалды қамтитын, нақты интерфейс арқылы өзге жүйелермен байланысатын бағдарламалық бірлік.

Кластан айырмашылығы:
• Класс — тек код деңгейіндегі абстракция; компонент — орналастыру деңгейіндегі бірлік.
• Компонент «қара жәшік» — ішкі іске асыруы жасырылған.
• Компонент тілге тәуелсіз — әртүрлі тілдерде жазылған компоненттер бірге жұмыс жасай алады.
• Компонент версияланады, жеке орналастырылады, ауыстырылады.
• Мысал: .NET-тағы Assembly, Java-дағы JAR файлы — компоненттің іске асырылуы.

  1. Компоненттік бағдарламалау ООП-ты қалай дамытады?
    Компоненттік бағдарламалау ООП принциптерін сақтай отырып, оны жаңа деңгейге апарады:

• ООП объект деңгейінде қайта пайдалануды қамтамасыз етсе, компоненттік тәсіл бүкіл модуль деңгейінде жасайды.
• Компоненттер бинарлық деңгейде қайта пайдаланылады — бастапқы кодты ашудың қажеті жоқ.
• Тілдер аралық өзара әрекеттестік мүмкін болады.
• Нұсқаларды (versioning) тәуелсіз басқаруға болады.
• Жүйені бөліктерге бөліп, әр бөлікті дербес жасауға, тексеруге мүмкіндік береді.
• Нәтижесінде бағдарламалық жасақтаманы жинақтаудың (software assembly) мүмкіндігі туады.

  1. Компоненттерді қайта пайдалану дегеніміз не?
    Компоненттерді қайта пайдалану (Reuse) — бір рет жасалған компонентті бірнеше жобада немесе жүйенің әртүрлі бөліктерінде қолдану мүмкіндігі.

Артықшылықтары:
• Даму уақытын қысқартады.
• Сыналған, сенімді кодты қайта пайдалану арқылы сапаны арттырады.
• Шығындарды азайтады.
• Стандарттылықты қамтамасыз етеді.

Талаптар:
• Компонент жалпы мақсатты болуы керек.
• Жақсы құжатталған болуы керек.
• Нақты, тұрақты интерфейсі болуы керек.
• Тәуелділіктері минималды болуы керек.

Мысалдар: .NET-тың стандартты кітапханасы, NuGet пакеттері.

  1. Компоненттік контракт дегеніміз не?
    Компоненттік контракт — компонент пен оны пайдаланушы арасындағы ресми келісім. Контракт компоненттің:
    • Не ұсынатынын (provided interface) — экспорттайтын интерфейстер.
    • Не қажет ететінін (required interface) — тәуелді болатын интерфейстер.
    • Алдын ала шарттарын (preconditions) — шақырудан бұрын орындалуы керек шарттар.
    • Кейінгі шарттарын (postconditions) — шақырудан кейін кепілденетін нәтижелер.
    • Инвариантарын — компонент барлық уақытта ұстануы керек шарттар.

Анықтайды. Контракт сақталса, ішкі іске асырудың өзгеруі пайдаланушыны сындырмайды.

  1. Компоненттер арасындағы әлсіз байланыс (loose coupling) деген не?
    Әлсіз байланыс (Loose Coupling) — компоненттердің бір-біріне минималды тәуелді болуы принципі. Яғни, бір компоненттің өзгеруі басқа компоненттерге аз әсер етеді.

Жүзеге асыру тәсілдері:
• Интерфейстер арқылы байланысу — нақты іске асыруға емес, абстракцияға тәуелді болу.
• Оқиғалық модель (Event-driven) — компоненттер тікелей шақырмай, оқиғалар арқылы байланысады.
• Тәуелділікті енгізу (Dependency Injection) — тәуелділіктер сырттан беріледі.
• Делдал (Mediator) үлгісі — компоненттер тікелей емес, делдал арқылы байланысады.

Артықшылықтары: компоненттерді тәуелсіз тестілеу, ауыстыру, дамыту мүмкіндігі.

  1. Компонент интерфейсі дегеніміз не және ол қалай қолданылады?
    Компонент интерфейсі — компоненттің сыртқы дүниемен байланысатын нүктелерінің жиынтығы. Интерфейс компоненттің «не ұсынатынын» немесе «не қажет ететінін» сипаттайды.

Түрлері:
• Ұсынылатын интерфейс (Provided) — компонент экспорттайтын функционал.
• Талап етілетін интерфейс (Required) — компоненттің жұмысы үшін қажетті сыртқы функционал.

Пайдалану:
• Компоненттерді іске асыруынан бөлек анықтайды.
• Клиент коды интерфейспен жұмыс жасайды, нақты класспен емес.
• Нысандарды ауыстыруға мүмкіндік береді.

C# мысалы: ILogger интерфейсін FileLogger немесе ConsoleLogger іске асырады.

  1. Компоненттік бағдарламалаудың қандай стандарттары бар?
    Компоненттік бағдарламалаудың негізгі стандарттары мен технологиялары:

• 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 компонент диаграммалары — архитектуралық сипаттау стандарты.

Барлық стандарттар: тіл тәуелсіздігін, нұсқаларды басқаруды, интерфейстер арқылы байланысуды қамтамасыз етеді.

  1. Компонентке қатысты «қара жәшік» (black box) түсінігі қандай?
    «Қара жәшік» (Black Box) — компонент оның ішкі іске асыруын жасырып, тек интерфейсін ашатын принцип.

Мағынасы:
• Пайдаланушы компоненттің ішінде не болатынын білудің қажеті жоқ.
• Тек кіріс (input) пен шығысты (output) біледі.
• Ішкі логика толық жасырылған.

Артықшылықтары:
• Іске асыруды еркін өзгертуге болады — пайдаланушы байқамайды.
• Зияткерлік меншікті қорғайды.
• Күрделілікті жасырады.
• Тестілеуді жеңілдетеді.

Қарама-қарсы тұжырым: «ақ жәшік» (white box) — ішкі код толық ашық.

  1. Компоненттер арасындағы өзара әрекеттестік қалай жүзеге асады?
    Компоненттер арасындағы өзара әрекеттестіктің негізгі механизмдері:

• Интерфейстер арқылы тікелей шақыру — бір компонент екіншісінің интерфейс әдісін шақырады.
• Оқиғалар мен делегаттар (Events/Delegates) — компоненттер оқиғаларға жазылады (subscribe/publish).
• Хабарламалар (Message Passing) — компоненттер хабарламалар кезегі арқылы байланысады (асинхронды).
• Қашықтан шақыру (RPC/gRPC) — желі арқылы компоненттер шақырылады.
• REST/HTTP API — веб-компоненттер HTTP сұраныстары арқылы байланысады.
• Ортақ деректер қоймасы — компоненттер дерекқор немесе кэш арқылы байланысады.

Таңдау жүйенің талаптарына байланысты: синхронды/асинхронды, жергілікті/желілік.

  1. Компоненттік жүйелердегі оқиғалық модель (event-driven model) деген не?
    Оқиғалық модель (Event-Driven Model) — компоненттер тікелей шақырудың орнына оқиғалар (events) арқылы байланысатын архитектуралық тәсіл.

Жұмыс принципі:
• Оқиға шығарушы (Publisher/Producer) — оқиға орнатады.
• Оқиға тыңдаушы (Subscriber/Consumer) — оқиғаны күтіп, шақырылғанда жауап береді.
• Оқиға брокері (Event Bus/Message Broker) — оқиғаларды тарата алады.

Артықшылықтары:
• Компоненттер арасындағы байланыс өте әлсіз.
• Асинхронды жұмыс мүмкіндігі.
• Жаңа тыңдаушылар оңай қосылады.

Мысалдар: C# делегаттары мен оқиғалары, JavaScript DOM events, Apache Kafka.

  1. Компоненттік тәсілдің негізгі қағидалары қандай?
    Компоненттік тәсілдің негізгі қағидалары:

• Дербестік (Autonomy) — компонент тәуелсіз орналастырылады және жаңартылады.
• Инкапсуляция — ішкі іске асыру жасырылады.
• Қайта пайдалану (Reusability) — компонент бірнеше контекстте қолданыла алады.
• Ауыстырылуы (Replaceability) — бірдей интерфейсті іске асырған компонент ауыстырылады.
• Контракт негізінде байланысу — интерфейстер мен спецификациялар арқылы.
• Нұсқалық үйлесімділік (Versioning) — жаңа нұсқа ескі клиенттерге кері үйлесімді болады.
• Композициялық архитектура — үлкен жүйелер шағын компоненттерден жиналады.

  1. Компоненттердің қайта пайдаланылуы мен кеңейтілуі қалай қамтамасыз етіледі?
    Қайта пайдалануды қамтамасыз ету жолдары:
    • Жалпы мақсатты интерфейстер жасау.
    • Компоненттің нақты тәуелділіктерін минималдау.
    • Параметрлеу (параметр арқылы конфигурация).
    • Нұсқаларды тұрақты ұстау.

Кеңейтілуді қамтамасыз ету жолдары:
• Кеңейту нүктелері (Extension Points) қарастыру.
• «Ашық/жабық» SOLID принципін сақтау.
• Plugin архитектурасы — жаңа мүмкіндіктер плагин ретінде қосылады.
• Тәуелділікті енгізу (DI) — тәуелділіктерді сырттан ауыстыруға болады.
• Тұқымқуалау немесе декоратор үлгісі арқылы функционалды кеңейту.

  1. Компоненттердің үйлесімділігі қалай қамтамасыз етіледі?
    Компоненттер үйлесімділігінің түрлері:
    • Бинарлық үйлесімділік — ескі компиляцияланған код жаңа нұсқамен жұмыс жасайды.
    • Бастапқы код үйлесімділігі — ескі код жаңа нұсқамен қайта компиляциялана алады.
    • Семантикалық үйлесімділік — мінез-құлықтың өзгермеуі.

Қамтамасыз ету жолдары:
• Интерфейстерді тұрақты ұстау, өзгерістерді жаңа нұсқаға тасымалдау.
• Семантикалық нұсқалау (SemVer) қолдану: MAJOR.MINOR.PATCH.
• Ескірген функционалды бірден жоймай, deprecated белгілеп, уақыт беру.
• .NET-та Assembly нұсқасын GAC-та тіркеу.
• COM-да интерфейс GUID-ін өзгертпеу.

  1. Компоненттік модель дегеніміз не?
    Компоненттік модель — компоненттерді жасауға, байланыстыруға және орналастыруға арналған ережелер, стандарттар мен инфрақұрылым жиынтығы.

Компоненттік модель анықтайды:
• Компонент қандай форматта болу керек.
• Интерфейстер қалай сипатталады.
• Компоненттер бір-бірімен қалай байланысады.
• Өмірлік циклді кім басқарады.
• Нұсқалар қалай басқарылады.

Мысалдар:
• .NET компоненттік моделі — Assembly, CLR, CTS негізінде.
• EJB моделі — Java EE контейнері басқарады.
• COM моделі — Windows реестрі мен интерфейс IUnknown негізінде.
• OSGi моделі — Java bundle-дар динамикалық жүктеледі.

  1. Компоненттің өмірлік циклі қандай кезеңдерден тұрады?
    Компоненттің өмірлік циклі (Lifecycle) мына кезеңдерден тұрады:

  2. Талдау (Analysis) — компоненттің мақсаты, функционалы анықталады.

  3. Жобалау (Design) — интерфейстер, архитектура, тәуелділіктер жасалады.

  4. Іске асыру (Implementation) — код жазылады.

  5. Тестілеу (Testing) — бірлік, интеграция, регрессия тесттері орындалады.

  6. Орауыш жасау (Packaging) — DLL, JAR немесе NuGet пакеті жасалады.

  7. Орналастыру (Deployment) — жүйеге орнатылады.

  8. Пайдалану (Runtime) — компонент жұмыс жасайды: жасалады, конфигурацияланады, іске асады.

  9. Техникалық қызмет (Maintenance) — жаңартулар, қателерді жөндеу.

  10. Зейнеткерлік (Retirement) — ескірген компонент deprecated белгіленеді, жойылады.

  11. Компоненттерді орау (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 арқылы мүмкін.

  1. .NET контексінде «жинақ» (assembly) деген не?
    .NET-тағы Assembly — компиляцияланған кодтың орналастыру бірлігі. Бұл .dll немесе .exe форматындағы файл.

Assembly құрамы:
• IL (Intermediate Language) коды — платформатәуелсіз аралық код.
• Метадеректер (Metadata) — типтер, әдістер, қасиеттер туралы ақпарат.
• Манифест (Manifest) — Assembly атауы, нұсқасы, тәуелділіктер.
• Ресурстар — суреттер, жолдар, т.б.

Түрлері:
• Private Assembly — тек бір қосымша пайдаланады.
• Shared Assembly — GAC-та тіркелген, бірнеше қосымша қолданады.
• Satellite Assembly — локализация ресурстары үшін.

Assembly .NET-тағы компонентті орналастырудың негізгі бірлігі болып табылады.

  1. Компоненттердің нұсқаларын басқару қалай жүргізіледі?
    Нұсқаларды басқару (Versioning) тәсілдері:

• Семантикалық нұсқалау (SemVer): MAJOR.MINOR.PATCH форматы. MAJOR — кері үйлесімсіз өзгерістер, MINOR — жаңа функционал, PATCH — қате жөндеу.

• .NET-та Assembly нұсқасы:

  • AssemblyVersion — CLR нұсқасы.
  • AssemblyFileVersion — файл нұсқасы.
  • AssemblyInformationalVersion — адамға арналған нұсқа.

• GAC side-by-side execution — бір компоненттің бірнеше нұсқасын қатар орнатуға болады.

• NuGet — пакет тәуелділіктерін нұсқасымен бірге басқарады.

• Deprecated белгілеу — ескі нұсқаны бірден жоймай, Obsolete атрибуты қойылады.

  1. Компоненттер қалай тестіленеді?
    Компоненттерді тестілеу деңгейлері:

• Бірлік тестілеу (Unit Testing) — компоненттің жеке әдістерін тестілеу. Жалған нысандар (Mock/Stub) пайдаланылады. Мысал: xUnit, NUnit (C#), JUnit (Java).

• Компонент тестілеу (Component Testing) — бүкіл компонентті изоляцияда тестілеу.

• Интеграциялық тестілеу (Integration Testing) — бірнеше компоненттің бірге жұмысын тестілеу.

• Контракт тестілеу (Contract Testing) — компонент интерфейс контрактысын сақтайтынын тексеру.

Үздік тәжірибелер:
• Тестілеуге ыңғайлы дизайн — DI, интерфейстер.
• Автоматтандырылған CI/CD тесттері.
• Код жабындылығы (Code Coverage) өлшеу.

  1. Инверсия управления және тәуелділікті енгізу (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>();

  1. .NET платформасының негізгі архитектуралық ерекшеліктері қандай?
    .NET платформасының архитектуралық ерекшеліктері:

• Ортақ тіл орындалу ортасы (CLR) — IL кодын орындайды, жадты басқарады.
• Ортақ тип жүйесі (CTS) — барлық .NET тілдеріне бірыңғай тип жүйесі.
• Ортақ тіл спецификациясы (CLS) — тілдер аралық өзара жұмыс ережелері.
• Негізгі класс кітапханасы (BCL) — дайын класстар мен компоненттер жиынтығы.
• Assembly негізіндегі компоненттік модель.
• Тілге тәуелсіздік — C#, F#, VB.NET, т.б. бір CLR-де жұмыс жасайды.
• Кросс-платформалық қолдау — .NET 5+ нұсқаларынан Windows, Linux, macOS.
• JIT компиляция — IL орындалу кезінде машина кодына аударылады.

  1. 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) кодтың жұмысын толық бақылайды.

  1. 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 тілдер аралық компонент алмасуының негізі болып табылады.

  1. .NET-тағы жинақ (assembly) құрылымы қандай?
    .NET Assembly — компиляцияланған кодтың логикалық контейнері. Физикалық форматы PE (Portable Executable) — .dll немесе .exe.

Assembly ішкі құрылымы:
• Манифест (Assembly Manifest) — Assembly атауы, нұсқасы, мәдениеті, тәуелділіктер тізімі, ішіндегі файлдар тізімі.
• Тип метадеректері (Type Metadata) — экспортталатын типтер, олардың мүшелері туралы ақпарат.
• IL коды (MSIL) — компиляцияланған, платформатәуелсіз код.
• Ресурстар — кірістірілген мәтіндер, суреттер, т.б.

Assembly бір немесе бірнеше модульден (module) тұрауы мүмкін. Assembly шекарасы қауіпсіздік, нұсқалау және орналастырудың бірлігі болып табылады.

  1. .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) барлық деңгейлерді байланыстырады.

  1. Басқарылатын (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#-та жад тікелей басқарылады.

  1. .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 негізінде.

  1. .NET-тағы қоқысты жинау (garbage collection) қалай жұмыс істейді?
    Қоқысты жинаушы (GC — Garbage Collector) — CLR-дің жадты автоматты басқаратын компоненті.

Жұмыс принципі:
• Heap-тегі объектілердің «тіршілік» (reachability) графын талдайды.
• Еш сілтемеге ие емес объектілер «қоқыс» деп белгіленеді.
• Жадты босатады және дефрагментациялайды.

Үш ұрпақ (Generation) механизмі:
• Generation 0 — жаңа, қысқа өмірлі объектілер. Жиі тазаланады.
• Generation 1 — Gen 0-дан аман өткен объектілер.
• Generation 2 — ұзақ өмірлі объектілер (static, кэш).

Гибридтік GC .NET 5+-та сервер мен жұмыс үстелі режимдерін қолдайды. IDisposable/using арқылы нұсқайтын ресурстар (файл, байланыс) қолмен жабылады.

  1. Метадеректер дегеніміз не және олар компоненттерде қалай қолданылады?
    Метадеректер (Metadata) — кодтың өзін сипаттайтын ақпарат. .NET Assembly-де IL кодымен бірге сақталады.

Метадеректер қамтиды:
• Типтер тізімі (кластар, интерфейстер, структуралар).
• Әрбір типтің мүшелері (өрістер, қасиеттер, әдістер, оқиғалар).
• Параметрлер мен қайтару мәндерінің типтері.
• Атрибуттар (Attributes) — пайдаланушы жазған метадеректер.

Компоненттерде қолданылуы:
• Рефлексия (Reflection) — орындалу кезінде типтер туралы ақпарат алу.
• Сериализация — объектілерді JSON/XML-ге айналдыру.
• Тәуелділікті енгізу (DI) контейнерлері типтерді метадеректер арқылы табады.
• ORM (Entity Framework) — атрибуттар арқылы дерекқор схемасы анықталады.
• IDE IntelliSense — метадеректерді оқиды.

  1. .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.
• Аудит жазулары — қауіпсіздік оқиғаларын тіркеу.

  1. .NET-та атау кеңістігі (namespace) деген не және оның мақсаты қандай?
    Атау кеңістігі (Namespace) — типтерді логикалық топтарға ұйымдастыру механизмі.

Мақсаттары:
• Атаулардың қақтығысын (naming collision) болдырмайды. Екі кітапхана бірдей атты класс жариялай алады.
• Кодты логикалық топтарға бөліп, навигацияны жеңілдетеді.
• IntelliSense-ке ыңғайлы іздеу мүмкіндігін береді.

Мысал: System.Collections.Generic — System (платформа), Collections (тип санаты), Generic (жалпы коллекциялар).

Қолданылуы:
• using System; — стандартты атау кеңістігін қосу.
• namespace MyCompany.MyApp.Services { } — жаңа кеңістік анықтау.

Атау кеңістігі Assembly-ден логикалық тұрғыда бөлек — бір namespace бірнеше Assembly-ге, бір Assembly бірнеше namespace-ке ие болуы мүмкін.

  1. Өз атау кеңістігін қалай жасауға болады?
    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; арқылы қолданылады.

  1. Әртүрлі тілдерде жазылған компоненттер арасында өзара әрекеттестік қалай жүреді?
    .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 — желі арқылы кез-келген тілдегі компоненттерді байланыстыру.

  1. 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-ты ашық стандарт ретінде қамтамасыз етеді.

  1. .NET қандай бағдарламалау тілдерін қолдайды және бұл компоненттік тәсілге қалай әсер етеді?
    .NET қолдайтын бағдарламалау тілдері:
    • C# — .NET-тің негізгі тілі, ең кең қолданылатын.
    • F# — функционалдық бағдарламалауға арналған тіл.
    • VB.NET — Visual Basic-тің .NET нұсқасы.
    • C++/CLI — C++ пен .NET арасындағы «көпір» тіл.
    • IronPython, IronRuby — сыртқы іске асырулар.
    • PowerShell — сценарийлер жазуға арналған тіл.

Компоненттік тәсілге әсері:
• CTS/CLS — барлық тілдерде жазылған компоненттер бір-бірімен үйлесімді жұмыс жасайды.
• Assembly — тілге тәуелсіз орналастыру бірлігі.
• C#-та жасалған кітапхана F# жобасында тікелей қолданылады.
• Бұл тілдер аралық компоненттерді жасауға және кең экожүйені пайдалануға мүмкіндік береді.
• Команда мүшелері өз таңдаулы тілінде жаза алады, ал компоненттер бір жүйеде жұмыс жасайды.