Refactoring in Django: investimento per scalabilità e stabilità
Il giorno in cui ho capito che il refactoring è un investimento, non una perdita di tempo
Quando ho iniziato SchoolPlatform, la priorità era “finire” il prodotto.
Scrivevo codice veloce, incollavo funzioni dove servivano e andavo avanti.
Finché è arrivato il momento di integrare la blockchain — e il codice ha iniziato a ribellarsi.
- Refactoring in Django: investimento per scalabilità e stabilità
🔍 Sintomi di un backend fragile
- Logica di business mescolata tra viste Django e funzioni blockchain.
- Metodi duplicati in più moduli con leggere variazioni.
- API REST difficili da estendere senza rompere compatibilità.
- Assenza di test sui flussi critici.
Ogni nuova feature diventava un rischio. Ho fermato tutto per una settimana di refactoring mirato.
Refactoring Django: separazione tra Database e Blockchain
Prima, le operazioni on-chain e quelle su database vivevano nello stesso metodo.
Ora ho introdotto un service layer per separare le responsabilità:
# services/teocoin.py
class TeoCoinService:
def mint(self, wallet, amount):
self.blockchain.mint(wallet.address, amount)
self.db.log_transaction(wallet.user, amount, "mint")
Vantaggi ottenuti:
-
Riduzione delle chiamate alla blockchain ai soli punti necessari (mint / burn).
-
Implementazione di un fallback DB-first per ridurre costi di gas.
-
Maggiore leggibilità e riuso del codice.
Pulizia e coerenza del codice
-
Rinominati metodi ed endpoint con nomenclatura coerente (create_payment_intent, confirm_payment).
-
Eliminato codice duplicato centralizzando la validazione in un unico modulo.
-
Sostituite magic numbers con costanti definite.
Test unitari mirati a blockchain e pagamenti
Ho introdotto test per:
-
API di wallet connect/disconnect con autenticazione JWT.
-
Deduzione e rollback di TeoCoin in caso di errore blockchain.
-
Interazioni Stripe + DB simulate con mock, senza toccare la rete reale.
Esempio di test rollback:
@pytest.mark.django_db
def test_wallet_deduction_with_blockchain_failure(teocoin_service, user_wallet):
with patch("blockchain_client.burn", side_effect=BlockchainError):
result = teocoin_service.deduct(user_wallet, 50)
assert result is False
assert user_wallet.balance == 100 # rollback
📈 Risultati del refactoring Metrica Miglioramento Bug critici in QA -60% Tempo sviluppo feature -40% Integrazione nuove API Più rapida Scalabilità Multi-chain ready
❓ FAQ – Refactoring Django + Blockchain
1) Perché fare refactoring in un progetto Django?
Il refactoring migliora leggibilità, riuso del codice e scalabilità, riducendo i bug. In SchoolPlatform ha ridotto i bug critici del 60% e accelerato le feature del 40%.
2) Come separare database e blockchain in Django?
Con un service layer che isola le operazioni DB e on‑chain, mantenendo pulite le viste e riducendo le chiamate alla blockchain.
3) Quanto costa il mint su Polygon?
Dipende dal gas price. In media pochi centesimi su mainnet; in testnet è gratuito. Ridurre le chiamate on‑chain abbatte i costi.
4) Come testare funzioni blockchain in Django senza spendere gas?
Usa mock nei test e una testnet (es. Polygon Mumbai) per validare i flussi senza costi e senza toccare la rete reale.
5) Cosa sono le “magic numbers” e perché evitarle?
Valori hardcoded senza contesto. Sostituiscile con costanti (es. MAX_MINT_AMOUNT=50
) per chiarezza e manutenibilità.
Risorse correlate
Service Layer in Django: architettura e best practice: Coming Soon
Matteo Ricci Full Stack Developer