Principles Flashcards
- Что нужно сделать перед выполнением миграций?
Согласовать с другими разработчиками и убедиться в отсутствии конфликтующих миграций на одной модели. Всегда актуализировать состояние миграций перед созданием новых.
- Почему важно согласовывать миграции с другими разработчиками?
Чтобы избежать конфликтующих миграций, которые могут вызвать проблемы с объединением и несоответствия в схеме базы данных.
- Что нужно проверить перед реализацией новых функций или методов?
Убедиться, что данная функциональность уже не реализована в проекте.
- Какой фреймворк следует использовать для новых API и где должна быть написана логика?
Использовать Django Rest Framework (DRF) и писать логику в приложении api, в пакетах views и serializers.
- Какие классы следует использовать для реализации API в DRF?
Предпочтительно использовать Generics или ModelViewSet. Используйте APIView только при необходимости.
- Какие правила именования следует соблюдать для моделей и полей?
Модели должны называться в единственном числе, а поля должны быть названы читабельно и понятно.
- Как следует называть классы представлений и сериализаторов?
Назвать их так, чтобы по названию было понятно, что они делают.
- Какие стандарты кодирования следует соблюдать?
A: Следовать PEP8, включать докстринги для всех классов и нетривиальных методов, комментировать сложный код и правильно управлять импортами.
- Как следует называть URL для API согласно принципам REST?
Правильно: /education_programs/certification/
Правильно: /education_programs/{id}
Неправильно: /lesson/teacher/create
- Какой баланс нужно поддерживать при написании кода?
Поддерживать разумный баланс между разделением логики на несколько классов/функций и сохранением её в одном классе/функции.
- Откуда должна быть создана новая ветка для задачи?
Всегда начинайте с последнего коммита на ветке dev и называйте ветку по номеру задачи (например, DOP-155).
- Что нужно сделать, если есть вопрос, над которым думаете больше часа?
Спросите, максимально разложив ситуацию по полочкам.
Можно ли менять важные константы без согласования?
Нет, не изменяйте важные константы без согласования.
- Что необходимо сделать для обеспечения надежности кода?
Тщательно тестируйте свой код.
Переобучение: Что означает “переобучение” в тестировании?
Программа хорошо работает с известными данными, но не справляется с новыми или неожиданными данными из-за слишком узко сфокусированных тестовых сценариев.
Тестирование: Какая проблема возникает при тестировании на слишком узком наборе данных?
Программа может пройти тесты, но при столкновении с новыми данными начинает давать сбои из-за недостаточного охвата тестами возможных реальных сценариев.
S: Что означает принцип единственной ответственности (Single Responsibility Principle)?
Класс должен выполнять только одну задачу.
S: Почему важен принцип единственной ответственности?
Упрощает понимание и изменение класса. Например, класс “Invoice” должен отвечать только за работу с фактурами, а не за отправку писем.
O: Что означает принцип открытости/закрытости (Open/Closed Principle)?
Класс должен быть открыт для добавления новой функциональности, но закрыт для изменения существующего кода.
O: Как применить принцип открытости/закрытости?
Вместо изменения класса, добавьте новый класс или метод. Например, если нужно добавить новый способ оплаты, создайте новый класс для этого способа, а не изменяйте старый.
L: Что означает принцип подстановки Лисков (Liskov Substitution Principle)?
Объекты подклассов должны заменять объекты суперклассов без проблем.
L: Пример принципа подстановки Лисков?
Если у вас есть класс “Bird” с методом “fly”, и подкласс “Sparrow”, который может летать, то при использовании объекта “Sparrow” вместо “Bird” программа должна работать корректно. Подкласс “Penguin” не должен наследовать метод “fly”, так как он нарушит принцип подстановки Лисков.
I: Что означает принцип разделения интерфейсов (Interface Segregation Principle)?
Не нужно заставлять класс реализовывать интерфейс, который ему не нужен.
I: Пример принципа разделения интерфейсов?
Вместо одного большого интерфейса “Worker” с методами “work” и “eat”, создайте два интерфейса: “Worker” с методом “work” и “Eater” с методом “eat”.
D: Пример принципа инверсии зависимостей?
Вместо создания объекта класса “LightBulb” напрямую в классе “Switch”, передавайте его через конструктор или интерфейс. Это позволит использовать разные типы лампочек без изменения класса “Switch”.
D: Что означает принцип инверсии зависимостей (Dependency Inversion Principle)?
Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций.
Что такое объект в ООП?
Объект - это экземпляр класса, который содержит данные и методы для работы с этими данными.
Что такое класс в ООП?
Класс - это шаблон или чертеж для создания объектов. Он определяет свойства (данные) и методы (функции) объектов.
Что такое наследование в ООП?
Наследование - это механизм, позволяющий одному классу наследовать свойства и методы другого класса.
Пример наследования:
Если у вас есть класс “Animal” с методом “makeSound”, класс “Dog” может наследовать “Animal” и иметь свой метод “makeSound”.
Что такое инкапсуляция в ООП?
Инкапсуляция - это скрытие внутренней реализации объекта и предоставление доступа к данным только через публичные методы.
Пример инкапсуляции:
Переменные класса “BankAccount” являются приватными, и доступ к ним возможен только через методы deposit и withdraw.
Что такое полиморфизм в ООП?
Полиморфизм позволяет методам выполнять одно и то же действие по-разному в разных объектах.
Пример полиморфизма:
Метод draw в классе “Shape” может быть реализован по-разному в подклассах “Circle” и “Square”.
Что такое абстракция в ООП?
Абстракция - это процесс выделения общих характеристик и поведения объектов и их представление в виде классов и методов.
Пример абстракции:
Класс “Vehicle” может быть абстрактным и содержать методы start и stop, которые будут реализованы в подклассах “Car” и “Bike”.
Каковы преимущества ООП?
Преимущества включают: улучшение организации кода, повторное использование кода, простоту в поддержке и модификации, возможность моделировать реальные объекты и процессы.