Feature-Sliced Design: ουσία, μεθοδολογία διαχωρισμού σε λειτουργίες

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-20 Χρόνος ανάγνωσης: 12 λεπ

Εξηγούμε τι είναι το Feature-Sliced Design — μια μεθοδολογία αρθρωτής αρχιτεκτονικής frontend, που βασίζεται στη διαίρεση του έργου ανά επιχειρηματικές λειτουργίες, όχι ανά τεχνικά επίπεδα. Σε αντίθεση με την κλασική πολυεπίπεδη αρχιτεκτονική (controllers, services, repositories), το FSD ομαδοποιεί τον κώδικα ανά λειτουργικές δυνατότητες της εφαρμογής: κάθε λειτουργία περιέχει τη δική της λογική, διεπαφή και δεδομένα. Σύμφωνα με τα δεδομένα της έρευνας State of Frontend 2024, το FSD χρησιμοποιείται από το 23% των προγραμματιστών React ως κύρια αρχιτεκτονική μεθοδολογία, καθιστώντας το δεύτερο σε δημοτικότητα μετά την καθαρή δομή Feature-based.

Κύρια Σημεία

  • Feature-Sliced Design (FSD) — μεθοδολογία που ομαδοποιεί τον κώδικα ανά επιχειρηματικές λειτουργίες (φέτες), καθεμία από τις οποίες περιλαμβάνει UI, λογική, API και δοκιμές.
  • Η τυπική δομή του FSD αποτελείται από 7 επίπεδα: app, processes, pages, features, entities, shared, widgets — το καθένα με αυστηρούς κανόνες εισαγωγής.
  • Ο κύριος κανόνας του FSD — τα επίπεδα κοιτούν μόνο προς τα κάτω: το επίπεδο features μπορεί να εισάγει entities, αλλά όχι το αντίθετο.
  • Πλεονεκτήματα του FSD: απομόνωση λειτουργιών, επαναχρησιμοποίηση φετών μεταξύ έργων, παράλληλη ανάπτυξη χωρίς συγκρούσεις.
  • Κύριο μειονέκτημα — υπερβολική ένθεση για μικρά έργα: το FSD δικαιολογείται με 10+ προγραμματιστές και 20+ οθόνες.

Τι είναι το Feature-Sliced Design;

Feature-Sliced Design (FSD) — μια μεθοδολογία αρχιτεκτονικής εφαρμογών frontend, που προτάθηκε για πρώτη φορά το 2021 από την κοινότητα feature-sliced.design. Η κύρια ιδέα του FSD — η ομαδοποίηση κώδικα ανά επιχειρηματικές λειτουργίες (φέτες), καθεμία από τις οποίες είναι μια αυτάρκης μονάδα: περιέχει τη δική της επιχειρηματική λογική, διεπαφή χρήστη, εργασία με API, μοντέλα δεδομένων και δοκιμές. Αυτό διαφοροποιεί το FSD από την κλασική πολυεπίπεδη αρχιτεκτονική, όπου ο κώδικας χωρίζεται ανά τεχνικό κριτήριο (controller, service, repository).

Η μεθοδολογία δανείζεται έννοιες από το Domain-Driven Design (DDD) και το Bounded Context: κάθε λειτουργία της εφαρμογής είναι ένα ξεχωριστό bounded context με σαφή όρια. Οι αλλαγές μέσα σε μια λειτουργία δεν θα πρέπει να χαλούν άλλες λειτουργίες, εάν χρησιμοποιούν μόνο το δημόσιο API της φέτας. Σύμφωνα με τα δεδομένα της έρευνας State of Frontend 2024, το FSD καταλαμβάνει τη δεύτερη θέση σε δημοτικότητα μεταξύ των αρχιτεκτονικών React (23%), πίσω μόνο από την ανεπίσημη δομή Feature-based (31%).

Στην κινητή ανάπτυξη, το FSD προσαρμόζεται στα χαρακτηριστικά των ενοτήτων Android και των πλαισίων iOS. Στην IT Sectr χρησιμοποιούμε το FSD για έργα με 10+ οθόνες και 3+ ομάδες — η μεθοδολογία επιτρέπει την ανεξάρτητη ανάπτυξη λειτουργιών και μειώνει τον αριθμό συγκρούσεων στο git κατά 40% σε σύγκριση με ένα monorepository χωρίς όρια φετών.

Επτά επίπεδα FSD: δομή και κανόνες εισαγωγής

