OOP Flashcards

1
Q

Какво са данните? Какво са метаданните? Какво е валидността на данните?

A

Характериситка/информация (в литерал или променлива) получена от хардуер или софтуер. Стават информация, когато са в контекст.

Метаданните са данни за данните.

Валидността на данните се определя се от софтуера, запазваме ги валидни чрез проверка на софтуера и ограничен достъп до тях. (scope & closure)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Какво е състояние (state) и поведение (behavior)? Защо да ги групираме заедно?

A

State - данни, които обектът съдържа;
Behavior - методи, които прилагаме;

Улеснява поддръжката на кода, по-структуриран и всичко е на едно място.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Как обектите предоставят структура?

A

Групират свързаните данни и функции в едно място и гарантират по-организиран код благодарение на класовете (ES6).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какво значи .this? Как определяме стойността на .this?

A

Това е placeholder, получава стойност, когато се извика, тя се определя от мястото на извикване.

Стойността зависи от начина на извикване на функцията, не може да се присвоява и може да е различна при всяко извикване. Мястото на извикване се проверява и се определя кое от четирите binding правила се използва.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Кои са четирите binding правила на .this?

A

Default binding - .this сочи към глобалния обект; ‘use strict’ го прави undefined; използва се, когато никое друго правило не е приложено;

Implicit binding - покрива мнозинството от случаите при работа с .this, ако има нестнати обекти, взима стойноста от последния;

Explicit binding - използват се методи като call(), apply(), bind() за свързване на .this към определен обект.

new Binding - не сега

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Каква е последователността на четирите binding правила на .this?

A
  1. Explicit - определя дали функцията е извикана с call(), apply() или bind() и .this се свързва с обекта подаден на тази функция.
  2. Implicit - опредлея дали функцията е извикана с обект и .this се свързва с него.
  3. Default - прилага се ако другите не са приложени.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Какво е ООП? Какво са класовете?

A

ООП е модел на програмен език, организиран около обекти, притежаващи данни и методи, предоставящи публичен интерфейс към друг код, който иска да го използва, но поддържат и private състояние.

Класовете са шаблон на обекти, използват state и behavior, дефинират обектите, но инстанциите дефинират състоянието му.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Как се създава клас със специално състояние или поведение?

A

Изплозваме fields и methods.
Fields - ‘членове’ на класа (променливи, state), могат да има default value;
Methods - изпълняват действие и определят поведение.
Ако са свързани, нека са в един клас.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какво са инстанциите на класа и как се създават?

A

Инстанция - обект, който съдържа state & behavior описани от класа.
Можем да ги създаваме с кл. дума ‘new’ и да използваме ‘конструктор’, извикан при създаване на нова инстанция. Те инициализират fields на инстанцията.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какво са static methods и за какво се използват?

A

Static - кл. дума, създава статичен метод за класа. Не мога да се извикват върху инстанции, а само върху самия клас. Използват се за фиксирани случаи или данни, които не се нуждаят от дубликат между инстанциите.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Каква е разликата между ООП и ФП?

A

Функционалното програмиране акцентира върху използването на функции, където всяка една си има собствена задача.
Обектно-ориентираното програмиране акцентира върху обектите и методите в тях, като организива кода в обекти и класове.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Кои са четирите принципа на ООП?

A
  1. Encapsulation - капсулира state & behavior в един клас, скрива информация и контролира достъпа до state на обекта.
  2. Inheritance - позволява на класа да наследява свойства и методи от друг клас (родителски), създава йерархия и позволява преизползване на код.
  3. Abstraction - фокусира се върхи съществените детайли, като се скриват ненужните сложности. Намалява сложноста.
  4. Polymorphism - ситуации, в които нещо се проявява в различни форми, позволява третиране на дъщерни класове като родителски.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какви други принципи познавате в ООП (Кохезия и Къплинг)?

A
  1. Кохезия - мярка за сила на свързаност между методи и данни на клас и обединяващата ги концепция.
    -силна кохезия - дефинирана абстрактност, класовете имат по една единствена цел;
    -слаба кохезия - един клас прави много несвързани задачи;
  2. Къплинг - взаимозависимост между софтуерни модули и тяхната сила.
    -слаб къплинг - стремим се към нея, колко тясно е свързан клас с друг клас, да имат малки, директни и видими взаимоотношения помежду си.
    Модулите трябва да зависят възможно най-малко един от друг.

! Стремим се към силна кохезия и слаб къплинг.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Защо енкапсулацията е важна в ООП?

A

Констролиран достъп до state, може да се добави валидация, създава по-стабилни и контолирани класове, намалява зависимостите и улеснява вътрешните промени в класа, без да засяга външен код.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Каква е разликата между private & public fields в класа?

A
  1. Public - достъпвани и променяни извън класа и от други чати на програмата.
  2. Private - не се достъпват и променят директно, за достъпване ползваме getter & setter.
    Помага за защита на данни и конторл на достъпа до тях.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Защо казваме, че property-тата се пишат като методи, но ги ползваме като fields?

