Principles Flashcards

1
Q
  1. Что нужно сделать перед выполнением миграций?
A

Согласовать с другими разработчиками и убедиться в отсутствии конфликтующих миграций на одной модели. Всегда актуализировать состояние миграций перед созданием новых.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Почему важно согласовывать миграции с другими разработчиками?
A

Чтобы избежать конфликтующих миграций, которые могут вызвать проблемы с объединением и несоответствия в схеме базы данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Что нужно проверить перед реализацией новых функций или методов?
A

Убедиться, что данная функциональность уже не реализована в проекте.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. Какой фреймворк следует использовать для новых API и где должна быть написана логика?
A

Использовать Django Rest Framework (DRF) и писать логику в приложении api, в пакетах views и serializers.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Какие классы следует использовать для реализации API в DRF?
A

Предпочтительно использовать Generics или ModelViewSet. Используйте APIView только при необходимости.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Какие правила именования следует соблюдать для моделей и полей?
A

Модели должны называться в единственном числе, а поля должны быть названы читабельно и понятно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Как следует называть классы представлений и сериализаторов?
A

Назвать их так, чтобы по названию было понятно, что они делают.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. Какие стандарты кодирования следует соблюдать?
A

A: Следовать PEP8, включать докстринги для всех классов и нетривиальных методов, комментировать сложный код и правильно управлять импортами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Как следует называть URL для API согласно принципам REST?
A

Правильно: /education_programs/certification/
Правильно: /education_programs/{id}
Неправильно: /lesson/teacher/create

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Какой баланс нужно поддерживать при написании кода?
A

Поддерживать разумный баланс между разделением логики на несколько классов/функций и сохранением её в одном классе/функции.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Откуда должна быть создана новая ветка для задачи?
A

Всегда начинайте с последнего коммита на ветке dev и называйте ветку по номеру задачи (например, DOP-155).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Что нужно сделать, если есть вопрос, над которым думаете больше часа?
A

Спросите, максимально разложив ситуацию по полочкам.

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

Можно ли менять важные константы без согласования?

A

Нет, не изменяйте важные константы без согласования.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Что необходимо сделать для обеспечения надежности кода?
A

Тщательно тестируйте свой код.

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

Переобучение: Что означает “переобучение” в тестировании?

A

Программа хорошо работает с известными данными, но не справляется с новыми или неожиданными данными из-за слишком узко сфокусированных тестовых сценариев.

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

Тестирование: Какая проблема возникает при тестировании на слишком узком наборе данных?

A

Программа может пройти тесты, но при столкновении с новыми данными начинает давать сбои из-за недостаточного охвата тестами возможных реальных сценариев.

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

S: Что означает принцип единственной ответственности (Single Responsibility Principle)?

A

Класс должен выполнять только одну задачу.

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

S: Почему важен принцип единственной ответственности?

A

Упрощает понимание и изменение класса. Например, класс “Invoice” должен отвечать только за работу с фактурами, а не за отправку писем.

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

O: Что означает принцип открытости/закрытости (Open/Closed Principle)?

A

Класс должен быть открыт для добавления новой функциональности, но закрыт для изменения существующего кода.

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

O: Как применить принцип открытости/закрытости?

A

Вместо изменения класса, добавьте новый класс или метод. Например, если нужно добавить новый способ оплаты, создайте новый класс для этого способа, а не изменяйте старый.

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

L: Что означает принцип подстановки Лисков (Liskov Substitution Principle)?

A

Объекты подклассов должны заменять объекты суперклассов без проблем.

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

L: Пример принципа подстановки Лисков?

A

Если у вас есть класс “Bird” с методом “fly”, и подкласс “Sparrow”, который может летать, то при использовании объекта “Sparrow” вместо “Bird” программа должна работать корректно. Подкласс “Penguin” не должен наследовать метод “fly”, так как он нарушит принцип подстановки Лисков.

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

I: Что означает принцип разделения интерфейсов (Interface Segregation Principle)?

A

Не нужно заставлять класс реализовывать интерфейс, который ему не нужен.

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

I: Пример принципа разделения интерфейсов?

A

Вместо одного большого интерфейса “Worker” с методами “work” и “eat”, создайте два интерфейса: “Worker” с методом “work” и “Eater” с методом “eat”.

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

D: Пример принципа инверсии зависимостей?

A

Вместо создания объекта класса “LightBulb” напрямую в классе “Switch”, передавайте его через конструктор или интерфейс. Это позволит использовать разные типы лампочек без изменения класса “Switch”.

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

D: Что означает принцип инверсии зависимостей (Dependency Inversion Principle)?

A

Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций.

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

Что такое объект в ООП?

A

Объект - это экземпляр класса, который содержит данные и методы для работы с этими данными.

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

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

A

Класс - это шаблон или чертеж для создания объектов. Он определяет свойства (данные) и методы (функции) объектов.

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

Что такое наследование в ООП?

A

Наследование - это механизм, позволяющий одному классу наследовать свойства и методы другого класса.

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

Пример наследования:

A

