
Принцип разделения интерфейсов (ISP) гласит, что клиенты не должны зависеть от методов, которые они не используют. В контексте React.js это означает, что компоненты не следует заставлять принимать реквизиты, которые они не используют.
Давайте рассмотрим пример компонента, нарушающего ISP:
interface Props
type: 'user' | 'project';
project?: Project;
user?: User;
}
const Notification: React.FC<Props> = ({ project, type, user }) => {
if (type === 'project' && project) {
return (
<p>
Your project {project.name} has {project.views} new views
</p>
);
}
if (type === 'user' && user) {
return <p>The user {user.name} is now following you</p>;
}
return null;
};
Этот компонент нарушает ISP, потому что заставляет компонент принимать реквизиты проекта и пользователя, даже если они не нужны. Это может привести к таким проблемам, как:
- Код беспорядочный и трудный для чтения из-за использования множества операторов if.
- Компонент Notification принимает необязательные реквизиты, что приводит к ненужной сложности.
- Компонент должен возвращать элемент JSX или значение null, поэтому, если ни одно из утверждений if не является истинным, компонент вернет значение null, что может привести к ошибкам в приложении.
Чтобы решить эту проблему, мы можем реорганизовать компонент, чтобы использовать более мелкие и целенаправленные компоненты. Следовательно, мы можем создать компонент ProjectNotification, который принимает реквизит проекта, и компонент UserNotification, который принимает реквизит пользователя.
interface ProjectNotificationProps
project: Project;
}
const ProjectNotification: React.FC<ProjectNotificationProps> = ({ project }) => (
<p>
Your project {project.name} has {project.views} new views
</p>
);
interface UserNotificationProps {
user: User;
}
const UserNotification: React.FC<UserNotificationProps> = ({ user }) => (
<p>The user {user.name} is now following you</p>;
);
Этот рефакторинг устраняет проблемы, которые были вызваны тем, что исходный компонент нарушил ISP. Теперь компонент может принять только те реквизиты, которые ему нужны, что упрощает использование и тестирование компонента.
В заключение, ISP можно использовать для написания более удобных в обслуживании и повторно используемых компонентов React, гарантируя, что компоненты принимают только те реквизиты, которые им нужны.