Code Quality Flashcards

1
Q

Code Standards
Code Smells
Code Review Process
etc

Что такое стандарты написания кода?

A

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

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

Какие примеры стандартов написания кода на JavaScript ты знаешь?

A
  • Запрет на использование var
  • Использование только именованных экспортов
  • Строгое наличие default и break в switch/case
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие запахи кода тебе известны?

A
  1. Дублирование кода
  2. Длинный метод
  3. Большой класс
  4. Длинный список параметров
  5. Расходящиеся модификации
  6. Стрельба дробью
  7. Завистливые функции
  8. Группы данных
  9. Выходные аргументы
  10. Бесконтрольные побочные эффекты
  11. Временные зависимости
  12. Теоретическая общность
  13. Комментарии
  14. Аргументы-флаги
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

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

A
  1. Одно выражение в методах одного класса. Нужно выделить в метод.
  2. Одно выражение в двух подклассах одного уровня. Нужно выделить и поднять в родителя.
  3. Одно выражение в разных классах. Нужно выделять в отдельный класс.
  4. Условные конструкции в разных частях кода, проверяющие одинаковые условия. Нужно использовать полиморфизм.
  5. Одинаковые алгоритмы в разных местах, но с отличиями в некоторых аспектах. Помогут паттерны Шаблонный Метод или Стратегия.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Чем плохи длинные методы? Как бороться с таким запахом?

A

Чем длиннее процедура, тем труднее её понять.

Нужно выделять под-методы с понятными названиями.

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

Чем чреват запах “большой класс”? Как с ним бороться?

A

Если класс реализует слишком много функциональности, он сложнее для понимания. Он так же может нарушать принцип единственной ответственности.

Решение: выделить функциональность в другой класс или подкласс.

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

Чем плох длинный список параметров? Как с ним бороться?

A

Чем больше параметров, тем сложнее понять функцию.

Лучше всего, когда аргументов вообще нет. Далее следуют унарные, бинарные и тернарные формы. Четыре и более аргументов - очень сомнительны, их лучше избегать.

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

Как различить запах “расходящиеся модификации”? Как с ним бороться?

A

Это когда изменение одного требования приводит к изменению большого числа фрагментов всего класса. Помогает выделение классов.

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

Как различить запах “стрельба дробью”? Как с ним бороться?

A

«Стрельба дробью» — это одно изменение, затрагивающее много классов.

Нужно перемещать поля/методы в новый или существующий класс.

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

Что означает запах “завистливые функции”? Как с ним бороться?

A

Метод обращается к данным другого объекта чаще, чем к собственным данным.

Лечится перемещением метода (целиком или выделяя под-методы и перемещая их).

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

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

Если функция должна изменять чьё-то состояние, её лучше сделать методом этого объекта.

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

Что такое “временнЫе зависимости”?

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

Часто комментарии играют роль «дезодоранта» кода, который появляется в нём лишь потому, что код плохой.

Почувствовав потребность написать комментарий, попробуй изменить структуру кода так, чтобы любые комментарии стали излишними

17
Q

Действительно ли аргументы флаги ужасны?

A

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

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

18
Q

Как бы ты описал процесс код ревью (peer review)?

A
  1. Подготовка к ревью (самый важный этап!):
    - Скоуп изменений должен быть небольшим
    - Пулл реквест и описания коммитов должны быть краткими но выразительными
    - Нужно самостоятельно провести ревью используя diff
    - Нужно самостоятельно прогнать все тесты и устранить ошибки и предупреждения
  2. Процесс ревью
    - Модуль корректно спроектирован
    - Модуль достаточно покрыт тестами
    - Код корректно реализован
    - Код хорошо оформлен
    - Код достигает поставленную цель
  3. Комментарии по итогам ревью
19
Q

Что такое правило понижения?

A

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