Если у вас есть класс “Animal” с методом “makeSound”, класс “Dog” может наследовать “Animal” и иметь свой метод “makeSound”.

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

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

A

Инкапсуляция - это скрытие внутренней реализации объекта и предоставление доступа к данным только через публичные методы.

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

Пример инкапсуляции:

A

Переменные класса “BankAccount” являются приватными, и доступ к ним возможен только через методы deposit и withdraw.

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

Что такое полиморфизм в ООП?

A

Полиморфизм позволяет методам выполнять одно и то же действие по-разному в разных объектах.

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

Пример полиморфизма:

A

Метод draw в классе “Shape” может быть реализован по-разному в подклассах “Circle” и “Square”.

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

Что такое абстракция в ООП?

A

Абстракция - это процесс выделения общих характеристик и поведения объектов и их представление в виде классов и методов.

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

Пример абстракции:

A

Класс “Vehicle” может быть абстрактным и содержать методы start и stop, которые будут реализованы в подклассах “Car” и “Bike”.

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

Каковы преимущества ООП?

A

Преимущества включают: улучшение организации кода, повторное использование кода, простоту в поддержке и модификации, возможность моделировать реальные объекты и процессы.

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

Что такое метод в ООП?

A

Метод - это функция, определенная в классе, которая описывает поведение объектов класса.

38
Q

Что такое свойство (атрибут) в ООП?

A

Свойство (атрибут) - это переменная, определенная в классе, которая хранит данные объекта.

39
Q

Что такое конструктор в ООП?

A

Конструктор - это специальный метод класса, который вызывается при создании объекта и инициализирует его.

40
Q

Пример конструктора:

A

В классе “Person” конструктор может принимать параметры name и age и инициализировать соответствующие свойства объекта.

41
Q

Что такое деструктор в ООП?

A

Деструктор - это метод, который вызывается перед удалением объекта для освобождения ресурсов.

42
Q

Пример деструктора:

A

В классе “FileHandler” деструктор может закрывать открытый файл перед удалением объекта.

43
Q

Что такое интерфейс в ООП?

A

Интерфейс - это абстрактный тип, который определяет набор методов, но не их реализацию.

44
Q

Пример интерфейса:

A

Интерфейс “Shape” может определить методы draw и resize, которые будут реализованы в классах “Circle” и “Square”.

45
Q

Что такое паттерн Singleton?

A

Паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.

46
Q

Пример реализации Singleton на Python:

A
class Singleton:
    _instance = None

    def \_\_new\_\_(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).\_\_new\_\_(cls)
        return cls._instance
47
Q

Что такое паттерн Factory?

A

Паттерн Factory предоставляет интерфейс для создания объектов, но позволяет подклассам изменить тип создаваемого объекта.

48
Q

Пример реализации Factory на Python:

A

class AnimalFactory:
def create_animal(self, animal_type):
if animal_type == “dog”:
return Dog()
elif animal_type == “cat”:
return Cat()

49
Q

Что такое паттерн Observer?

A

Паттерн Observer определяет зависимость “один ко многим” между объектами так, что при изменении состояния одного объекта все зависимые объекты уведомляются и обновляются автоматически.

50
Q

Пример реализации Observer на Python:

A

class Subject:
def __init__(self):
self._observers = []

def attach(self, observer):
    self._observers.append(observer)

def notify(self):
    for observer in self._observers:
        observer.update()

class Observer:
def update(self):
pass

51
Q

Что такое паттерн Strategy?

A

Паттерн Strategy определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.

52
Q

Пример реализации Strategy на Python:

A

class Strategy:
def execute(self):
pass

class ConcreteStrategyA(Strategy):
def execute(self):
print(“Strategy A”)

class ConcreteStrategyB(Strategy):
def execute(self):
print(“Strategy B”)

class Context:
def set_strategy(self, strategy):
self.strategy = strategy

def execute_strategy(self):
    self.strategy.execute()
53
Q

Что такое паттерн Decorator?

A

Паттерн Decorator позволяет динамически добавлять поведение к объекту, оборачивая его в объект класса-обертки.

54
Q

Пример реализации Decorator на Python:

A

class Component:
def operation(self):
pass

class ConcreteComponent(Component):
def operation(self):
return “ConcreteComponent”

class Decorator(Component):
def __init__(self, component):
self._component = component

def operation(self):
    return f"Decorator({self._component.operation()})"
55
Q

Что такое паттерн Adapter?

A

Паттерн Adapter позволяет объектам с несовместимыми интерфейсами работать вместе.

56
Q

Пример реализации Adapter на Python:

A

class Target:
def request(self):
return “Target”

class Adaptee:
def specific_request(self):
return “Adaptee”

class Adapter(Target):
def __init__(self, adaptee):
self._adaptee = adaptee

def request(self):
    return f"Adapter({self._adaptee.specific_request()})"
57
Q

Что такое паттерн Command?

A

Паттерн Command превращает запросы в объекты, позволяя параметризовать методы с различными запросами, ставить запросы в очередь или протоколировать их.

58
Q

