|
9 | 9 | - [Про код](#про-код) |
10 | 10 | - [Основные принципы](#основные-принципы) |
11 | 11 | - [Атомарность операций](#атомарность-операций) |
| 12 | + - [Логические блоки](#логические-блоки) |
12 | 13 | - [Размеры методов, функций и модулей](#размеры-методов-функций-и-модулей) |
13 | 14 | - [Импорты](#импорты) |
14 | 15 | - [Файлы `__init__.py`](#файлы-__init__py) |
15 | 16 | - [Докстринги](#докстринги) |
16 | 17 | - [Про Pull Request](#про-pull-request) |
17 | 18 | - [Создание Pull Request](#создание-pull-request) |
| 19 | + - [Рефакторинг и Pull Request](#рефакторинг-и-pull-request) |
18 | 20 | - [Размер Pull Request](#размер-pull-request) |
19 | 21 | - [Про тулинг](#про-тулинг) |
20 | 22 | - [Пакетный менеджер (poetry)](#пакетный-менеджер-poetry) |
@@ -83,6 +85,64 @@ result = calculate_weather(hello) |
83 | 85 | **Почему?** Потому что код становится более читабельным, не нужно исполнять несколько выражений в голове во время чтения кода. Разбитый до простых атомных операций код воспринимается гораздо лучше, чем сложный уан-лайнер. Постарайтесь упростить свой код настолько, насколько это возможно - код чаще читается, чем пишется. |
84 | 86 |
|
85 | 87 |
|
| 88 | +### Логические блоки |
| 89 | + |
| 90 | +Постарайтесь делить код на логические блоки - так глазу программиста будет в разы проще прочитать и уловить суть. |
| 91 | + |
| 92 | +Плохо ❌: |
| 93 | +```python |
| 94 | +def register_model(self, app_label, model): |
| 95 | + model_name = model._meta.model_name |
| 96 | + app_models = self.all_models[app_label] |
| 97 | + if model_name in app_models: |
| 98 | + if (model.__name__ == app_models[model_name].__name__ and |
| 99 | + model.__module__ == app_models[model_name].__module__): |
| 100 | + warnings.warn( |
| 101 | + "Model '%s.%s' was already registered. " |
| 102 | + "Reloading models is not advised as it can lead to inconsistencies, " |
| 103 | + "most notably with related models." % (app_label, model_name), |
| 104 | + RuntimeWarning, stacklevel=2) |
| 105 | + else: |
| 106 | + raise RuntimeError( |
| 107 | + "Conflicting '%s' models in application '%s': %s and %s." % |
| 108 | + (model_name, app_label, app_models[model_name], model)) |
| 109 | + app_models[model_name] = model |
| 110 | + self.do_pending_operations(model) |
| 111 | + self.clear_cache() |
| 112 | +``` |
| 113 | + |
| 114 | +Хорошо ✅: |
| 115 | +```python |
| 116 | +def register_model(self, app_label, model): |
| 117 | + model_name = model._meta.model_name |
| 118 | + app_models = self.all_models[app_label] |
| 119 | + |
| 120 | + if model_name in app_models: |
| 121 | + if ( |
| 122 | + model.__name__ == app_models[model_name].__name__ and |
| 123 | + model.__module__ == app_models[model_name].__module__ |
| 124 | + ): |
| 125 | + warnings.warn( |
| 126 | + "Model '%s.%s' was already registered. " |
| 127 | + "Reloading models is not advised as it can lead to inconsistencies, " |
| 128 | + "most notably with related models." % (app_label, model_name), |
| 129 | + RuntimeWarning, stacklevel=2) |
| 130 | + |
| 131 | + else: |
| 132 | + raise RuntimeError( |
| 133 | + "Conflicting '%s' models in application '%s': %s and %s." % |
| 134 | + (model_name, app_label, app_models[model_name], model)) |
| 135 | + |
| 136 | + app_models[model_name] = model |
| 137 | + |
| 138 | + self.do_pending_operations(model) |
| 139 | + self.clear_cache() |
| 140 | +``` |
| 141 | + |
| 142 | +**Почему?** Кроме того, что это повышает читабельность, [Zen of Python](https://www.python.org/dev/peps/pep-0020/) рассказывает нам о том, как надо писать идиоматический код на Python. |
| 143 | +Одно из высказываний звучит как "Sparse is better than dense." - "Разреженное лучше чем сжатое". Сжатый код сложнее прочитать чем разреженный. |
| 144 | + |
| 145 | + |
86 | 146 | ### Размеры методов, функций и модулей |
87 | 147 |
|
88 | 148 | Предельный размер метода или функции - **50** строк. |
@@ -137,7 +197,13 @@ from some.absolute.path import foo, bar |
137 | 197 |
|
138 | 198 | Один Pull Request должен решать ровно одно issue. |
139 | 199 |
|
140 | | -**Почему?** Потому что ревьюверу сложнее держать контекст нескольких задач в голове и переключаться между ними. |
| 200 | +**Почему?** Потому что ревьюверу сложнее держать контекст нескольких задач в голове и переключаться между ними. Когда PR содержит несколько issue - это часто приводит к тому, что PR увеличивается и требует больше времени и сил на ревью от ревьювера. |
| 201 | + |
| 202 | + |
| 203 | +### Рефакторинг и Pull Request |
| 204 | +Рефакторинг лучше всего выносить в отдельный Pull Request. |
| 205 | + |
| 206 | +**Почему?** Когда рефакторинг идет вместе с решением определенного issue, то рефакторинг размывает контекст issue и вводит правки, которые не имеют отношения к данному PR. |
141 | 207 |
|
142 | 208 |
|
143 | 209 | ### Размер Pull Request |
|
0 commit comments