SOLID
Single responsibility
— клас відповідає за одну функцію
— код позбавляється копіпасти (дублікатів)
— при дебагу простіше виправляти помилки, бо немає шматків коду, що повторюються
Нехай у вас є якийсь клас Date, який віддає інформацію про температуру та час. Якщо якийсь Вася хоче отримати інформацію про час, йому доведеться продублювати обидва методи цього класу. Те саме стосується й якогось Андрія, який захоче отримати інформацію про температуру.
————— ————— —————
|DateTemp| копія |Date | копія |DateTime |
—————— ——————
|- temp() | |- time() | |- time() |
—————— |- temp() | ——————
—————
Правильніше буде створити 2 окремі класи, які повертатимуть температуру та час відповідно.
Opened-closed
— клас має бути відкритий для розширення, і закритий для змін
— чому добре дотримуватися цього принципу? якщо у вас був уже протестований шматок коду і ви додаєте новий, не змінюючи поточний, вам не потрібно тестувати старий. швидше за все, у ньому не буде багів
Liskov Substitution
— поведінка спадкових класів не повинна суперечити роботі базових
— підклас не повинен вимагати від коду, що викликає, більше, ніж базовий клас, і не повинен надавати коду, що викликає, менше, ніж базовий клас.
— Там де використовується Child клас, повинен підходити і його Parent
Наприклад, у вас є класи Child та Parent. Неправильною буде наступна реалізація:
— використовуючи Parent, можна викликати будь-який метод, а використовуючи Child потрібні додаткові дії для виклику того ж методу. Наприклад, виклик якогось init()
— якщо метод getMessages() класу Parent повертає колекцію з бази даних, Child не повинен повертати порожній масив або null
Допустимо, у вас є класи Rectangle та Square, який успадковується від першого. Якщо написати тест на Rectangle, який вважатиме площу функцією a*b, виникне помилка, так як у дочірньому класі Square не реалізована сторона b.
——— ————
|Rect | extends | Square |
———
Single responsibility
— клас відповідає за одну функцію
— код позбавляється копіпасти (дублікатів)
— при дебагу простіше виправляти помилки, бо немає шматків коду, що повторюються
Нехай у вас є якийсь клас Date, який віддає інформацію про температуру та час. Якщо якийсь Вася хоче отримати інформацію про час, йому доведеться продублювати обидва методи цього класу. Те саме стосується й якогось Андрія, який захоче отримати інформацію про температуру.
————— ————— —————
|DateTemp| копія |Date | копія |DateTime |
—————— ——————
|- temp() | |- time() | |- time() |
—————— |- temp() | ——————
—————
Правильніше буде створити 2 окремі класи, які повертатимуть температуру та час відповідно.
Opened-closed
— клас має бути відкритий для розширення, і закритий для змін
— чому добре дотримуватися цього принципу? якщо у вас був уже протестований шматок коду і ви додаєте новий, не змінюючи поточний, вам не потрібно тестувати старий. швидше за все, у ньому не буде багів
Liskov Substitution
— поведінка спадкових класів не повинна суперечити роботі базових
— підклас не повинен вимагати від коду, що викликає, більше, ніж базовий клас, і не повинен надавати коду, що викликає, менше, ніж базовий клас.
— Там де використовується Child клас, повинен підходити і його Parent
Наприклад, у вас є класи Child та Parent. Неправильною буде наступна реалізація:
— використовуючи Parent, можна викликати будь-який метод, а використовуючи Child потрібні додаткові дії для виклику того ж методу. Наприклад, виклик якогось init()
— якщо метод getMessages() класу Parent повертає колекцію з бази даних, Child не повинен повертати порожній масив або null
Допустимо, у вас є класи Rectangle та Square, який успадковується від першого. Якщо написати тест на Rectangle, який вважатиме площу функцією a*b, виникне помилка, так як у дочірньому класі Square не реалізована сторона b.
——— ————
|Rect | extends | Square |
———