Найкраща структура файлів для вашого проєкту!

Anna Prykhodko
5 min readJan 26, 2022

--

Давайте поговоримо про те, чому цей заголовок є приманкою. Чому не існує жодної “найкращої” або “найгіршої” файлової архітектури та чому не варто довірятися статтям, що рекомендують конкретну структуру.

Photo by Viktor Talashuk on Unsplash

“Як я структурую мій проект React”, “Архітектура CSS”, “Як створити сучасну front-end архітектуру” та багато подібних статей, які я читала, виглядають приблизно однаково. Автор багато розповідає про свій багаторічний досвід, про кількість проєктів, на яких він використовує свою архітектуру, та про те, як краще стало жити з усіма цими файлами та папками. Як можна не повірити цій людині?

Кожна така стаття змушує мене сумувати. Але не тому, що автор помиляється і його папки не зручні, а тому, що це глибоко суб’єктивне, неважливе питання, яке викликає бурю невдоволення та суперечок.

Як ви використовуєте своє IDE?

Можливо, це найважливіше питання у темі “ідеальна структура папок”. Особисто я люблю використовувати дерево вкладень у бічній панелі або посилання на залежності. Але ви можете віддавати перевагу швидкому пошуку за ім’ям файлу, посиланням у хлібних крихтах, пошуку ключових слів, назв функцій/компонентів або просто тримаєте всі необхідні файли відкритими. Саме це різноманіття варіантів руйнує будь-яку, навіть найбільш зручну архітектуру — ніколи не буде зручно всім.

Photo by Jametlene Reskp on Unsplash

Наприклад, я не люблю велику вкладеність, оскільки відкривати чотири теки в бічній панелі, щоб дістатися до index.js, це біль. Коли я використовую посилання на залежності, це стає простіше. Пошук за ім’ям файлу також не пов’язаний з архітектурою, але я так і не звикла ним користуватися.

Це тільки здається, що /components/forms/login/components — це найкраща вкладеність для всіх і для всього.

Повірте, комусь це точно буде не зручно.

Так само як і одна єдина тека components, яка викличе запитання у більшості розробників. Це що, просто все туди складати? І навіть якщо це ціла сторінка? І навіть якщо це маленький компонент? Розв’язання таких питань і роздумів на тему “як покращити цю занадто просту архітектуру” може забрати досить багато часу, енергії та віри у світле майбутнє.

На скільки сильно ви любите дотримуватися правил?

Давайте будемо чесними, я люблю коли все по правилах і все розкладено по поличкам, але тільки за умови, що це мої правила.

Чим більше обмежень та умов, тим важче працювати з проєктом, бо потрібно все запам’ятати, не забути та головне — використовувати.

Photo by Ian Barsby on Unsplash

Стилістичні правила, які прописані в тексті (або ще гірше — проголошені усно) та контролюються іншими розробниками під час рев’ю коду, є незручними та можуть викликати конфлікти. Тому я визначила для себе таку стратегію:

Все, що не покрите автоматичною перевіркою коду, не є важливим.

Звичайно, це не стосується рев’ю алгоритмів, абстракцій, потоку даних, для яких і має проводитися рев’ю. Це також не означає, що проєкт можна перетворювати на смітник та писати кожен новий компонент по-новому. Але існує велика різниця між автоматичними перевірками стилістики та ручним контролем будь-якої дії розробників.

Повірте, в моїх особистих проєктах я маю сотню правил найменування файлів та папок, але в великому проєкті з великою командою я буду створювати файли точно так само, як їх створювали до мене.

Звичайно, можна переконати команду все переписати “правильно”, але спочатку дайте відповіді на запитання:

  • Скільки часу вам на це знадобиться?
  • Наскільки складно вашій команді буде перейти на нову архітектуру та звикнути до неї?
  • Чи маєте ви достатньо терпіння, щоб стежити за цим переходом та контролювати порушення ваших правил?
  • Яку користь принесуть ваші зміни?
  • Якщо ви залишите проєкт, скільки часу ваша архітектура протримається без вас?

Відповіді допоможуть вам усвідомити всю важливість вашого рішення.

Великі зміни та нові правила легко впроваджуються лише в особисті проєкти. Коли мова йде про команду з декількох людей, складність змін зростає у кілька разів, і потрібно вміти не лише казати, що правильно, але й нести відповідальність за своє рішення.

Як справи з вашим абстрактним мисленням?

Коли ми бачимо складну структуру, наш мозок намагається її декомпозувати та виділити закономірності в повторюваних елементах. Так легше сприймати інформацію. Тому, програмуючи, ми мислимо абстракціями.

Photo by JJ Ying on Unsplash

На жаль, розробники дуже люблять створювати абстракції, керуючись лише принципом DRY. І це доволі непогано характеризує рівень абстрактного мислення сучасних фахівців.

Якщо два компоненти схожі між собою, це не означає, що вони повинні бути в одній папці.

Наприклад,
створимо папку для сторінки входу — login, всі компоненти покладемо туди.
Але що робити з випливаючим діалогом, в якому також є форма входу?
Покласти його в ту ж папку?
Але ж діалог не знаходиться на цій сторінці, він підключений в шапці на всіх інших сторінках.
Покласти його в папку
modals, де знаходяться інші випливаючі вікна?
Але як тоді зручніше перевикористовувати форму?
Винести форму в папку
forms, де лежать всі форми?
Але тоді руйнується цілісність папок сторінок та компонентів…

Як бачите, дірява абстракція створює більше питань, ніж приносить користі.

Абстракції це складно, а хороші абстракції — практично недосяжна розкіш у сучасних зростаючих і постійно змінюючихся проєктах. Тому найкраща порада — спрощуйте, повторюйтесь, менше групуйте все, що потрапляє вам під руку, у більшості випадків це зайве додаткове навантаження, яке ускладнює ваш проєкт.

Інакше вам, так само як і мені, буде соромно за всі ті папки forms і modals, utils і services, components/common структури та інші рішення “на майбутнє”, з якими тепер хтось продовжує страждати або в кращому випадку не користується.

А замість висновку, спробуйте пригадати всі “найкращі правила” для структури проєкту, які ви використовували протягом усього свого досвіду роботи. Я впевнена, що їх буде кілька: розділяти HTML, CSS, JS за різними папками; розділяти компоненти та все, що до них відноситься, за папками; розділяти за папками “розумні”/“дурні” компоненти, сторінки, інтерфейси. Це лише частина мого списку. А який він у вас?

На мою думку, правила, які постійно змінюються, не можуть бути правилами. Тому не варто слідувати їм бездумно, на хвилі гайпу. В той же час не варто створювати стандартні папки utils, components та подібні, просто за звичкою. Фокусуйтеся на тому, що ви робите та для чого, чому певне рішення зручне для вашого проєкту, чи навпаки, не працює саме для вас.

Це і є основою для гарної архітектури проєкту.

Дякую за те, що дочитали!
Побачимось наступного разу! 🤹🏻‍♀️

--

--