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
- Entendre la relació entre els patrons de disseny i el desenvolupament àgil.
- Identificar patrons de disseny que són especialment útils en un entorn àgil.
- 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
- 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();
}
}
- 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();
}
}
- 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.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Disseny en Desenvolupament Àgil
