Принцип разделения интересов (Separation of Concerns, SoC) — это концепция разделения кода на отдельные секции, отвечающие за разные аспекты функциональности. Давайте разберем, как SFC соотносятся с этим принципом.
Классическое веб-разработка разделяет:
<!-- index.html -->
<div class="app"></div>
<!-- style.css -->
.app { color: red; }
<!-- script.js -->
document.querySelector('.app').textContent = 'Hello'
В компонентно-ориентированных фреймворках SoC интерпретируется иначе — разделение по функциональным возможностям, а не по типам файлов.
Логическая инкапсуляция
Каждый компонент отвечает за одну конкретную функциональность:
<!-- UserProfile.vue -->
<template>...</template> <!-- Только представление профиля -->
<script>...</script> <!-- Только логика профиля -->
<style>...</style> <!-- Только стили профиля -->
Четкие границы ответственности
Компонент содержит все необходимое для своей работы, не полагаясь на внешние стили или глобальные обработчики.
Критерий | Классический подход | SFC подход |
---|---|---|
Единица SoC | Тип файла | Функциональность |
Повторное использование | Сложное | Простое |
Тестируемость | Зависит от реализации | Самодостаточно |
Масштабируемость | Проблематична | Оптимальна |
// Глобальный обработчик, меняющий стили многих компонентов
document.addEventListener('click', () => {
document.querySelectorAll('.card').forEach(el => {
el.style.color = 'red'
})
})
<!-- Card.vue -->
<template>
<div class="card" @click="handleClick">{{ content }}</div>
</template>
<script>
export default {
methods: {
handleClick() {
// Логика, относящаяся только к этому компоненту
}
}
}
</script>
<style scoped>
.card {
/* Стили, относящиеся только к этому компоненту */
}
</style>
Некоторые аргументы против SFC:
Однофайловые компоненты — это эволюция принципа SoC в контексте современной веб-разработки, где главным становится не формальное разделение кода по типам файлов, а создание независимых, повторно используемых функциональных единиц.