mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-26 09:16:22 +02:00
120 lines
3 KiB
Markdown
120 lines
3 KiB
Markdown
# Architecture Examples
|
|
|
|
Concrete good/bad examples for each core principle in SKILL.md.
|
|
|
|
---
|
|
|
|
## Boundaries at Real Differences
|
|
|
|
**Good** - Meaningful boundary:
|
|
```
|
|
# Users and Billing are separate bounded contexts
|
|
# - Different teams own them
|
|
# - Different change cadences (users: weekly, billing: quarterly)
|
|
# - Different compliance requirements
|
|
|
|
src/
|
|
users/ # User management domain
|
|
models.py
|
|
services.py
|
|
api.py
|
|
billing/ # Billing domain
|
|
models.py
|
|
services.py
|
|
api.py
|
|
shared/ # Truly shared utilities
|
|
auth.py
|
|
```
|
|
|
|
**Bad** - Ceremony without purpose:
|
|
```
|
|
# UserService → UserRepository → UserRepositoryImpl
|
|
# ...when you'll never swap the database
|
|
|
|
src/
|
|
interfaces/
|
|
IUserRepository.py # One implementation exists
|
|
repositories/
|
|
UserRepositoryImpl.py # Wraps SQLAlchemy, which is already a repository
|
|
services/
|
|
UserService.py # Just calls the repository
|
|
```
|
|
|
|
---
|
|
|
|
## Dependencies Flow Inward
|
|
|
|
**Good** - Clear dependency direction:
|
|
```
|
|
# Dependency flows inward: infrastructure → application → domain
|
|
|
|
domain/ # Pure business logic, no imports from outer layers
|
|
order.py # Order entity with business rules
|
|
|
|
application/ # Use cases, orchestrates domain
|
|
place_order.py # Imports from domain/, not infrastructure/
|
|
|
|
infrastructure/ # External concerns
|
|
postgres.py # Implements persistence, imports from application/
|
|
stripe.py # Implements payments
|
|
```
|
|
|
|
---
|
|
|
|
## Follow the Data
|
|
|
|
**Good** - Obvious data flow:
|
|
```
|
|
Request → Validate → Transform → Store → Respond
|
|
|
|
# Each step is a clear function/module:
|
|
api/routes.py # Request enters
|
|
validators.py # Validation
|
|
transformers.py # Business logic transformation
|
|
repositories.py # Storage
|
|
serializers.py # Response shaping
|
|
```
|
|
|
|
---
|
|
|
|
## Design for Failure
|
|
|
|
**Good** - Failure-aware design with compensation:
|
|
```python
|
|
class OrderService:
|
|
def place_order(self, order: Order) -> Result:
|
|
inventory = self.inventory.reserve(order.items)
|
|
if inventory.failed:
|
|
return Result.failure("Items unavailable", retry=False)
|
|
|
|
payment = self.payments.charge(order.total)
|
|
if payment.failed:
|
|
self.inventory.release(inventory.reservation_id) # Compensate
|
|
return Result.failure("Payment failed", retry=True)
|
|
|
|
return Result.success(order)
|
|
```
|
|
|
|
---
|
|
|
|
## Design for Operations
|
|
|
|
**Good** - Observable architecture:
|
|
```python
|
|
@trace
|
|
def handle_request(request):
|
|
log.info("Processing", request_id=request.id, user=request.user_id)
|
|
try:
|
|
result = process(request)
|
|
log.info("Completed", request_id=request.id, result=result.status)
|
|
return result
|
|
except Exception as e:
|
|
log.error("Failed", request_id=request.id, error=str(e),
|
|
context=request.to_dict()) # Full context for replay
|
|
raise
|
|
```
|
|
|
|
Key elements:
|
|
- Every request gets a correlation ID
|
|
- Every service logs with that ID
|
|
- Every error includes full context for reproduction
|