Skip to content

Commit ddb315d

Browse files
committed
WIP
1 parent c9f415c commit ddb315d

File tree

4 files changed

+138
-11
lines changed

4 files changed

+138
-11
lines changed

README.md

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,55 @@
11
# 🎩 «Денди-код»
22

3-
> Руководство о том, как писать код с аккуратностью, уважением к читателю и стилем — даже если вы новичок.
3+
> Кулинарная книга (cookbook) по выразимому, аккуратному коду: короткие рецепты с примерами «до/после» и понятными шагами внедрения.
44
55

66
## 📘 О книге
77

8-
Краткая и практичная книга о том, как писать понятный и аккуратный код с примерами на PHP. Книга не уходит в теоретические дебри, не спорит о вкусе и не переоценивает значение философии чистоты. Она фокусируется на самом первом шаге к хорошему коду — **его визуальной читаемости**. Здесь вы найдёте рекомендации, которые можно и нужно применять сразу на практике.
8+
Краткая и практичная книга о том, как писать понятный и аккуратный код с примерами на PHP. Приёмы универсальны и легко переносятся на любой объектно‑ориентированный язык. Вместо теории — конкретные «рецепты»: один приём — одна проблема — один понятный результат.
9+
10+
- Фокус на визуальной читаемости и «голосе» кода
11+
- Короткие главы, минимум «воды» и спорных догм
12+
- Примеры «плохо/хорошо», которые можно повторить за 10–15 минут
13+
14+
15+
## 👥 Кому подойдёт
16+
17+
- Начинающим — чтобы быстро выровнять стиль и уверенно читать чужой код
18+
- Опытным — как набор проверенных практик и согласованный язык команды
19+
- Тимлидам — как база для онбординга, код‑ревью и внутренних соглашений
20+
21+
22+
## 🧑‍🍳 Как пользоваться
23+
24+
### В одиночку
25+
- Откройте любую главу из `/content` → примените один рецепт к своему проекту
26+
- Начните с форматирования и имён, затем двигайтесь к условиям/исключениям и тестам
27+
- Фиксируйте прогресс чек‑листом pull‑реквестов: «минимум один рецепт на PR»
28+
29+
### В команде
30+
- Включите главы как основу для внутренних правил (style guide) и ревью‑чек‑листов
31+
- Автоматизируйте «механику» (линтеры, автоформатирование), обсуждайте «смысл» в ревью
32+
- Используйте главы для онбординга: по 1–2 рецепта на спринт, с короткими демо
33+
34+
35+
## 📚 Содержание (выборочно)
36+
37+
- [Форматирование](./content/005-code-style.md)
38+
- [Код должен дышать](./content/006-code-breath.md)
39+
- [Именование](./content/007-naming.md)
40+
- [Магические значения](./content/008-magic-value.md)
41+
- [Размер имеет значение](./content/009-size.md)
42+
- [Без лишних движений](./content/010-no-nonsense.md)
43+
- [Ранний выход](./content/011-early-exit.md)
44+
- [Управляющие конструкции](./content/012-conditions.md)
45+
- [Аргументы](./content/013-arguments.md)
46+
- [Обработка ошибок](./content/014-exceptions.md)
47+
- [Комментарии](./content/015-comments.md)
48+
- [Не бойся удалять код](./content/016-remove.md)
49+
- [Тесты](./content/017-tests.md)
50+
- [Играй по правилам (фреймворки)](./content/018-frameworks.md)
51+
- [Не отказывайтесь от будущего (обновления)](./content/019-upgrade.md)
52+
- [Второй пилот — не капитан (LLM)](./content/020-copilot.md)
953

1054

1155
## 🗂 Структура репозитория
@@ -18,22 +62,25 @@
1862

1963
## ❓ FAQ
2064

21-
**Когда будет готова книга?**
22-
Я пока не уверен в точных сроках. Просто нажмите на колокольчик рядом с кнопкой звезды, чтобы получать уведомления о новых изменениях!
65+
**Когда будет готова книга?**
66+
Я пока не уверен в точных сроках. Нажмите на «колокольчик» рядом со ⭐️, чтобы получать уведомления.
67+
68+
**Я не пишу на PHP — будет ли книга полезна?**
69+
Да. Принципы универсальны, примеры легко читаются и переносятся в любой ООП‑язык.
2370