Пример реализации Command на Python:

A

class Command:
def execute(self):
pass

class ConcreteCommand(Command):
def __init__(self, receiver):
self._receiver = receiver

def execute(self):
    self._receiver.action()

class Receiver:
def action(self):
print(“Action performed”)

class Invoker:
def set_command(self, command):
self._command = command

def execute_command(self):
    self._command.execute()
59
Q

Что такое паттерн Proxy?

A

Паттерн Proxy предоставляет суррогат или заместителя другого объекта для контроля доступа к нему.

60
Q

Пример реализации Proxy на Python:

A

class RealSubject:
def request(self):
print(“RealSubject: Handling request”)

class Proxy:
def __init__(self, real_subject):
self._real_subject = real_subject

def request(self):
    print("Proxy: Checking access")
    self._real_subject.request()
61
Q

Что такое Code Smell?

A

Code Smell - это любой индикатор в коде, который может свидетельствовать о наличии проблем, влияющих на его качество и поддерживаемость.

62
Q

Duplicated Code: Что такое дублированный код?

A

Повторение одинаковых или очень похожих фрагментов кода в разных местах программы.

63
Q

Почему дублированный код - это плохо?

A

Усложняет сопровождение и тестирование кода, увеличивает вероятность ошибок.

64
Q

Как избавиться от дублированного кода?

A

Вынести повторяющийся код в отдельную функцию или класс.

65
Q

Long Method: Что такое длинный метод?

A

Метод, который содержит слишком много кода и выполняет несколько задач одновременно.

66
Q

Почему длинные методы - это плохо?

A

Усложняют понимание и тестирование кода, затрудняют его модификацию.

67
Q

Как сократить длинный метод?

A

Разделить метод на несколько более коротких методов, каждый из которых выполняет одну задачу.

68
Q

Large Class: Что такое большой класс?

A

Класс, который имеет слишком много методов и/или свойств и выполняет слишком много задач.

69
Q

Почему большие классы - это плохо?

A

Трудно понять, тестировать и сопровождать.

70
Q

Как уменьшить большой класс?

A

Разделить класс на несколько более маленьких классов, каждый из которых выполняет одну задачу.

71
Q

Long Parameter List: Что такое длинный список параметров?

A

Метод или функция, которые принимают слишком много параметров.

72
Q

Почему длинные списки параметров - это плохо?

A

Затрудняют использование метода и повышают вероятность ошибок при его вызове.

73
Q

Как сократить список параметров?

A

Использовать объекты или структуры данных для передачи группы связанных параметров.

74
Q

Primitive Obsession: Что такое примитивная одержимость?

A

Использование примитивных типов данных вместо создания специализированных классов или структур.

75
Q

Почему примитивная одержимость - это плохо?

A

Усложняет код и затрудняет внесение изменений.

76
Q

Как бороться с примитивной одержимостью?

A

Создавать классы или структуры данных для представления сложных концепций.

77
Q

Switch Statements: Что такое условные операторы?

A

Частое использование условных операторов (if-else или switch) для управления логикой программы.

78
Q

Почему частое использование условных операторов - это плохо?

A

Затрудняет понимание кода и его расширение.

79
Q

Как сократить использование условных операторов?

A

Использовать полиморфизм или паттерны проектирования, такие как Strategy или State.

80
Q

Comments: Что такое избыточные комментарии?

A

Комментарии, которые объясняют “что” делает код, а не “почему” или “как”.

81
Q

Почему избыточные комментарии - это плохо?

A

Усложняют сопровождение кода и могут вводить в заблуждение, если код изменится, а комментарии - нет.

82
Q

Как бороться с избыточными комментариями?

A

Писать самодокументируемый код и использовать комментарии только для объяснения сложной логики.

83
Q

Data Clumps: Что такое сгустки данных?

A

Частое использование группы связанных переменных вместе.

84
Q

Почему сгустки данных - это плохо?

A

Затрудняет понимание и модификацию кода.

85
Q

Как бороться с сгустками данных?

A

Объединить связанные данные в классы или структуры.

86
Q

Lazy Class: Что такое ленивый класс?

A

Класс, который мало что делает и не оправдывает свое существование.

87
Q

Почему ленивые классы - это плохо?

A

Усложняют код и увеличивают его объем без существенной пользы.

88
Q

Как избавиться от ленивого класса?

A

Объединить его с другим классом или удалить.

89
Q

Speculative Generality: Что такое спекулятивная обобщенность?

A

Код, написанный “на всякий случай” для возможных будущих потребностей.

90
Q

Почему спекулятивная обобщенность - это плохо?

A

Усложняет код и увеличивает его объем без текущей необходимости.

91
Q

Как избавиться от спекулятивной обобщенности?

A

Писать код только для текущих требований и добавлять новые возможности по мере необходимости.

92
Q

Principle: “Align Functionality with Responsibility”

A

Place functionality in the class or module responsible for that concern.

93
Q

Avoid adding methods to classes that don’t logically own or manage the data or behavior.

A

Ensures maintainability, separation of concerns, and scalable code.