← Torna al blog

Dev Tips

Un trucchetto al giorno leva le complicazioni di torno! Piccole "scorciatoie" che possono facilitare la vita degli sviluppatori e far risparmiare tempo...e righe di codice.

135

The Power of Domain Layer Isolation

2025-03-24

Il segreto di un software scalabile e manutenibile? Separare bene i livelli. Quando la logica di business è mescolata con la UI, il database e altre parti del sistema, tutto diventa confuso: le regole di business sono sparse ovunque, piccole modifiche rischiano di rompere il codice e il progetto diventa difficile da mantenere e scalare. Quando, invece, la logica di business è pulita e isolata, il codice diventa più chiaro e ogni cambiamento meno rischioso. Come questa pratica può salvare il tuo progetto?

1// Infrastructure Layer
2class DatabaseRepository {
3  save(entity: Entity): void { /* Persistence logic */ }
4}
5
6// Domain Layer
7class Order implements Entity {
8  private lineItems: OrderLine[];
9  // Other stuff...
10
11  isEligibleForDiscount(): boolean {
12    // Implementation code
13  }
14
15  applyDiscount(): void {
16    // Implementation code
17  }
18}
19
20// Application Layer
21class OrderService {
22  constructor(private repository: DatabaseRepository) {}
23
24  processOrder(order: Order): void {
25    if (order.isEligibleForDiscount()) {
26      order.applyDiscount();
27    }
28
29    this.repository.save(order);
30  }
31}
134

Knowledge Crunching

2025-02-25

Scrivere codice è facile ma scrivere codice che ha senso è tutta un’altra storia. Creare un buon modello non significa solo scrivere classi e metodi: è un processo di comprensione profonda del dominio che permette di tradurre concetti complessi in codice chiaro e manutenibile. Il Knowledge Crunching è proprio questo: un processo continuo di collaborazione tra sviluppatori ed esperti di dominio, che ci aiuta a perfezionare i modelli del business e a tradurre le complessità del mondo reale in soluzioni software robuste e scalabili. Ecco come dovrebbe essere un blocco di codice con il Knowledge Crunching:

1class Order {
2  private lineItems: OrderLine[] = [];
3  private total: Money;
4  private status = OrderStatus.DRAFT;
5
6  constructor() {
7    this.total = new Money(0, 'EUR');
8  }
9
10  addProduct(product: Product, quantity: Quantity): void {
11    if (this.status === OrderStatus.CONFIRMED) {
12      throw new OrderAlreadyConfirmedError();
13    }
14
15    const lineItem = new OrderLine(product, quantity);
16    this.lineItems = [...this.lineItems, lineItem];
17    this.recalculateTotal();
18  }
19
20  private recalculateTotal(): void {
21    this.total = this.lineItems.reduce(
22      (sum, item) => sum.add(item.calculateSubtotal()),
23      new Money(0, 'EUR')
24    );
25  }
26}
133

Top-level await

2024-10-23

1// users.mjs
2const res = await fetch('https://jsonplaceholder.typicode.com/users');
3const users = res.json();
4export { users };
5
6//module.mjs
7import {users} from './users.mjs';
8
9console.log(users);
132

Using requestIdleCallback for scheduling low-priority background tasks

2024-07-22

1// Using requestIdleCallback for scheduling low-priority background tasks
2const idleCallback = () => {
3  // Perform background tasks
4  console.log('Background task executed');
5};
6
7window.requestIdleCallback(idleCallback);
131

Forced-colors

2024-05-15

1.button {
2  border: 0;
3  padding: 10px;
4  box-shadow:
5    -2px -2px 5px gray,
6    2px 2px 5px gray;
7}
8
9@media (forced-colors: active) {
10  .button {
11    /* Use a border instead, since box-shadow is forced to 'none' in forced-colors mode */
12    border: 2px ButtonText solid;
13  }
14}

Contattaci.

Hai in mente un progetto e vorresti realizzarlo?
Sei interessato a migliorare le competenze del tuo team in ambito di programmazione e sviluppo?
Oppure vuoi semplicemente prendere prendere un caffè con noi e vedere la nostra collezione di Action Figure, allora scrivici tramite questo form.

Se, invece, vuoi far parte del team, guarda le nostre offerte di lavoro.

Questo sito è protetto da reCAPTCHA e si applicano le Norme sulla privacy e i Termini di servizio di Google.