Στον κόσμο των enterprise εφαρμογών και ειδικά στο οικοσύστημα του .NET, η συζήτηση γύρω από την αρχιτεκτονική σπάνια σταματά. Clean Architecture, Onion, Hexagonal, CQRS, Microservices, όλες υπόσχονται καλύτερη συντηρησιμότητα, ευκολότερη εξέλιξη και λιγότερο πόνο στο μέλλον. Παρ’ όλα αυτά, πολλές ομάδες με εμπειρία ετών καταλήγουν με κώδικα που είναι θεωρητικά «καθαρός», αλλά πρακτικά δύσκολος στην κατανόηση, στην αλλαγή και στη συντήρηση.
Εδώ ακριβώς εμφανίζεται το Vertical Slice Architecture. Όχι ως αντικαταστάτης του Clean Architecture, αλλά ως συμπλήρωμα που έρχεται να λύσει ένα διαφορετικό, εξίσου σημαντικό πρόβλημα, την εσωτερική οργάνωση του application code με βάση τα επιχειρησιακά use cases και όχι τα τεχνικά layers.
Το άρθρο αυτό απευθύνεται σε senior developers και architects που είτε χρησιμοποιούν ήδη Clean Architecture είτε έχουν βιώσει τα όριά της στην πράξη. Στόχος δεν είναι να παρουσιαστεί άλλη μία «σωστή» αρχιτεκτονική, αλλά να αναλυθεί πώς και γιατί ο συνδυασμός Clean Architecture + Vertical Slice οδηγεί σε πιο ανθεκτικά, ευανάγνωστα και εξελίξιμα .NET συστήματα.
Τι είναι το Clean Architecture και τι προσπαθεί να πετύχει
Το Clean Architecture, όπως διατυπώθηκε από τον Robert C. Martin, δεν είναι framework ούτε συγκεκριμένη υλοποίηση. Είναι ένα σύνολο από κανόνες εξαρτήσεων που στοχεύουν στη μακροχρόνια υγεία του λογισμικού. Η βασική του αρχή είναι απλή αλλά αυστηρή: οι εξαρτήσεις πρέπει να δείχνουν προς τα μέσα, προς τον πυρήνα του συστήματος.
Στην πράξη αυτό σημαίνει ότι το Domain και οι επιχειρησιακοί κανόνες δεν πρέπει να εξαρτώνται από frameworks, βάσεις δεδομένων, UI ή εξωτερικά συστήματα. Αντίθετα, όλα αυτά θεωρούνται λεπτομέρειες (details) που μπορούν να αλλάξουν χωρίς να επηρεάσουν την ουσία του συστήματος.
Στο .NET, αυτή η φιλοσοφία μεταφράζεται συνήθως σε ξεχωριστά projects: Domain, Application, Infrastructure και Api. Αυτή η διάσπαση λειτουργεί ως μηχανισμός επιβολής πειθαρχίας, ιδιαίτερα σε μεγάλες ομάδες. Ωστόσο, το Clean Architecture δεν λέει τίποτα για το πώς οργανώνεται ο κώδικας μέσα σε κάθε layer.
Το πρόβλημα του κλασικού Clean Architecture στην πράξη
Παρότι το Clean Architecture λύνει το πρόβλημα των εξαρτήσεων, αφήνει ανοιχτό ένα άλλο κρίσιμο ζήτημα, την καθημερινή εργονομία του κώδικα. Σε πολλές πραγματικές εφαρμογές, το Application layer καταλήγει να γεμίζει με φακέλους τύπου Commands, Queries, Interfaces, DTOs και Services.
Το αποτέλεσμα είναι ότι ένα απλό business flow, για παράδειγμα η δημιουργία μιας παραγγελίας, διασπείρεται σε πολλά σημεία του κώδικα. Ο developer πρέπει να «κυνηγήσει» αρχεία για να καταλάβει τι συμβαίνει, ενώ μικρές αλλαγές απαιτούν τροποποιήσεις σε πολλαπλά layers και abstractions.
Αυτό το φαινόμενο δεν είναι κακή υλοποίηση του Clean Architecture. Είναι φυσική συνέπεια του ότι το Clean από μόνο του δεν απαντά στο πώς οργανώνεις use cases.
Τι είναι το Vertical Slice Architecture
Το Vertical Slice Architecture έρχεται να απαντήσει ακριβώς σε αυτό το κενό. Η βασική του ιδέα είναι ότι η κύρια μονάδα οργάνωσης του κώδικα δεν πρέπει να είναι το τεχνικό layer, αλλά το use case ή το business capability.
Ένα vertical slice περιλαμβάνει όλα όσα χρειάζονται για να υλοποιηθεί ένα συγκεκριμένο σενάριο:, input model, validation, business logic, data access και output model. Αντί ο κώδικας να είναι «κομμένος οριζόντια» (controllers εδώ, services εκεί, repositories αλλού), είναι κομμένος κάθετα, από το API μέχρι τη βάση δεδομένων.
Σημαντικό: το Vertical Slice δεν είναι αρχιτεκτονική αντικατάστασης. Δεν αναιρεί layers, ούτε ακυρώνει την ανάγκη για boundaries. Αλλάζει όμως ριζικά τον τρόπο που αντιλαμβανόμαστε το Application layer.
Πώς συνεργάζεται το Vertical Slice με το Clean Architecture
Ο συνδυασμός των δύο προσεγγίσεων είναι σχεδόν φυσικός όταν γίνει σωστά κατανοητός. Το Clean Architecture παραμένει υπεύθυνο για τα μακρο-επίπεδα όρια του συστήματος, ποιος εξαρτάται από ποιον και με ποια κατεύθυνση. Το Vertical Slice αναλαμβάνει το μικρο-επίπεδο, δηλαδή την εσωτερική δομή του Application layer.
Με άλλα λόγια, το Clean ορίζει το περίγραμμα του σπιτιού και το Vertical Slice οργανώνει τα δωμάτια. Το αποτέλεσμα είναι ένα σύστημα με ξεκάθαρα boundaries αλλά και με κώδικα που αντικατοπτρίζει άμεσα το business.
Το Application Layer ως κατάλογος επιχειρησιακών δυνατοτήτων
Όταν εφαρμόζεται Vertical Slice μέσα στο Application layer, η δομή του παύει να είναι τεχνική και γίνεται εννοιολογική. Κάθε φάκελος αντιστοιχεί σε ένα use case, όπως CreateOrder, CancelOrder ή GetCustomerDetails.
Αυτό έχει τεράστια σημασία για senior developers και ομάδες, γιατί μετατρέπει το Application project σε έναν χάρτη του business. Οποιοσδήποτε μπορεί να καταλάβει τι κάνει το σύστημα απλώς κοιτάζοντας τη δομή των φακέλων, χωρίς να χρειάζεται να ανοίξει δεκάδες αρχεία.
Ο ρόλος του Domain σε αυτόν τον συνδυασμό
Το Domain layer παραμένει ο σταθερός πυρήνας του συστήματος. Περιέχει τις επιχειρησιακές έννοιες, τους κανόνες και τα invariants που δεν αλλάζουν συχνά. Το Vertical Slice βοηθά έμμεσα να προστατευτεί το Domain από υπερφόρτωση, καθώς η use-case-specific λογική παραμένει στο Application layer.
Έτσι αποφεύγεται η συχνή παγίδα όπου το Domain μετατρέπεται σε dumping ground για κάθε πιθανό σενάριο.
Infrastructure χωρίς υπερβολικές γενικεύσεις
Σε αυτό το μοντέλο, το Infrastructure layer συνεχίζει να υλοποιεί λεπτομέρειες όπως EF Core, messaging και external services. Η διαφορά είναι ότι δεν σχεδιάζεται πια γύρω από γενικές abstractions, αλλά γύρω από πραγματικές ανάγκες των use cases.
Αυτό οδηγεί σε λιγότερα interfaces, λιγότερα pass-through layers και πιο άμεσο, ειλικρινή κώδικα.
Γιατί αυτός ο συνδυασμός ταιριάζει ιδιαίτερα σε senior ομάδες
Senior ομάδες δεν αξιολογούν μια αρχιτεκτονική με βάση το πόσο «σωστή» είναι θεωρητικά, αλλά με βάση το πώς αντέχει στον χρόνο. Ο συνδυασμός Clean Architecture και Vertical Slice έχει αποδειχθεί ότι μειώνει το cognitive load, περιορίζει το blast radius των αλλαγών και κάνει τον κώδικα πιο φιλικό σε refactoring.
Δεν είναι η πιο απλή προσέγγιση για μικρά projects, αλλά για συστήματα που προορίζονται να ζήσουν χρόνια, αποτελεί συχνά τη χρυσή τομή.
Kλασικό Clean Architecture (ΧΩΡΙΣ Vertical Slice)
Στην κλασική υλοποίηση του Clean Architecture, ο κώδικας οργανώνεται κυρίως γύρω από τεχνικά layers και ρόλους, όπως Commands, Handlers, DTOs και Repositories. Παρότι οι κανόνες εξαρτήσεων είναι καθαροί και το domain προστατεύεται από frameworks και υποδομές, ένα επιχειρησιακό use case τείνει να απλώνεται σε πολλά διαφορετικά σημεία του κώδικα. Αυτό αυξάνει το cognitive load, καθώς για να κατανοήσει ή να αλλάξει κάποιος ένα feature πρέπει να πλοηγηθεί σε πολλούς φακέλους και abstractions, κάτι που γίνεται ιδιαίτερα αισθητό όσο το σύστημα μεγαλώνει.
src/
├── Domain/
│ ├── Entities/
│ │ └── Order.cs
│ └── ValueObjects/
│
├── Application/
│ ├── Commands/
│ │ └── CreateOrderCommand.cs
│ ├── Queries/
│ │ └── GetOrderByIdQuery.cs
│ ├── Handlers/
│ │ ├── CreateOrderHandler.cs
│ │ └── GetOrderByIdHandler.cs
│ ├── Interfaces/
│ │ └── IOrderRepository.cs
│ └── Dtos/
│ └── OrderDto.cs
│
├── Infrastructure/
│ ├── Persistence/
│ │ └── OrderRepository.cs
│ └── AppDbContext.cs
│
└── Api/
└── Controllers/
└── OrdersController.cs
Clean Architecture + Vertical Slice (ΜΕΤΑ την παρέμβαση)
Με την εισαγωγή του Vertical Slice, το Clean Architecture διατηρεί τα ίδια boundaries και κανόνες εξαρτήσεων, αλλά αλλάζει ριζικά ο τρόπος οργάνωσης του Application layer. Κάθε use case αποκτά τον δικό του φάκελο, μέσα στον οποίο συγκεντρώνονται όλα τα απαραίτητα στοιχεία για τη συγκεκριμένη λειτουργία, από το input μέχρι το output. Έτσι, ο κώδικας αντικατοπτρίζει άμεσα το business, οι αλλαγές περιορίζονται σε ένα σημείο και η κατανόηση του συστήματος γίνεται πολύ πιο άμεση και φιλική για ομάδες με εμπειρία και μακροχρόνια projects.
src/
├── Domain/
│ └── Order.cs
│
├── Application/
│ └── Orders/
│ ├── Create/
│ │ ├── Command.cs
│ │ ├── Handler.cs
│ │ └── Result.cs
│ └── GetById/
│ ├── Query.cs
│ └── Handler.cs
│
├── Infrastructure/
│ └── AppDbContext.cs
│
└── Api/
└── Orders/
├── CreateEndpoint.cs
└── GetByIdEndpoint.cs
Συμπέρασμα
Το Clean Architecture χωρίς Vertical Slice κινδυνεύει να γίνει άκαμπτο και υπερβολικά αφηρημένο. Το Vertical Slice χωρίς Clean κινδυνεύει να γίνει χαοτικό. Μαζί, προσφέρουν ένα ισορροπημένο μοντέλο που σέβεται τόσο το business όσο και τον developer.
Για senior developers, αυτός ο συνδυασμός δεν είναι μόδα, αλλά αποτέλεσμα εμπειρίας από πραγματικά συστήματα που μεγάλωσαν, άλλαξαν και έπρεπε να συντηρηθούν κάτω από πραγματικές πιέσεις.
nikosstit
Top comments (0)