#159

Вынеси отдельно запись и чтение структур данных

Когда ты работаешь над бизнес-логикой, тебе меньше всего хочется отвлекаться на низкоуровневые особенности хранения данных. Когда ты пишешь код хранилища, тебе не до высокого уровня бизнес-логики. Твое внимание и его концентрация — это самый дорогой ресурс в работе, поэтому фокусировать его нужно прицельно.

Весь код, который превращает высокоуровневые структуры данных (User, Project) в записи на диске (users.json, db.Projects, и т.п.) — нужно выделять в отдельные методы.

// Было

for (const record of records) {
  const user = {
    id: record.id,
    login: record.email,
    password: encrypt(record.password),
    createdAt: Date.now()
  };

  users[id] = user;
}

fs.writeFileSync('users.json', JSON.stringify(users));

// Стало, например:

for (const record of records) {
  users.addUser({
    id: record.id,
    login: record.email,
    password: record.password
  });
}

await users.sync();
// Было

char *line = malloc(1024); // так нельзя, конечно, но пост не об этом
sprintf(line, "%s %s %s\n", dateString, subsystem_name, formattedLine);
fputs(line, LOG_FILE);
fflush(LOG_FILE);
free(line);

// Стало

log(subsystem_name, "%s failed to join record", tableName);

Ты возразишь: я пользуюсь ORM, у меня это само собой.

Но нет. Для тебя ORM — это просто такое высокоуровневое хранилище. Скажем, если у тебя записи о пользователях и платежах раскиданы по разным моделям, то все равно где-то есть код, создающий нового пользователя. И там тебе нужно: создать пользователя, создать подписку в записи историй, присвоить пользователю доступ к платным фичам, а еще и провести платеж по финансовым табличкам. Все это вместе назови createPaidUser() в новой модели PaymentController.