En aquest tema, explorarem com els patrons de disseny poden ser aplicats en el context del desenvolupament àgil. El desenvolupament àgil es caracteritza per la seva flexibilitat, iteració ràpida i enfocament en la col·laboració contínua amb els clients. Els patrons de disseny poden ajudar a mantenir la qualitat del codi i la seva mantenibilitat, fins i tot en un entorn de desenvolupament ràpid i canviant.

Objectius del Tema

  1. Entendre la relació entre els patrons de disseny i el desenvolupament àgil.
  2. Identificar patrons de disseny que són especialment útils en un entorn àgil.
  3. Aplicar patrons de disseny per millorar la flexibilitat i mantenibilitat del codi en projectes àgils.

Relació entre Patrons de Disseny i Desenvolupament Àgil

Flexibilitat i Adaptabilitat

  • Patrons de disseny: Proporcionen solucions provades que poden ser adaptades a diferents contextos, facilitant la resposta ràpida als canvis.
  • Desenvolupament àgil: Requereix la capacitat de respondre ràpidament als canvis en els requisits del client.

Mantenibilitat del Codi

  • Patrons de disseny: Promouen la reutilització del codi i la separació de responsabilitats, fent que el codi sigui més fàcil de mantenir.
  • Desenvolupament àgil: La iteració contínua i les entregues freqüents fan que la mantenibilitat del codi sigui crucial.

Col·laboració i Comunicació

  • Patrons de disseny: Proporcionen un llenguatge comú per als desenvolupadors, facilitant la comunicació i la col·laboració.
  • Desenvolupament àgil: Enfocat en la col·laboració contínua entre els membres de l'equip i amb els clients.

Patrons de Disseny Útils en Desenvolupament Àgil

  1. Factory Method

  • Descripció: Proporciona una interfície per crear objectes en una superclasse, però permet que les subclasses alterin el tipus d'objectes que es crearan.
  • Ús en àgil: Facilita la creació d'objectes de manera flexible, permetent canvis ràpids en la implementació sense afectar el codi existent.
// Exemple de Factory Method en Java
abstract class Product {
    abstract void use();
}

class ConcreteProductA extends Product {
    void use() {
        System.out.println("Using Product A");
    }
}

class ConcreteProductB extends Product {
    void use() {
        System.out.println("Using Product B");
    }
}

abstract class Creator {
    abstract Product factoryMethod();
}

class ConcreteCreatorA extends Creator {
    Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    Product factoryMethod() {
        return new ConcreteProductB();
    }
}

  1. Strategy

  • Descripció: Permet definir una família d'algoritmes, encapsular-los i fer-los intercanviables. Permet que l'algoritme variï independentment dels clients que l'utilitzen.
  • Ús en àgil: Facilita la substitució i modificació d'algoritmes sense canviar el codi que els utilitza, permetent una ràpida adaptació als nous requisits.
// Exemple de Strategy en Java
interface Strategy {
    void execute();
}

class ConcreteStrategyA implements Strategy {
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

class ConcreteStrategyB implements Strategy {
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

  1. Observer

  • Descripció: Defineix una dependència d'un-a-molts entre objectes de manera que quan un objecte canvia d'estat, tots els seus dependents són notificats i actualitzats automàticament.
  • Ús en àgil: Facilita la comunicació i la sincronització entre diferents parts del sistema, permetent una ràpida resposta als canvis.
// Exemple de Observer en Java
import java.util.ArrayList;
import java.util.List;

interface Observer {
    void update();
}

class ConcreteObserver implements Observer {
    public void update() {
        System.out.println("Observer updated");
    }
}

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

Exercici Pràctic

Exercici 1: Implementació del Patró Strategy

Implementa el patró Strategy per a un sistema de pagament que permeti seleccionar diferents mètodes de pagament (per exemple, targeta de crèdit, PayPal, transferència bancària).

Solució

// Estratègia de pagament
interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card");
    }
}

class PayPalPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using PayPal");
    }
}

class BankTransferPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Bank Transfer");
    }
}

// Context de pagament
class PaymentContext {
    private PaymentStrategy strategy;

    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void pay(int amount) {
        strategy.pay(amount);
    }
}

// Test de l'exercici
public class Main {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        context.setPaymentStrategy(new CreditCardPayment());
        context.pay(100);

        context.setPaymentStrategy(new PayPalPayment());
        context.pay(200);

        context.setPaymentStrategy(new BankTransferPayment());
        context.pay(300);
    }
}

Resum

En aquest tema, hem vist com els patrons de disseny poden ser aplicats en el context del desenvolupament àgil per millorar la flexibilitat, mantenibilitat i col·laboració en els projectes. Hem explorat alguns patrons específics com el Factory Method, Strategy i Observer, i hem realitzat un exercici pràctic per reforçar els conceptes apresos. Els patrons de disseny són eines valuoses que poden ajudar a mantenir la qualitat del codi en un entorn de desenvolupament ràpid i canviant com el desenvolupament àgil.

© Copyright 2024. Tots els drets reservats