Есть метод для написания особо нудных и сложных участков кода.
Я его называю метод замены комментариев.
Мне он помогает, поэтому делюсь с вами.
Проблема
Чаще всего я представляю код в уме ещё до того, как его написал.
То есть я могу представить код целиком, а потом просто записать его.
Иногда это не получается: или задача сложная, или пока что непонятно как её решить, или же я просто устал и думать не получается.
Можно, конечно, просто писать код как пишется и разбираться по ходу действия. Но если писать код без обдумывания, что именно писать, скорее всего придётся код переписать несколько раз, чтобы добиться правильного результата. Это большие потери времени.
Как обдумать код, если не получается всё сделать мысленно?
Шаг 1. Записываем комментарии
Я пишу комментарии текстом о том, что собираюсь сделать, по шагам.
Пока я пишу, формулируя каждый шаг я уже всё более чётко представляю что будет происходить в коде.
Если вижу что шаги завели меня в тупик, то стираю комментарии и пишу заново. Это быстрее, чем переписать код.
Примерно за 5-10 минут выписываю все шаги.
Я перечитываю текст, дополняю и редактирую его, пока не получится логичная и понятная последовательность.
Занимает это примерно 2-3 минуты.
Пример:
private function addFieldToMigration(string $fieldDefinition): void
{
// Открываем файл.
// Читаем все строки.
// Определяем номер строки завершающей "Schema::create(", изначально 19
// Если перед этой строкой идёт "$table->timestamps();" то идём на строку выше
// Вставляем новую строку
// Перезаписываем файл.
}
Шаг 2. Дописываем код к каждому комментарию
У меня уже готов план действий в виде текстовых комментариев.
Теперь я могу для каждого из комментариев написать код, фокусируясь на одном маленьком шаге за один раз.
Это гораздо легче, чем держать в голове логику всего метода.
Если вдруг забуду что я делал и зачем, перечитав комментарии я сразу сориентируюсь.
Так, шаг за шагом, я добавляю код для каждого комментария.
Пример:
private function addFieldToMigration(string $fieldDefinition): void
{
// Открываем файл.
// Читаем все строки.
$fs = new FileSystem();
$migrationPath = $this->getMigrationsPath()
. DIRECTORY_SEPARATOR . $this->getMigrationName() . '.php';
$content = $fs->readFile($migrationPath);
$rows = explode("\n", $content);
// Определяем номер строки завершающей "Schema::create(", изначально 19
$index = -1;
for ($i = 0; $i < count($rows); $i++) {
$row = trim($rows[$i]);
if ($row === '});') {
// Если перед этой строкой идёт "$table->timestamps();" то идём на строку выше
if (($i > 0) && (trim($rows[$i - 1]) === '$table->timestamps();')) {
$index = $i - 1;
} else {
$index = $i;
}
break;
}
}
if ($index === -1) {
throw new \LogicException('Не удалось найти место для вставки кода в миграции');
}
// Вставляем новую строку
$firstPart = array_slice($rows, 0, $index);
$secondPart = array_slice($rows, $index);
$fieldRow = " {$fieldDefinition}";
$newRows = array_merge($firstPart, [$fieldRow], $secondPart);
// Перезаписываем файл.
$fs->writeFile($migrationPath, implode("\n", $newRows));
}
Шаг 3. Удаляем комментарии
После того как код написан, комментарии больше не нужны.
Удаляю их.
Чем меньше комментариев в коде тем лучше, а эти уже сделали своё дело.
Результат
Пользуясь этим методом, я облегчаю написание сложных или нудных участков кода.
Поначалу мне казалось что этот метод не несёт ценности, но я его попробовал и убедился что он мне помогает.
Надеюсь, поможет и вам.