A indústria e a literatura de software usam o termo componente para referenciar muitas coisas diferentes. É usado normalmente com sentido amplo para significar uma parte constituinte. Também é normalmente usado com sentido restrito para denotar as características específicas que permitem a recolocação e a montagem em sistemas maiores.
Aqui. Nós usamos o termo componente para significar uma parte encapsulada de um sistema que é não trivial, quase independente, substituível e que cumpra uma função específica no contexto de uma arquitetura bem definida. Incluindo dois tipos de componentes:
-
Componente de design, uma significativa parte do design encapsulada que inclui subsistemas de design e, às vezes, significantes classes de design e pacotes de design.
-
Componente de implementação, uma significativa parte encapsulada da implementação, geralmente o código que implementa um componente de design.
Idealmente, a implementação reflete o design; sendo assim, você pode simplesmente se referenciar aos componentes, visto que cada componente tem um design e uma implementação.
Capacidade de substituição do componente
Na terminologia da UML, os componentes podem ser substituíveis. Entretanto, isto pode simplesmente significar que o componente expõe um conjunto de interfaces que escondem sua implementação.
Existem outros tipos de capacidade de substituição mais fortes:
-
Capacidade de substituição de arquivo fonte: se duas classes forem implementadas em um único arquivo de código fonte, então essas classes não poderão ser controladas e ter versões de forma separada. Entretanto, se um grupo de arquivos implementa completamente um único componente, e nenhum outro, então os arquivos fonte do componente são substituíveis. Esta característica torna mais fácil o uso do controle de versão, o uso do arquivo como uma linha de base, e a reutilização do arquivo fonte.
-
Capacidade de substituição da implantação: se duas classes forem implantadas em um único arquivo executável, então as classes não têm capacidade de substituição independente em um sistema implantado. É desejável que os componentes mais genéricos sejam substituíveis durante a implantação, o que permite que as novas versões do componente sejam implantadas sem a necessidade da reconstrução dos outros componentes. Isto significa geralmente que existe um arquivo ou um grupo de arquivos que implantam este componente, e nenhum outro componente.
-
Capacidade de substituição em tempo de execução: se um componente pode ser implantado em um sistema em execução, então ele é conhecido como um substituível em tempo de execução. Isto permite a atualização do software sem perda de disponibilidade.
-
Transparência de localização: os componentes com interfaces endereçáveis por rede são referenciados como tendo transparência de localização. Isto permite que os componentes sejam re-alocados em outros servidores ou sejam replicados em múltiplos servidores para suportar tolerância à falhas, balanceamento de carga, etc. Estes tipos de componentes são normalmente referenciados como componentes distribuídos ou que podem ser distribuídos.
Instanciação de componente
Um componente pode ou não ser diretamente instanciado em tempo de execução.
Um componente indiretamente instanciado é implementado, ou realizado, por um grupo de classes, sub-componentes, ou partes. O próprio componente não aparece na implementação; serve meramente como um design que uma implementação deverá seguir. As classes de realização, sub-componentes ou partes devem cobrir todas as operações especificadas na interface do componente. A forma de implementar o componente é de responsabilidade da pessoa que implementa.
Um componente diretamente instanciado especifica sua própria implementação encapsulada. É instanciado como um objeto endereçável, o que significa que um componente de design tem uma construção correspondente na linguagem de implementação; conseqüentemente ele pode ser referenciado explicitamente. A Linguagem de Modelagem Unificada [UML05] define componente da seguinte forma:
Uma parte modular de um sistema que encapsula seu conteúdo e cuja manifestação seja substituível dentro de seu ambiente. Um componente define seu comportamento em termos de interfaces fornecidas e requeridas. Desta forma, um componente serve como um tipo, cuja conformidade é definida por suas interfaces fornecidas e requeridas (abrangendo suas semânticas estática e dinâmica). (Veja Representação UML ao final desta seção para definições das versões mais atuais da UML).
Um componente é definido como um subtipo de classe estruturada. Conseqüentemente, um componente tem atributos e operações, pode participar nas associações e nas generalizações e tem estrutura e portas internas.
Existem estereótipos padrão da UML que se aplicam aos componentes, incluindo <<subsystem>> para modelar componentes de larga escala, <<specification>> e <<realization>> para modelar componentes com definições distintas de especificações e realizações, onde uma especificação pode ter múltiplas realizações.
Aqui, nós usamos o termo componente de uma forma mais geral do que a definição da UML. Ao invés de definir o componente como tendo características modulares, de implantação e de substituição, nós recomendamos estas características dos componentes como desejáveis. Veja a seção sobre Característica de Substituição do Componente.
Modelagem dos componentes
O componente da UML é uma construção de modelagem que fornece as seguintes capacidades:
- Agrupar classes para definir uma parte mais genérica de um sistema
- Separar as interfaces visíveis da implementação interna
- Executar instâncias de tempo-de-execução
Um componente inclui interfaces fornecidas e requeridas que formam a base para agrupar os componentes. Uma interface fornecida é tanto implementada diretamente pelo componente como por uma de suas classes de realização ou sub-componentes, ou é o tipo de uma porta do componente fornecida. Uma interface requerida é designada por uma dependência de uso do componente ou de uma de suas classes de realização ou sub-componentes, ou é o tipo de uma porta requerida.
Um componente tem uma visão externa (ou visão de caixa escura) através de suas propriedades e operações publicamente visíveis. Opcionalmente, um comportamento tal como uma máquina de estado de protocolo pode ser anexada a uma interface, uma porta, e ao próprio componente para definir a visão externa mais precisamente fazendo com que restrições dinâmicas na seqüência da operação chamem explicitamente. A ligação entre componentes em um sistema, ou o outro contexto, pode ser definida estruturalmente usando dependências entre as interfaces dos componentes (tipicamente em diagramas de componentes).
Opcionalmente, você pode fazer uma especificação mais detalhada da colaboração estrutural usando partes e conectores em estruturas compostas para especificar a colaboração do papel ou do nível da instância entre os componentes. Esta é a visão interna do componente (ou visão de caixa branca) através de suas propriedades privativas e classes de realização ou sub-componentes. Esta visão mostra como o comportamento externo é realizado internamente. O mapeamento entre as visões externas e internas é feito por dependências em diagramas de componentes ou em conectores de delegação para as partes internas em diagramas compostos de estrutura.
A recomendação é usar componentes para a representação de subsistemas de design.
Representação UML
A definição de componente na UML mudou durante o tempo com a liberação de diferentes versões. A versão da UML pode ser restringida pelas características das ferramentas de modelagem que você usa. Esta é a razão pela qual as definições de 1.3 a 2.0 estão sendo fornecidas aqui.
A UML 2.0 define componente como:
…uma parte modular de um sistema que encapsula seu conteúdo e cuja manifestação seja substituível dentro de seu ambiente.
Um componente define seu comportamento em termos de interfaces fornecidas e requeridas. Desta forma, um componente serve como um tipo cuja conformidade é definida por suas interfaces fornecidas e requeridas (abrangendo suas semânticas estática e dinâmica).
A UML 1.5 define componente como:
Uma parte modular de um sistema que pode ser implantada e substituída e que encapsula a implementação e expõe um conjunto de interfaces. Um componente é normalmente especificado por uma ou mais classes ou sub-componentes que residem nele e podem ser implementados por um ou mais artefatos (por exemplo: arquivos binários, executáveis ou scripts).
Na UML 1.3 e em suas versões mais antigas, a notação de componente foi usada para representar arquivos na implementação. Os arquivos não são mais considerados componentes pelas definições mais novas da UML. Entretanto, muitas ferramentas e perfis UML ainda usam a notação de componente para representar arquivos.
|