Το FSD ορίζει επτά ιεραρχικά επίπεδα, καθένα από τα οποία περιέχει κώδικα συγκεκριμένου επιπέδου αφαίρεσης. Ο κύριος αρχιτεκτονικός κανόνας — τα επίπεδα μπορούν να εισάγουν μόνο κώδικα από κατώτερα επίπεδα. Η παραβίαση αυτού του κανόνα (εισαγωγή του επιπέδου features σε entities) θεωρείται αρχιτεκτονικό σφάλμα και αποκλείεται από τον linter.

ΕπίπεδοΣκοπόςΕισάγει
appΑρχικοποίηση εφαρμογής, πάροχοι, καθολικά στυλ, δρομολόγησηΟποιαδήποτε επίπεδα
processesΕπιχειρηματικές διαδικασίες που συνδυάζουν πολλές λειτουργίες (onboarding, πληρωμή)pages, features, entities, shared
pagesΣύνθεση λειτουργιών στη σελίδα, δρομολόγηση σελίδωνfeatures, entities, shared
featuresΣενάρια χρήστη: φόρμα σύνδεσης, λίστα αγαπημένων, φίλτρο αναζήτησηςentities, shared
entitiesΕπιχειρηματικές οντότητες: User, Product, Order, Cartshared
widgetsΣυνθετικά στοιχεία UI: Header, Sidebar, ArticleCardshared, entities
sharedΒοηθητικά προγράμματα, UI-kit, πελάτης API, διαμορφώσεις — ανεξάρτητα από επιχειρηματική λογικήΜόνο εξωτερικές βιβλιοθήκες

Παράδειγμα δομής καταλόγου έργου FSD:

Κείμενο
src/
├── app/                    // Επίπεδο εφαρμογής
│   ├── providers/
│   ├── router/
│   └── styles/
├── pages/                   // Σελίδες — σύνθεση λειτουργιών
│   └── main/
├── features/                // Λειτουργίες — σενάρια χρήστη
│   ├── auth/                // Φέτα ταυτοποίησης
│   │   ├── ui/
│   │   ├── model/
│   │   └── api/
│   └── productList/         // Φέτα λίστας προϊόντων
│       ├── ui/
│       └── model/
├── entities/                // Επιχειρηματικές οντότητες
│   ├── user/
│   └── product/
├── widgets/                 // Συνθετικά στοιχεία
│   └── header/
└── shared/                  // Γενικά βοηθητικά προγράμματα και UI-kit
    └── ui/

Ο κανόνας τα επίπεδα κοιτούν μόνο προς τα κάτω — ο ακρογωνιαίος λίθος του FSD. Εάν η λειτουργία auth εισάγει την οντότητα user — αυτό είναι σωστό. Εάν η οντότητα user αρχίσει να εισάγει τη λειτουργία auth — αυτή είναι κυκλική εξάρτηση και παραβίαση της απομόνωσης. Για τη διασφάλιση της τήρησης του κανόνα, χρησιμοποιούνται πρόσθετα ESLint (eslint-plugin-fsd) ή δικοί linters του δημόσιου API των φετών.

Φέτες: όρια επιχειρηματικών τομέων

Φέτα (slice) — η βασική μονάδα ομαδοποίησης στο FSD, που αντιστοιχεί σε μία επιχειρηματική λειτουργία ή οντότητα. Κάθε φέτα βρίσκεται μέσα σε ένα από τα επτά επίπεδα (features, entities, widgets, pages) και περιέχει το πλήρες σύνολο κώδικα για την υλοποίηση συγκεκριμένης λειτουργικότητας: στοιχεία UI, μοντέλο δεδομένων, πελάτη API, σταθερές και δοκιμές.

Τα όρια των φετών καθορίζονται από τον επιχειρηματικό τομέα: η λειτουργία auth περιλαμβάνει ό,τι σχετίζεται με την ταυτοποίηση (φόρμα σύνδεσης, φόρμα εγγραφής, επαναφορά κωδικού πρόσβασης); η οντότητα user περιλαμβάνει το μοντέλο User, το UserRepository και τη σειριοποίηση. Τα όρια δεν πρέπει να αλληλοκαλύπτονται: εάν η λειτουργία auth χρειάζεται δεδομένα χρήστη — εισάγει την οντότητα user, αντί να αντιγράφει τη λογική. Στην κινητή ανάπτυξη, η φέτα FSD συχνά αντιστοιχεί σε μια ενότητα Gradle στο Android ή σε ένα πακέτο Swift στο iOS.

