Architecture knowledge Flashcards
OOP Functional Programming SOLID Design Patterns etc.
Какие парадигмы программирования ты знаешь?
Структурное программирование
Объектно-ориентированное программирование
Функциональное программирование
Как ты понимаешь термин “функциональная декомпозиция”?
Рекурсивное разложение модулей на элементарные (доказуемые) единицы.
Подробно: разложение большой задачи на ряд функций верхнего уровня. Дальше раскладываем каждую из фукций пока не получим ряд простейших операций.
Как ты можешь описать структурное программирование.
Структурное программирование сильно ограничивает использование операции goto, оставляя условия, циклы и присваивание. Оно позволяет применять к программам функциональную декомпозицию.
По большому счёту, используется почти во всех современных языках программирования.
Как ты определишь объектно-ориентированное программирование?
ООП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования
ООП строится на инкапсуляции, наследовании и полиморфизме.
Как ты понимаешь инкапсуляцию?
Объединение данных и функций, которые могут эти данные модифицировать в отдельные сущности. Инкапсуляция может обеспечивать сокрытие данных и методов.
Как ты понимаешь наследование?
Концепция, при которой абстрактный тип может наследовать и расширять структуру и функциональность существующего типа.
Как ты понимаешь полиморфизм?
Полиморфизм - семейство различных механизмов, позволяющих использовать один и тот же участок программы с различными типами
Параметрический полиморфизм - возможность обработки любого типа одинаковым кодом. Реализуется дженериками, темплейтами и т.п. Для динамически типизированных языков такой полиморфизм не определяется.
Ad Hoc Полиморфизм - наличие нескольких реализаций для работы с конечным числом типов. Реализуется через перегрузки или динамическую типизацию.
Заметка: понятие полиморфизма всегда тесно связано именно с понятием типа.
Какие принципы проектирования обозначаются аббревиатурой SOLID?
Single Responsibility Principle Open-Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle
Как Single Responsibility Principle реализуется на уровне функций?
Одна функция - одна операция (один уровень абстракции).
Бывает, что функции нужно выполнять несколько действий. В таком случае все действия должны оставаться на одном уровне абстракции.
Признаком нарушения этого принципа может служить вертикальное секционирование функций. Функцию выполняющую только одну операцию невозможно осмысленно разделить на секции.
Как Single Responsibility Principle реализуется на уровне архитектурных единиц (классов, модулей, etc)?
У класса (или модуля) может быть только одна причина для изменений.
Может быть только один актор (внешнее API, бухгалтерия клиента, внешняя БД, etc) который может запросить изменения. Это предотвращает создание ненужных зависимостей.
Как Open-Closed Principle реализуется на уровне небольших структурных единиц (функций, классов, и т.д.)?
Программные сущности должны быть открыты для расширения и закрыты для модификации.
Как Open-Closed Principle реализуется на уровне архитектурных единиц?
Программные сущности должны быть открыты для расширения и закрыты для модификации.
Как реализуется Liskov Substitution Principle с классами?
По принципу подстановки, объекты подклассов могут быть использованы аналогично объектам их суперкласса.
Методы и поля суперкласса можно только расширять, но не изменять/замещать.
Хороший антипример - наследование квадрата от прямоугольника.
Как реализуется Interface Segregation Principle?
Если классы вынуждены реализовывать методы, которые им не нужны, интерфейс нужно разделять.
Реализация ненужных методов создаёт избыточные зависимости.
Как Dependency Inversion Principle реализуется на уровне архитектурных единиц?
Модули высокого уровня не должны зависеть от низкоуровневых реализаций, зависимость должна быть обратной.
Детали должны зависеть от абстракций!
Например, модуль рисовки пикселей должен зависеть от модуля рисовки объектов, а тот в свою очередь должен зависеть от