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