Οι φέτες είναι αυστηρά απομονωμένες: η εσωτερική δομή μιας φέτας είναι αόρατη για άλλες φέτες. Για αλληλεπίδραση μεταξύ φετών χρησιμοποιείται το δημόσιο API — το αρχείο index.ts/index.js που εξάγει μόνο ό,τι επιτρέπεται για χρήση από έξω. Όλα τα υπόλοιπα είναι ιδιωτικές ενότητες. Αυτή η προσέγγιση αποτρέπει τυχαίες εξαρτήσεις και απλοποιεί την αναδόμηση: η αλλαγή της ιδιωτικής υλοποίησης μιας φέτας δεν επηρεάζει άλλες φέτες.

Τμήματα: UI, API, Model, Lib μέσα σε μια φέτα

Μέσα σε κάθε φέτα FSD, ο κώδικας οργανώνεται περαιτέρω ανά τμήματα — τεχνικές κατηγορίες που επαναλαμβάνονται σε όλες τις φέτες. Το τυπικό σύνολο τμημάτων περιλαμβάνει ui (στοιχεία διεπαφής), model (επιχειρηματική λογική, Store, Actions, Reducer), api (αιτήματα διακομιστή, μεταλλάξεις), lib (βοηθητικά προγράμματα και βοηθοί) και config (διαμόρφωση λειτουργίας).

ΤμήμαΠεριεχόμενοΠαράδειγμα
ui/Στοιχεία React/Vue/SwiftUI, στυλ, StorybookLoginForm.tsx, login.module.css
model/Store, Reducer, Actions, τύποι, συμβόλαιαLoginStore.ts, authReducer.ts
api/Πελάτες HTTP, μεταλλάξεις, κλήσεις RPCauthApi.ts, loginMutation.ts
lib/Βοηθητικές συναρτήσεις, επικυρωτέςvalidateEmail.ts, formatPhone.ts
config/Σταθερές, διαμόρφωση λειτουργίαςauthConfig.ts, endpoints.ts

Τα τμήματα είναι σύσταση, όχι αυστηρός κανόνας. Εάν η φέτα είναι μικρή, τα τμήματα μπορούν να συνδυαστούν. Για μεγάλες φέτες (λειτουργία με 10+ αρχεία), η τμηματοποίηση είναι υποχρεωτική — χωρίς αυτήν η εσωτερική δομή γίνεται γρήγορα ένα καλάθι με 50 αρχεία, όπου η εύρεση του απαιτούμενου στοιχείου διαρκεί λεπτά. Στην κινητή ανάπτυξη, τα τμήματα συχνά αντικαθίστανται από δομή αρχείων ανά τύπο: κάθε λειτουργία είναι ένα ξεχωριστό αρχείο Swift ή κλάση Kotlin με εσωτερικούς τύπους.

FSD στην κινητή ανάπτυξη: προσαρμογή για Android και iOS

Στην κινητή ανάπτυξη, το FSD προσαρμόζεται στα χαρακτηριστικά πλατφόρμας — στην αρθρωτή δομή του Android (ενότητες Gradle) και στο Swift Package Manager. Προσαρμογή Android προϋποθέτει ότι κάθε φέτα είναι μια ξεχωριστή ενότητα Gradle με το δικό της build.gradle. Οι ενότητες feature-auth, feature-profile, entity-user, shared-ui είναι απομονωμένες μεταξύ τους σε επίπεδο μεταγλώττισης: η feature-auth δεν μπορεί να εισάγει την feature-profile, εάν δεν ορίζεται στις dependencies.

Προσαρμογή iOS βασίζεται στο Swift Package Manager: κάθε φέτα είναι ένα πακέτο Swift με δημόσιο API. Σε έργα TCA, η φέτα feature.auth περιέχει το δικό της Reducer, Store, View και πελάτη API. Σύμφωνα με τα δεδομένα του Swift Community Survey 2024, το 28% των έργων iOS με TCA χρησιμοποιούν αρχιτεκτονική φετών κοντά στο FSD.