A

При дефиниране на property - ползваме get & set:
get - без параметър, връща стойност;
set - един параметър, не връща стойност;
Присвояваме стойности с ‘=’.
Тези методи не ни позволяват контрол върху private fields, свойствата и използваме като методи, но всъщност са полета за четене.

17
Q

Може ли property да има само getter или setter?

A

Да.
Само getter - read-only;
Само setter - write-only;

18
Q

Как разбираме дали един клас е енкапсулиран или не?

A

Ако данните и методите, които действат върху тях са групирани и достъпът им е ограничен извън класа, значи класът е енкапсулиран.
State - private, само behavior има право да го променя.

19
Q

Какво е наследяване и какви са му предимствата? Защо наследяването е важно в ООП?

A

Наследяването позволява класовете да нследят характеристики на вече съществуващ родителски клас чрез ‘extends’. Наследява fields, properties & methods, както позволява на дъщерните да добавя нови такива.
+ разширяват;
+ преизползва код;
- понякога вдига сложността;

-Имплементираме го задължително при наличие на ‘is-a’ връзка между 2 класа. Надграждаме класа, преизползваме код.
-Разширяемост и преизползване на кода;
-Йерархична структура и организация;

20
Q

Как дъщерният клас надгражда родителския?

A

Всички методи се наследяват и чрез кл. дума ‘super’ в конструктора на дъщерния, достъпваме всички публични fields на родителския.

21
Q

Как дъщерния клас променя/разширява behavior-а на родителския?

A

В дъщерния създаваме ‘нов’ метод със същото име.

22
Q

Каква е разликата между ‘is-a’ и ‘has-a’ връзката?

A

‘is-a’ - един клас разширява друг:
Ако имаме клас “Плод” и клас “Ябълка”, можем да кажем, че “Ябълката е плод”. Тук класът “Ябълка” наследява характеристиките и поведението на класът “Плод”.

‘has-a’ - един клас притежава друг (композиция):
Ако имаме клас “Кола” и клас “Двигател”, можем да кажем, че “Колата има двигател”. Тук класът “Кола” съдържа обект от класът “Двигател”.

23
Q

Кога наследяването може да причини вреда?

A

Ако се преизползва, вдига сложността. Затова използваме композиция.

24
Q

Какъв е принципът на инверцията на зависимостите?

A

Предаване на зависимости чрез конструктор или методи, от които модулът се нуждае за работа.

25
Q

Как един клас може да използва методи от друг без да го разширява?

A

Създаваме композиции от инстанции на един клас в друг, така всеки клас се енкапсулира. Връзката е ‘has-a’.

26
Q

Какво е абстракция и защо е важна?

A

Абстракцията скрива ненужните детайли и запазва само това което ни трябва. Представя се в базовия и в подкласовете, като конкретизираме в подкласа и използваме абстракция в базовия.
Абстракцията гарантира простота.
Animal class & make sound

27
Q

Какво е полиморфизъм и защо е важен?

A

‘много форми’, попдклас може да се използва като своя родителски и да презаписва някои от поведенията му. Позволява кода да има различно значение.

28
Q

Какво са ‘кохезията’ и ‘къплингът’ и към какво да се стремим при писане на код?

A

Кохезията е мярка за сила на свързаност между данни и методи към една концепция.
Къплингът е степента на взаимозависимостите между софтуерните модули.
Стремим се към силна кохезия и слаб къплинг.
https://javascript.plainenglish.io/implementing-loose-coupling-high-cohesion-with-classes-in-javascript-422c52bfbec

29
Q

Какво са DRY, KISS, YAGNI?

A

DRY - Don’t repeat yourself. Да не се повтаря кода;
KISS - Keep it stupid simple. Опростяваме на макс където е приложимо.
YAGNI - You aren’t gonna need it. Да не бързаме да имплементираме код завбъдеще.

30
Q

Каква е целта на ООП принципите?

A

Главната идея е всичко да е просто и четимо, да преизползваме код, да го разширяваме и да осигуряваме сигурност.

Абстракция - гарантира простота (ако искаме да си уснем радиото, не е нужно да знаем как то работи);

Наследяване - взимаме атрибутите на друг клас и не пишем повторно код (DRY);

Полиморфизъм - позволява на кода да има друго значение;

Енкапсулация - прави класовете private, не могат да се модифицират отвън;

31
Q

Какво са Unit Tests и защо са важни? Кои са най-добрите практики за писане на Unit Tests?

A

Пишат се от разработчиците, проверява специфична функционалност на тествания код; По-добри са от ръчното тестване, по-четими, подобрява дизайна.

Трябва да са бързи, автоматични, всеки да може да ги пуска чрез кликане на бутон, да връща еднакви резултати винаги, актуални завбъдеще, напълно изолиран, да обхващат всички edge cases.

Най-добра практика е използване на ААА.
Arrange - условия на теста;
Act - тестът;
Assert - очакван резултат;