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?