Το κύριο πρόβλημα της προσαρμογής κινητού FSD — η αντιγραφή του επιπέδου shared. Στην κινητή ανάπτυξη, τα στοιχεία UI (shared/ui) συχνά εξαρτώνται από την πλατφόρμα (Android Views vs Jetpack Compose vs SwiftUI), που απαιτεί ξεχωριστές ενότητες shared για κάθε τεχνολογία. Στο FSD, το επίπεδο shared είναι συνήθως ανεξάρτητο από την πλατφόρμα (βοηθητικά προγράμματα, διαμορφώσεις), και το UI-kit μεταφέρεται σε ξεχωριστή ενότητα ή βιβλιοθήκη στοιχείων.

Πλεονεκτήματα και μειονεκτήματα του Feature-Sliced Design

Πλεονεκτήματα του FSD γίνονται ορατά σε μεγάλα έργα με 10+ προγραμματιστές. Κάθε προγραμματιστής ή ομάδα ασχολείται με τη δική του φέτα, χωρίς να αγγίζει τον κώδικα άλλων. Οι συγκρούσεις στο git μειώνονται κατά 40–60% (δεδομένα από μελέτες περιπτώσεων feature-sliced.design). Νέες λειτουργίες προστίθενται χωρίς τον κίνδυνο να χαλάσουν τις υπάρχουσες, εάν χρησιμοποιούν μόνο το δημόσιο API των φετών. Η αναδόμηση μιας λειτουργίας δεν απαιτεί αλλαγή άλλων — αρκεί να ξαναγράψετε ui/model/api μέσα σε μία φέτα, διατηρώντας το δημόσιο API.

ΠτυχήFSDFeature-based (χωρίς FSD)Πολυεπίπεδη αρχιτεκτονική
Απομόνωση λειτουργιώνΑυστηρήΜέτριαΧαμηλή
Παράλληλη ανάπτυξη10+ ομάδες3–5 ομάδες1–2 ομάδες
Επαναχρησιμοποίηση μεταξύ έργωνΝαι (φέτες-πακέτα)Μόνο μέσω copy-pasteΜέσω ενοτήτων shared
Κατώφλι εισόδουΥψηλόΧαμηλόΜέτριο
Απομόνωση Gradle (Android)Εγγενής (ενότητες)Εγγενής (ενότητες)Αδύναμη

Μειονεκτήματα του FSD — υπερβολική ένθεση για μικρά έργα. Εάν η εφαρμογή αποτελείται από 3–5 οθόνες, επτά επίπεδα και τμηματοποίηση μέσα σε κάθε φέτα δημιουργούν περισσότερο οργανωτικό κώδικα από την ίδια την εφαρμογή. Το κατώφλι εισόδου είναι υψηλό: νέοι προγραμματιστές ξοδεύουν 2–4 εβδομάδες για να μάθουν τη μεθοδολογία. Επίσης, το FSD είναι ελάχιστα συμβατό με γρήγορη δημιουργία πρωτοτύπων — το πρωτότυπο απαιτεί συχνές διασταυρούμενες εισαγωγές επιπέδων, που απαγορεύονται στο FSD και επιβραδύνουν τις επαναλήψεις.

Συνιστάται να ξεκινήσετε με απλούστερη δομή Feature-based και να μεταβείτε στο FSD όταν ο αριθμός οθονών υπερβεί τις 20 και η ομάδα — τους 5 προγραμματιστές.

Συχνές Ερωτήσεις

Ποια είναι η διαφορά μεταξύ FSD και Feature-based αρχιτεκτονικής;

Η Feature-based αρχιτεκτονική ομαδοποιεί τον κώδικα ανά λειτουργίες χωρίς αυστηρούς κανόνες εισαγωγής — η λειτουργία Auth μπορεί να εισάγει μια άλλη λειτουργία Profile χωρίς περιορισμούς. Το FSD προσθέτει ιεραρχία επιπέδων και τον κανόνα τα επίπεδα κοιτούν μόνο προς τα κάτω. Στο Feature-based, η οντότητα και η λειτουργία μπορούν να βρίσκονται στο ίδιο επίπεδο και να εισάγουν η μία την άλλη; στο FSD, η οντότητα βρίσκεται κάτω από τη λειτουργία, και η λειτουργία εισάγει την οντότητα, αλλά όχι το αντίθετο. Το Feature-based είναι κατάλληλο για μικρά έργα, το FSD — για μεγάλα.

Πώς να δοκιμάσουμε μια απομονωμένη φέτα;

