Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Curso: Sistemas de Informação – Unidade São Gabriel Disciplina: Programação Modular – Período: 4º - Turno: Manhã Professor: Claudiney Vander Ramos Data de Entrega: 11/09/2013 PRIMEIRA LISTA DE EXERCÍCIOS Parte 01 – Qualidade de Software; Modularidade; Acoplamento e Coesão 1) Conforme discutido em sala de aula, um bom programa possui algumas características que são visíveis para seus usuários, sejam eles leigos ou programadores. Entre estas características, citamos: corretude, robustez, extensibilidade, reusabilidade, compatibilidade, eficiência, portabilidade, facilidade de uso, funcionalidade e segurança. Algumas destas características impõem pressões diametralmente opostas sobre o software. Por exemplo, quanto mais eficiente o software, menos portável ele tende a ser, pois a eficiência demanda cuidados específicos com o hardware onde o software será executado. Compare mais dois pares dentre estas características do bom software que tendem a lados opostos. Explique porque é difícil atender a ambas as características simultaneamente. 2) O que é qualidade de software? 3) Cite alguns critérios de qualidade. 4) Alguns critérios têm mais importância do que outros? 5) Explique os conceitos de acoplamento e coesão e descreva os níveis apropriados para um projeto cuja estrutura facilite a manutenção e o reuso. 6) Cite alguns tipos de coesão e acoplamento? 7) Dê um exemplo de acoplamento por controle. Como este acoplamento pode ser evitado? 8) Considere que um módulo executa as seguintes tarefas: 1) computa dados complementares baseados em dados computados anteriormente; 2) produz um relatório de erros na estação de trabalho do usuário; 3) atualiza um banco de dados. Este módulo é coeso ? Ele poderia ser construído dessa forma e ser considerado bom? Justifique as respostas. 9) Qual é o tipo de acoplamento mais alto? E o mais baixo ? Quando eles ocorrem ? Você consegue imaginar um cenário em que o acoplamento é zero ? 10) Como os conceitos de acoplamento e portabilidade de software se relacionam ? Apresente um exemplo que sustente sua discussão. 11) Por que a coesão de domínio misto pode ser ruim para um sistema OO? Exemplifique. 12) Por que a coesão de instância mista pode ser ruim para um sistema OO? Exemplifique. 13) Por que a coesão de papel misto pode ser ruim para um sistema OO? Exemplifique. 14) Compare os efeitos nocivos de cada tipo de coesão mista (domínio, instância e papel), indicando as que oferecem maiores riscos para a qualidade de sistemas OO. 15) Qual a relação entre coesão e manutenção ? 16) Qual a relação entre acoplamento e manutenção ? 17) Qual a relação entre coesão e reuso ? 18) Qual a relação entre acoplamento e reuso ? 19) Diga quais são as vantagens da modularização e explique cada uma delas. 20) Quais são as vantagens de ter acoplamento fraco e coesão alta. 21) Identifique os tipos de coesão apresentados abaixo e justifique: a) procedure inicializaDados() { font = "times"; windowSize = "200,400"; xpto.nome = "desligado"; xpto.tamanho = 12; xpto.localização = "/usr/local/lib/java"; } b) public void faça(int flag) { switch(flag) { case ON: // coisas para tratar de ON break; case OFF: // coisas para tratar de OFF break; case FECHAR: // coisas para tratar de FECHAR break; case COR: // coisas para tratar de COR break; } } 22) Identifique o tipo de acoplamento apresentado abaixo e justifique: public void setLampada(int valor) { if(valor == ON) { // liga lampada } else if(valor == 1) { // desliga lampada } else if(valor == 2) { // pisca } } 23) Examine as descrições funcionais dos módulos a seguir e determine o tipo de coesão de cada módulo. a) Um módulo para inicializar variáveis e abrir arquivos utilizados. b) Uma função que inicializa dados de um pagamento e emite o recibo de processamento de um pedido. c) Uma função que gera um recibo de pedido, relatório de venda e nota fiscal. d) Uma função que gera um recibo de pagamento de um pedido. e) Uma função que realiza a leitura e ordenação de um vetor x. f) Uma função que ordena um vetor x. Parte 02 – Orientação por Objetos 1. Definir os conceitos de classe, objeto, herança, e polimorfismo. 2. Qual é a diferença entre public, protected, and private? 3. O que é uma classe abstrata? Para que ela é usada? 4. O que é uma interface? Para que ela é usada? 5. O que é um método abstrato? 6. O que é uma classe fechada (sealed)? 7. Criar uma classe base, Telefone, e uma classe TelefoneEletronico derivada de Telefone. Em Telefone, crie um membro protected TipoDoTelefone do tipo string, e um método public Ring( ) que imprime uma mensagem como: "Tocando o <TipoDoTelefone>." Em TelefoneEletronico, o construtor deve ajustar (set) o TipoDoTelefone para "Digital". No método Run( ), chamar o método Ring( ) no TelefoneEletronico para testar a herança. 8. Estender o Exercício 1 para ilustrar um método polimórfico. Faça a classe derivada sobrescrever (override) o método Ring( ) para exibir uma mensagem diferente. 9. Alterar a classe Telefone para abstrata, e tornar Ring( ) um método abstrato. Derivar duas novas classes de Telefone: TelefoneDigital e TelefoneTalk. Cada uma das classes derivadas deve ajustar (set) TipoDoTelefone, e sobrescrever (override) o método Ring( ). 10. Crie a classe ContaDePoupanca. Use a variável static taxaDeJurosAnual para armazenar a taxa de juros de todos os correntistas. Cada objeto da classe contém uma variável de instância private saldoPoupanca, indicando a quantidade que o poupador possui atualmente depositada. Forneça o método CalcularJuroMensal para calcular os juros mensais, multiplicando saldoPoupanca por taxaDeJurosAnual, dividindo por 12; esses juros devem ser acrescidos a saldoPoupanca. Forneça um método static AlterarTaxaDeJuros que configure taxaDeJurosAnual para um novo valor. Escreva um programa driver para testar a classe ContaDePoupanca. Instancie dois objetos ContaDePoupanca, poupador1 e poupador2, com saldos de R$2000,00 e R$3000,00, respectivamente. Configure taxaDeJurosAnual como 4% e, em seguida, calcule os juros mensais e imprima os novos saldos para cada um dos poupadores. Depois, configure taxaDeJurosAnual como 5%, calcule os juros do próximo mês e imprima os novos saldos para cada um dos poupadores. 11. Escreva um aplicativo de console que implemente um quadrado. A classe Quadrado deve conter uma propriedade de instância Lado que possua assessores get e set para dados private. Forneça dois construtores: um que não receba argumentos e outro que receba um comprimento lado com valor. Escreva uma classe de aplicativo que teste a funcionalidade da classe Quadrado. 12. Alguns programadores preferem não utilizar acesso protected, pois ele quebra o encapsulamento da classe base. Discuta as vantagens relativas do uso do acesso protected em relação a insistir no uso de acesso private na classe base. 13. Como o polimorfismo lhe permite programar “genericamente” em vez de “especificamente”? Discuta as principais vantagens da programação feita “genericamente”. 14. Discuta os problemas da programação com lógica switch. Explique por que o polimorfismo pode ser uma alternativa eficaz ao uso de lógica switch. 15. Faça distinção entre herdar serviços e herdar implementação. Como as hierarquias de herança projetadas para herdar serviços diferem daquelas projetadas para herdar implementação?