5.6 OBSERVAÇÕES IMPORTANTES
6.1.9 Entender Modularização e Construir Software Modular
Na medida em que os problemas crescem em nível de complexidade, grandes blocos de instruções são produzidos para solucioná-los. Consequentemente, a dificuldade em construir e manter esses algoritmos, devido à quantidade de instruções combinadas, é aumentada. Não obstante, a quantidade de tarefas a que os algoritmos se dispõem a resolver
(ou que são necessárias à solução de um problema) aumenta ao passo que os problemas se tornam mais complexos.
Problemas complexos podem ser simplificados quando divididos (ou decompostos) em vários subproblemas. Decompor um problema influencia diretamente na redução de sua complexidade. É importante lembrar que complexidade é sinônimo de variedade, ou seja, a quantidade de situações diferentes que um problema pode apresentar. Assim, decompor um problema culmina na simplificação de sua solução. Outra vantagem da decomposição é a identificação e geração de módulos que podem ser reutilizados para a solução de diversos outros problemas. O processo de decomposição representa o principio filosófico “dividir para conquistar”.
Segundo Forbellone e Eberspacher (2000), é conveniente adotar um critério para orientar esse processo de decomposição formado pelas seguintes etapas:
• Dividir o problema em suas partes principais;
• Analisar a divisão obtida para garantir coerência;
• Analisar a existência de partes que ainda podem ser decompostas e, em caso positivo, retornar à etapa de decomposição inicial;
• Analisar o resultado para garantir entendimento e coerência.
Esse processo de decomposição contínua é também conhecido como Refinamentos Sucessivos (abordagem top-down), porque se parte de um problema complexo e abrangente que é sucessivamente dividido até resultar em problemas mais simples e específicos.
Para decompor o problema em subproblemas, o programador deve ser capaz de construir módulos (subalgoritmos) que comporão a solução como um todo. Para adquirir esta habilidade, os aprendizes devem transpassar a fase “Vejo, Escuto e Compreendo” do presente conteúdo programático (Tabela 6.26).
Tabela 6.26 – Objetivos e Habilidades da Fase “Vejo, Escuto e Compreendo” para o Objetivo Específico “Entender Modularização e Construir Software Modular”
Como Encaminhar o Aluno ao
Conhecimento e Compreensão? Como Levar o Aluno ao Acolhimento? Habilidade(s) a Ser(em) Adquirida(s) - Descrever os conceitos de
modularização.
- Demonstrar a construção de um módulo por intermédio de função e procedimento.
- Descrever os conceitos de passagem e retorno de parâmetros. - Demonstrar a construção de algoritmos com chamadas a funções e procedimentos.
- Descrever os conceitos de Recursividade.
- Demonstrar como substituir laços por funções ou procedimentos recursivos.
- Disponibilizar uma lista de módulos (funções e procedimentos) descrevendo os parâmetros de entrada e saída necessários à sua construção e solicitar que os alunos (em dupla) produzam os algoritmos correspondentes a cada módulo. - Disponibilizar uma lista de módulos construídos com o uso de estruturas de repetição e solicitar que os alunos (em dupla) transformem cada módulo em um procedimento recursivo equivalente.
- Capacidade de construir módulos de algoritmos a partir da pré-definição, pelo
professor, dos blocos de instruções que formarão cada módulo.
- Capacidade de transformar um algoritmo modularizado ou não, construído com o uso de laços, em um algoritmo recursivo.
Identificar as situações em que algoritmos permitem ser modularizados pode ser considerado trivial. Porém, identificar precisamente os módulos e seus blocos de instruções correspondentes exige estudo detalhado do problema a ser resolvido. Esta habilidade é adquirida quando os aprendizes transpassam a fase “Discuto, Aplico e Reflito” do corrente conteúdo programático (Tabela 6.27).
Tabela 6.27 – Objetivos e Habilidades da Fase “Discuto, Aplico e Reflito” para o Objetivo Específico “Entender Modularização e Construir Software Modular”
Como Encaminhar o Aluno à
Aplicação e Análise? Como Levar o Aluno à Resposta e Valorização? Habilidade(s) a Ser(em) Adquirida(s) - Demonstrar como identificar os
possíveis módulos que compõem um enunciado de problema através da técnica de refinamentos sucessivos. - Demonstrar como identificar os possíveis módulos que compõem um algoritmo já construído para o enunciado de problema através da técnica de refinamentos sucessivos. - Demonstrar as situações em que o uso de recursividade se faz
obrigatório.
- Disponibilizar uma lista de enunciados de problemas e solicitar que os alunos (em dupla) discutam e identifiquem (através de
refinamento) todos os módulos necessários à construção de cada algoritmo.
- Solicitar que os alunos (em dupla) construam os algoritmos da lista anterior de acordo com os módulos identificados. - Capacidade de identificar a necessidade de utilização de funções ou procedimentos recursivos. - Capacidade de identificar e construir os possíveis módulos de um algoritmo pronto (ainda não modularizado).
- Capacidade de identificar e construir os possíveis módulos que comporão a solução algorítmica do enunciado de um problema.
Por fim, mais difícil que identificar precisamente os módulos e seus blocos de instruções correspondentes é a construção de módulos otimizados e concisos, exigindo estudo ainda mais minucioso do problema a ser resolvido. Este estudo é necessário porque os módulos produzidos precisam apresentar as seguintes características: (1) alta coesão – cada módulo deve resolver a menor quantidade de tarefas possível; e (2) baixo acoplamento – é ideal que o módulo esteja conectado a outros módulos pela menor quantidade possível de parâmetros para que possa ser reutilizado em outros algoritmos com nenhuma ou poucas alterações prévias em seu código. A habilidade de construir módulos com estas características é adquirida quando os aprendizes transpassam a fase “Pratico, Faço e Crio” do presente conteúdo programático (Tabela 6.28).
Tabela 6.28 – Objetivos e Habilidades da Fase “Pratico, Faço e Crio” para o Objetivo Específico “Entender Modularização e Construir Software Modular”
Como Encaminhar o Aluno à
Síntese e Avaliação? Organização e Caracterização por Como Levar o Aluno à um Valor ou Complexo de
Valores?
Habilidade(s) a Ser(em) Adquirida(s)
- Descrever os conceitos de coesão e acoplamento.
- Demonstrar módulos diferentes para a solução de um mesmo problema e compará-los em relação à coesão.
- Demonstrar módulos diferentes para a solução de um mesmo problema e compará-los em relação ao acoplamento.
- Disponibilizar módulos diferentes para a solução de um único problema e solicitar que os alunos (em dupla) identifiquem os módulos mais coesos (justificando).
- Disponibilizar módulos diferentes para a solução de um único problema e solicitar que os alunos (em dupla) identifiquem os módulos menos acoplados (justificando). - Disponibilizar enunciados de problemas e solicitar que os alunos desenvolvam (em dupla) algoritmos modularizados para sua solução. Alguns destes problemas devem ser passíveis de solução, única e exclusivamente, através de módulos recursivos. É importante destacar que os alunos deverão ser capazes de identificá-los, construí-los e
descrever o motivo pelo qual não podem ser construídos através do uso de estruturas de repetição. - Disponibilizar algoritmos
modulares prontos e solicitar que os alunos (em dupla) identifiquem situações em que os módulos podem ainda ser divididos em módulos mais
- Capacidade de identificar situações em que é possível construir uma solução algorítmica para um problema apenas com o uso de módulos recursivos. - Capacidade de avaliar a coesão de um módulo. - Capacidade de avaliar o acoplamento de um módulo. - Capacidade de construir módulo otimizado (menos acoplado e mais coeso possível).
coesos. Solicitar que as duplas reescrevam os módulos neste sentido.
- Disponibilizar algoritmos
modulares prontos e solicitar que os alunos (em dupla) identifiquem situações em que os módulos podem sofrer alterações de modo a torná-los menos acoplados. Solicitar que as duplas reescrevam os módulos neste sentido.
Exemplos de exercícios para este conteúdo programático podem ser encontrados no Apêndice A.9.