Η απομόνωση φετών απλοποιεί την αρθρωτή δοκιμή — κάθε φέτα δοκιμάζεται ανεξάρτητα με αντικατάσταση εξαρτήσεων κατώτερων επιπέδων. Για τη λειτουργία auth αρκεί να κάνετε mock την οντότητα user. Οι δοκιμές ολοκλήρωσης ελέγχουν το δημόσιο API της φέτας. Στην ενότητα Gradle Android, η λειτουργία περιέχει τον δικό της κατάλογο δοκιμών με δοκιμές Reducer, πελάτη API και UI (μέσω Compose Test). Στο iOS, το πακέτο-φέτα περιλαμβάνει δοκιμές όλων των τμημάτων.

Μπορεί να χρησιμοποιηθεί το FSD με Jetpack Compose;

Ναι, το FSD συνδυάζεται καλά με το Jetpack Compose, ειδικά σε πολυαρθρωτά έργα Android. Κάθε φέτα είναι μια ξεχωριστή ενότητα Gradle με δημόσιο API μέσω της οδηγίας exported. Το επίπεδο features περιέχει λειτουργίες Composable (LoginFeature, ProductListFeature), το επίπεδο entities — κλάσεις δεδομένων και Repository, shared — UI-kit (MaterialTheme-wrapper, προσαρμοσμένα στοιχεία). Το FSD συνιστάται για μεγάλα έργα Compose με 5+ προγραμματιστές.

Ποια επίπεδα είναι υποχρεωτικά και ποια προαιρετικά;

Τα υποχρεωτικά επίπεδα είναι app, shared, entities και features. Τα υπόλοιπα (processes, pages, widgets) είναι προαιρετικά και προστίθενται ανάλογα με τις ανάγκες. Στην κινητή ανάπτυξη, το επίπεδο pages συχνά συνδυάζεται με δρομολόγηση πλοήγησης, και τα widgets αντικαθίστανται από shared/ui-kit. Οι διαδικασίες (processes) συνήθως δεν χρησιμοποιούνται σε κινητά έργα — τον ρόλο τους παίζει το επίπεδο domain ή η επιχειρηματική λογική στο ViewModel. Το σημαντικότερο είναι η τήρηση του κανόνα ιεραρχίας εισαγωγής.

Πώς σχετίζεται το FSD με το Domain-Driven Design;

Το FSD δανείζεται από το DDD την έννοια του Bounded Context και της Ubiquitous Language. Κάθε φέτα αντιστοιχεί σε ένα bounded context — ένα όριο εντός του οποίου οι όροι έχουν ξεκάθαρη σημασία. Μέσα στη φέτα χρησιμοποιείται μια ενιαία γλώσσα (ubiquitous language), κατανοητή τόσο από προγραμματιστές όσο και από επιχειρηματικούς αναλυτές. Για παράδειγμα, στη φέτα auth οι όροι σύνδεση, κωδικός πρόσβασης, token έχουν την ίδια σημασία για όλα τα μέλη της ομάδας, γεγονός που μειώνει τον αριθμό παρεξηγήσεων μεταξύ αναλυτών και προγραμματιστών κατά 30–50%.

Σύνοψη

  • Feature-Sliced Design (FSD) — μεθοδολογία αρθρωτής αρχιτεκτονικής με ομαδοποίηση κώδικα ανά επιχειρηματικές λειτουργίες (φέτες), καθεμία περιλαμβάνει UI, λογική, API και δοκιμές.
  • Επτά επίπεδα FSD: app, processes, pages, features, entities, widgets, shared — με αυστηρό κανόνα εισαγωγής από πάνω προς τα κάτω.
  • Οι φέτες απομονώνονται μέσω δημόσιου API — η εσωτερική δομή είναι αόρατη για άλλες φέτες, αποτρέποντας κυκλικές εξαρτήσεις.
  • Τα τμήματα μέσα στη φέτα (ui, model, api, lib, config) οργανώνουν τον κώδικα ανά τεχνικό κριτήριο, αλλά δεν είναι υποχρεωτικά για μικρές φέτες.
  • Στην κινητή ανάπτυξη, το FSD προσαρμόζεται μέσω ενοτήτων Gradle (Android) και πακέτων Swift (iOS), παρέχοντας απομόνωση σε επίπεδο μεταγλώττισης.
  • Κύρια πλεονεκτήματα — παράλληλη ανάπτυξη, απομόνωση λειτουργιών, επαναχρησιμοποίηση μεταξύ έργων.
  • Κύρια μειονεκτήματα — πλεονασμός για μικρά έργα, υψηλό κατώφλι εισόδου, ασυμβατότητα με γρήγορη δημιουργία πρωτοτύπων.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης