TGViewer
Заметки про React Заметки про React @ru_react_notes · 3.43K subscribers
Post #501 3.8K
Сохраняйте один уровень абстракции для каждой функции

Представьте компонент, который показывает информацию о текущем пользователе и статус активен ли пользователь в данный момент. Пример такого компонента:


import { useState, useEffect } from "react";

function UserProfile({ userId }) {
const [user, setUser] = useState(null);

useEffect(() => {
fetch(`https://api.example.com/users/${userId}`)
.then(response => response.json())
.then(data => {
const isActive = data.accountStatus === "active" &&
new Date(data.lastLogin) >= new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);

setUser({
name: `${data.firstName} ${data.lastName}`,
email: data.email,
isActive,
});
});
}, [userId]);

if (!user) {
return <p>Loading...</p>;
}

return (
<div>
{user.name} is {user.isActive ? "active" : "inactive"}
</div>
);
}


Это довольно распространенный пример компонента на React. Он не сложный, но в нем есть одна проблема: смешение разных уровней абстракций.

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

Рассмотрим тот же компонент после рефакторинга:


import { useState, useEffect } from "react";

function UserProfile({ userId }) {
const [user, setUser] = useState(null);

useEffect(() => {
fetchUser(userId).then((data) => setUser(normalizeUser(data)));
}, [userId]);

if (!user) {
return <Loader />;
}

return <UserStatus user={user} />;
}


Обратите внимание, насколько легче стало его читать. Достаточно одного взгляда, чтобы разобраться что компонент делает.

https://www.tymzap.com/blog/the-magic-of-keeping-one-abstraction-level-per-function
Tymzap The magic of keeping one level of abstraction per function • Tymek Zapała I’m a software engineer and product maker based in Cracow, Poland. My mission is to create useful products by writing high-quality code and sharing my knowledge throughout the journey.
  • 👍 21
  • 👎 2
  • ❤ 1
More from @ru_react_notes
  1. Jun 24, 2025Реактивность – это легко Стандартный useContext заставляет обновляться все компоненты-потр…
  2. Jun 17, 2025Остерегайтесь скрытых проблем при работе с search params Типо-безопасность — это только ве…
  3. Jun 4, 2025Почему Error Boundary, а не просто try/catch для компонентов В React нельзя использовать t…
  4. May 29, 2025Анонс TypeScript Native Вышла превью версия TypeScript написанная на Go. Ее можно установи…
  5. May 27, 2025Управление фокусом в React с помощью flushSync Установить фокус на инпуте сразу в React мо…
  6. May 15, 2025TanStack DB TanStack представила новую библиотеку – TanStack DB – реактивный клиентский ст…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →