Identificação de APIs e Subsistemas
1. Introdução aos Componentes e Subsistemas
- Um componente é uma unidade de software reutilizável, bem encapsulada e substituível.
- Subsistemas agrupam componentes relacionados para criar módulos funcionais maiores.
- Diagrama de Componentes:
- Representa a estrutura de alto nível do sistema, descrevendo componentes, dependências e interfaces entre eles.
- Níveis de representação: código-fonte, binários (e.g., bibliotecas), executáveis.
2. Arquitetura em Três Camadas
- Padrão arquitetural com separação clara de responsabilidades:
- Interface de Utilizador (User Interface): Apresenta a aplicação ao utilizador.
- Lógica de Negócio (Business Logic): Contém regras e operações do domínio.
- Camada de Dados (Data Layer): Lida com persistência e acesso a dados.
- Cada camada interage por meio de interfaces, promovendo desacoplamento e substituição fácil de componentes.
3. Interfaces
- Definição:
- Abstrações que especificam as operações visíveis externamente de um componente ou subsistema.
- Separam a implementação dos detalhes de interação, permitindo que clientes dependam apenas da interface.
- Tipos de Interfaces:
- Fornecidas: Serviços que o componente oferece.
- Requeridas: Serviços que o componente necessita.
- Notação UML:
- Estereótipo
«interface»
ou a representação "lollipop".
- Exemplo:
- Interface
IOculistaLN
define métodos como:
+getCliente(nome: String, datan: Data): Cliente
+getArmação(cArm: Codigo): Armação
+registaReserva(codcli: String, cArm: Codigo, cLenD: Codigo, cLenE: Codigo)
4. Identificação de Responsabilidades e Subsistemas
- Responsabilidades:
- Guiadas pelos casos de uso, descrevem o que cada subsistema deve cumprir.
- Exemplo:
OculistaLN
deve realizar operações como "procurar cliente" e "registar reserva".
- Divisão em Subsistemas:
- Subdivisão da lógica de negócios em áreas específicas.
- Exemplo:
SubSistemaClientes
, SubSistemaProdutos
, SubSistemaReservas
.
5. Desenvolvimento Iterativo e Incremental
- O sistema é construído em versões, permitindo feedback contínuo e refinamento.
- Passos típicos:
- Análise: Modelagem do domínio e identificação de casos de uso.
- Divisão em Componentes: Identificação das dependências e desenho das interfaces.
- Construção Incremental: Implementação de cada componente com base nas suas responsabilidades.
6. Diagramas de Componentes - Notação e Relações
- Estereótipos Comuns:
«component»
: Componente genérico.
«subsystem»
: Subsistema hierárquico.
«service»
: Componente funcional sem estado.
- Relações:
- Realização: Um componente implementa uma ou mais interfaces.
- Dependência: Um componente usa uma interface, mas não depende da implementação.
7. Casos de Uso como Guia para APIs
- Exemplo: Reservar Armação e Lentes
- Fluxo normal:
- Funcionário indica dados do cliente.
- Sistema procura e apresenta detalhes do cliente.
- Funcionário confirma o cliente e escolhe produtos.
- Sistema regista a reserva e imprime um talão.
- Fluxos alternativos e de exceção são mapeados para métodos e validações adicionais nas APIs.
8. Boas Práticas de Design
- Regras Simples (Extreme Programming):
- Passar todos os testes.
- Expressar intenções claramente.
- Eliminar duplicações desnecessárias.
- Minimizar o número de classes e métodos.
- Vantagens da Abstração por Interfaces:
- Desacoplamento entre camadas.
- Facilidade de substituição e evolução dos componentes.