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