# Modularidade

A estratégia modular pode ser a diversos processos produtivos (ex: móveis, automóveis, aviões, etc..) Ou seja, a ideia principal é de utilizar os mesmos componentes em diversos produtos diferentes o que reduz o custo de produção. A modularidade aplicada ao desenvolvimento de novos produtos, acompanhada da terceirização das atividades de produção, tem sido uma estratégia adotada pelas montadoras automotivas. O desenvolvimento de produto no contexto da estratégia modular implica em uma redistribuição das atividades inerentes a este processo, baseando-se na decomposição e na divisão das tarefas entre as montadoras e seus fornecedores.
As montadoras ficam com o domínio do conhecimento dos principais itens do automóvel (ex: motor) e repassa outras atividades a empresas especializadas como a Pirelli que fornece pneus, ou chinesa Yapp, fabricante de tanque de combustível, e a Reydel, que faz cockpit (antes era a Continental).

## Características

A ideia de dividir os programas em módulos surgiu no final da década de 1960. Os países desenvolvidos estavam então passando por uma “crise de software”. Essa crise se deu ao rápido desenvolvimento do hardware ao passo que as técnicas aplicadas ao desenvolvimento de software avançavam lentamente. O Desenvolvimento de sistemas sem uma metodologia para a construção de programas, geralmente resulta em um software com vários erros e com alto custo de desenvolvimento que, consequentemente exige um custo elevado para sua correcção e manutenção futuras. A modularização de programas juntamente com outras técnicas de programação integram o ferramental para a elaboração de programas visando, principalmente, os aspectos de confiabilidade, legibilidade, manutenção e flexibilidade.
Um modulo pode ser definido como um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. A maneira mais intuitiva de proceder à modularização é definir um modulo principal de controle e modulo especifico para as funções do algoritmo. O ideal é que os módulos não sejam grandes demais, pois senão acabam sendo multifuncionais e de difícil compreensão, de modo que o modulo deve ser implementado apenas as estruturas de dados necessários para atingir ao objectivo do modulo.

## Ferramentas para a modularização

As ferramentas são as sub-rotinas e as funções.

### Sub-rotinas

Porção de código para realizar uma tarefa especifica. Diferente de uma função ela não retorna nenhum valor. Uma sub-rotina é declarada da seguinte forma:
A lista de parâmetros formais é opcional. Todavia, caso seja usada elas podem ser de três formas.
* - Passagem por valor;
* - Passagem por resultado;
* - Passagem por referência;

## Exemplo de sub-rotina em C

No exemplo acima, temos uma sub-rotina que toca um som. Como podemos perceber não foi passado nenhum parâmetro, embora seja possível usar parâmetros.

### Funções

É uma porção de código para realizar uma tarefa especifica. Embora seja muito parecido com uma sub-rotina ela possui uma caracteristica especial, que consiste em retornar um valor associado ao seu nome.
Exemplo de função em linguagem C:

## Vantagens e desvantagens

Existem grandes vantagens no uso de módulos e algumas desvantagens são alguns deles:

### Vantagens

* Programas feitos com sub-rotinas ou funções são programados e testados uma só vez, embora possam ser usados em várias partes do programa em quantas vezes são necessários.
* Pode-se criar uma biblioteca com as funções e sub-rotinas que podem ser usados em outros programas ou por outros programadores.
* Com a modularização conseguimos preservar os refinamentos conseguidos em uma parte especifica do código e estender a toda parte do sistema que ira usar a função ou sub-rotina
* Economia de memória do computador, uma vez que o modulo utilizado é armazenado uma única vez, mesmo que utilizado em diferentes partes do programa. Permite também, que, em determinado instante da execução do programa, estejam na memória principal apenas o módulo ou os módulos necessários para execução desse trecho de programa.
* Ocultamento de código, uma vez que apenas as rotinas e sub-rotinas ficam disponíveis para outros programadores.

### Desvantagens

* Aumento no tempo de execução do programa, devido ao tratamento adicional de activação do módulo.