24-
**Я не пишу на PHP — будет ли книга полезна для меня?**
25-
Определённо! Хотя примеры приведены на PHP, все советы универсальны и легко применимы к любому объектно-ориентированному языку программирования.
71+
**Можно ли использовать книгу для команды?**
72+
Да. Это cookbook: берёте рецепт → добавляете в чек‑лист ревью → автоматизируете там, где возможно.
2673

27-
**Могу ли я предложить свои идеи для книги?**
28-
Конечно! Если у вас есть идеи или предложения, буду рады их услышать. Пожалуйста, напишите мне в [Telegram](https://t.me/tabuna).
74+
**Как предложить идею или правку?**
75+
Создайте issue/PR или напишите автору в [Telegram](https://t.me/tabuna).
2976

30-
**Будет ли книга доступна в электронном формате?**
31-
Да, книга будет доступна в формате PDF и, возможно, других форматах.
77+
**Будет ли электронная версия?**
78+
Да, PDF и, возможно, другие форматы.
3279

3380

3481
## ✨ Поддержите проект
3582

36-
Если вам близка идея вдумчивого и человечного программирования — поставьте ⭐️ репозиторию.
83+
Если вам близка идея вдумчивого и человечного программирования — поставьте ⭐️ репозиторию.
3784
Это поможет книге найти своего читателя и ускорит её выпуск.
3885

3986
Если хотите поддержать проект финансово — это можно [сделать прямо сейчас](https://laravel.su/donate). Спасибо! 💖

cspell.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"version": "0.2",
3+
"language": "en,ru",
4+
"dictionaryDefinitions": [
5+
{
6+
"name": "cspell-custom-words",
7+
"path": "./cspell_custom_words.txt",
8+
"addWords": true
9+
}
10+
],
11+
"dictionaries": [
12+
"cspell-custom-words",
13+
"typescript",
14+
"html"
15+
],
16+
"import": ["@cspell/dict-ru_ru/cspell-ext.json"],
17+
"ignorePaths": [
18+
"node_modules",
19+
"deploy",
20+
"dist",
21+
"assets",
22+
"vendor",
23+
"draft",
24+
".github",
25+
".codeedit",
26+
"src"
27+
]
28+
}

cspell_custom_words.txt

Whitespace-only changes.

test.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
function extractMarkdownHeadings(string $directory): array
4+
{
5+
$headings = [];
6+
7+
$iterator = new RecursiveIteratorIterator(
8+
new RecursiveDirectoryIterator($directory)
9+
);
10+
11+
foreach ($iterator as $file) {
12+
if ($file->isFile() && strtolower($file->getExtension()) === 'md') {
13+
$lines = file($file->getPathname(), FILE_IGNORE_NEW_LINES);
14+
foreach ($lines as $line) {
15+
if (preg_match('/^(#{1,6})\s+(.+)$/', $line, $matches)) {
16+
$headings[] = [
17+
'file' => $file->getPathname(),
18+
'level' => strlen($matches[1]),
19+
'text' => $matches[2],
20+
];
21+
}
22+
}
23+
}
24+
}
25+
26+
// Сортировка по имени файла
27+
usort($headings, function ($a, $b) {
28+
return strcmp($a['file'], $b['file']);
29+
});
30+
31+
return $headings;
32+
}
33+
34+
// Пример использования:
35+
$directory = __DIR__.'/content'; // укажи путь к каталогу с md файлами
36+
$headings = extractMarkdownHeadings($directory);
37+
38+
// Вывод
39+
foreach ($headings as $heading) {
40+
41+
if ($heading['level'] < 2) {
42+
// continue;
43+
}
44+
45+
echo sprintf(
46+
"[%s] %s %s\n",
47+
// $heading['file'],
48+
'',
49+
str_repeat('#', $heading['level']),
50+
$heading['text']
51+
);
52+
}

0 commit comments

Comments
 (0)