Buscar

Gabarito Listas de Exercicios

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

progmod-TP6-Modulo-VIII-gab-2015-1-GRAD.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Especializac¸a˜o em Informa´tica, Eˆnfase: Ana´lise de Sistemas a` Distaˆncia
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
25/05/2015 : Data da Entrega - 03/06/2015 : Data da Devoluc¸a˜o
GABARITO do EXERCI´CIO 6 - Mo´dulos VIII e IX - 10 pontos
Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (2 pontos) Suponha que voceˆ escreveu um programa que inclui uma soluc¸a˜o inovadora e
eficiente para um problema comum do desenho de software constru´ıdos em sua empresa.
Voceˆ pode declarar essa soluc¸a˜o como um padra˜o de projeto, sem aplica´-la em outros
programas?
Creio que e´ importante verificar se a soluc¸a˜o proposta consegue resolver o mesmo problema
em um outro ambiente. E´ importante que a soluc¸a˜o proposta possa ser reutilizada em
outros ambientes que possuam um determinado contexto em comum. Isso ira´ caracterizar a
soluc¸a˜o como um padra˜o. Nada impede tambe´m que a soluc¸a˜o se torne um padra˜o utilizado
pela empresa mesmo sem ter sido testado em outros sistemas, pois conseguiu resolver um
problema que se repetia nos projetos da empresa, de forma eficaz e satisfato´ria. A empresa
pode adotar aquela soluc¸a˜o como um padra˜o para seus futuros projetos, desde que esteja
dentro do contexto porposto pelo padra˜o.
2. (2 pontos) Qual o propo´sito dos padro˜es de projeto? O propo´sito e´ oferecer uma soluc¸a˜o
mais flex´ıvel e extens´ıvel para o projeto e construc¸a˜o de softwares, garantindo assim maior
qualidade do mesmo. Soluc¸a˜o esta que se apresenta em determinado contexto, e que possa
ser reutilizada em outros projetos que apresentem o mesmo problema.
3. (2 pontos) Suponha que voceˆ seja responsa´vel por desenhar um sistema de arquivos. Os
seguintes requisitos sa˜o levantados:
• O sistema de arquivos conte´m pastas e arquivos.
• Uma pasta pode incluir zero ou mais arquivos.
• Espera-se que tanto pastas quanto arquivos exibam a operac¸a˜o tamanho(), a qual
devolva o tamanho do arquivo (ou pasta) em bytes. O tamanho de uma pasta equivale
ao somato´rio dos tamanhos dos arquivos que a pasta conte´m.
Por meio de um diagrama UML ou co´digo Java, DESENHE as classes Pasta e Arquivo e
a operac¸a˜o tamanho(), EMPREGANDO o Padra˜o de Projeto Composite.
A operac¸a˜o tamanho() poderia ser implementada da seguinte forma:
public double tamanho(){
double total = 0;
No filho;
for (int i=0; filho=getFilho(i); ++i) {
total+=filho.size();
}
return total;
}
4. (2 pontos) Uma pesquisa cient´ıfica quer avaliar o valor calo´rico das refeic¸o˜e servidas em um
restaurante. Para isso, um software foi criado para monitorar todos os pratos consumidos,
por meio das classes Refeicao, Salada e Massa, listadas a seguir.
public abstract class Refeicao {
protected String descricao;
public String getDescricao() { return this.descricao; }
public abstract int calorias();
}
public class Massa extends Refeicao {
public Massa(String ingrediente) {
this.descricao = ingrediente;
}
@Override public int calorias() { return 250; }
}
public class Salada extends Refeicao {
public Salada() {
this.descricao = "Mix de alfaces";
}
@Override public int calorias() { return 60; }
}
O restaurante inaugurou uma novidade: o cliente pode personalizar seus pratos, esco-
lhendo, ale´m do prato principal, ate´ dois ingredientes da seguinte lista:
• Ingrediente Valor calo´rico
• Azeitona 110
• Frango 40
• Ovo 80
• Molho Roseˆ 180
Por exemplo, uma massa com frango e molho roseˆ conte´m 250 + 40 + 180 = 470 calorias.
PROPONHA modificac¸o˜es no software atual, a fim de suportar o ca´lculo do valor calo´rico
de uma refeic¸a˜o com ingredientes escolhidos pelos clientes. As restric¸o˜es sa˜o:
• Deve-se empregar o padra˜o de projeto Decorator.
• As classes existentes (Refeicao, Massa e Salada) na˜o podem ser alteradas.
Modificac¸o˜es:
Criac¸a˜o de uma classe IngredienteDecorator, que estende a classe Refeic¸a˜o e implementa
o me´todo calorias(). Seu construtor recebe como paraˆmetro um objeto refeic¸a˜o. Criac¸a˜o
de uma classe para cada ingrediente(Azeitona,Frango,Ovo e MolhoRose), que estende a
classe IngredienteDecorator, e sobrescreve o me´todo calorias() do mesmo. Seus construto-
res recebem como paraˆmetro o objeto refeic¸a˜o que sera´ adicionado o ingrediente. A seguir,
o co´digo fonte das classes propostas, e uma classe principal, mostrando como ficaria a
execuc¸a˜o do sistema:
public class IngredienteDecorator extends Refeicao {
private Refeicao refeicao;
public IngredienteDecorator(Refeicao refeicao){
this.refeicao=refeicao;
}
public int calorias() {
return refeicao.calorias();
}
}
public class Azeitona extends IngredienteDecorator {
public Azeitona(Refeicao refeicao) {
super(refeicao);
}
public int calorias()
{
return super.calorias()+110;
}
}
public class Frango extends IngredienteDecorator {
public Frango(Refeicao refeicao) {
super(refeicao);
}
public int calorias()
{
return super.calorias()+40;
}
}
public class MolhoRose extends IngredienteDecorator {
public MolhoRose(Refeicao refeicao) {
super(refeicao);
}
public int calorias()
{
return super.calorias()+180;
}
}
public class Ovo extends IngredienteDecorator {
public Ovo(Refeicao refeicao) {
super(refeicao);
}
public int calorias()
{
return super.calorias()+80;
}}
Classe exemplo, que inicia a execuc¸a˜o do sistema, e realiza o ca´lculo de calorias de uma
refeic¸a˜o contendo massa com frango e molho roseˆ. O resultado da execuc¸a˜o imprime na
tela que esta refeic¸a˜o possui 470 calorias.
public class Main {
public static void main(String[] args) {
Massa massa=new Massa("Massa");
Refeicao refeicao=new Frango(massa);
refeicao=new MolhoRose(refeicao);
System.out.println(refeicao.calorias()+" calorias");
}
}
OUTRA SOLUC¸A˜O
Diagrama da Soluc¸a˜o proposta:
Este trecho foi adicionado ao co´digo original:
public abstract class IngredienteAdicional extends Refeicao {
protected Refeicao refeicao;
public String getDescricao() {
return refeicao.getDescricao()+" + "+this.descricao;
}
}
public class Azeitona extends IngredienteAdicional {
public Azeitona(Refeicao refeicao) {
this.refeicao = refeicao;
this.descricao = "azeitona";
}
public int calorias() {
return refeicao.calorias()+110;
}
}
public class Frango extends IngredienteAdicional {
public Frango(Refeicao refeicao) {
this.refeicao = refeicao;
this.descricao = "frango";
public int calorias() {
return refeicao.calorias()+40;
}
}
public class Ovo extends IngredienteAdicional {
public Ovo(Refeicao refeicao) {
this.refeicao = refeicao;
this.descricao = "ovo";
}
public int calorias() {
return refeicao.calorias()+80;
}
}
public class MolhoRose extends IngredienteAdicional {
public MolhoRose(Refeicao refeicao) {
this.refeicao = refeicao;
this.descricao = "molho ros\^e";
}
public int calorias() {
return refeicao.calorias()+180;
}
}
}
5. (2 pontos) Por default, uma u´nica instaˆncia de cada aspecto em um sistema e´ criada quando
o sistema e´ executado, e essa instaˆncia continua a existir ate´ que o sistema termine. No
entanto, e´ poss´ıvel fazer
com que exista mais de uma instaˆncia de um aspecto.
As instaˆncias de aspectos nunca sa˜o criadas explicitamente pelo programador. Sa˜o criadas
sempre pelo pro´prio AspectJ e podem estar associadas a alguma entidade do sistema. A
associac¸a˜o define quando a instaˆncia e´ criada e quando ela deixa de existir, ale´m de deter-
minar qual instaˆncia e´ usada quando um ponto de junc¸a˜o e´ atingido. Ale´m da associac¸a˜o
default, que e´ de uma instaˆncia por sistema, existem dois outros tipos de associac¸a˜o: por
objeto e por fluxo de controle.
Quando definimos que um aspecto deve ter uma instaˆncia por objeto, a instaˆncia e´ criada
automaticamente quando um objeto do tipo desejado e´ criado. O aspecto fica associado
ao objeto durante toda a vida do objeto, e e´ usado sempre que algum dos pontos de junc¸a˜o
do objeto for interceptado.
Ha´ dois tipos de associac¸a˜o por objeto, perthis(ponto de corte) e pertarget(ponto de corte).
Ambos recebem um ponto de corte como paraˆmetro, que indica os pontos de junc¸a˜o que
va˜o levar a` criac¸a˜o de uma instaˆncia. A diferenc¸a entre eles e´ a mesma diferenc¸a que existe
entre os pontos de corte this() e target(): o perthis() se refere ao objeto onde esta´ o ponto
de junc¸a˜o, e o pertarget() se refere ao objeto que e´ alvo do ponto de junc¸a˜o.
O seguinte exemplo mostra a sintaxe das definic¸o˜es de associac¸a˜o e sera´ usado para ilustrar
seu comportamento:
public aspect testaAssociacao perthis(execucoesReceita()) {
pointcut execucoesReceita() : execution(* Receita.*(..));
int x;
// Construtor
public testaAssociacao() { x = 0; }
after() : execucoesReceita() {
x = x+1;
System.out.println("x = " + x);
}
}
Se executarmos a classe Receita com o seguinte main():
Receita r1 = new Receita("bolo1");
Receita r2 = new Receita("bolo2");
r1.adicionaIngrediente(new Ingrediente("FARINHA", 3));
r1.adicionaIngrediente(new Ingrediente("leite", 1));
r2.adicionaIngrediente(new Ingrediente("FARINHA", 2));
r2.adicionaIngrediente(new Ingrediente("leite", 1));
Obteremos a seguinte sa´ıda:
x = 1
x = 2
x = 1
x = 2
Observe que existe um contador (x) distinto para cada um dos objetos do tipo Receita (r1
e r2). Se removermos a cla´usula perthis() do aspecto acima e executarmos novamente o
main(), teremos a seguinte sa´ıda:
x = 1
x = 2
x = 3
x = 4
x = 5
Note que ha´ apenas um contador para os dois objetos. RESPONDA:
(a) Por que o contador chegou a 5 dessa vez, ao inve´s de 4?
Porque o ponto de corte inclui o me´todo main( ).
(b) Por que o main( ) na˜o foi considerado na primeira execuc¸a˜o?
Porque o main( ) e´ um me´todo esta´tico; me´todos esta´ticos na˜o pertencem a nenhuma
instaˆncia; como o aspecto esta´ associado somente a instaˆncias, o main( ) na˜o tem
um aspecto associado.
progmod-TP1-Modulos1e2-gab-2015-1-grad.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Bacharelado em Cieˆncia da Computac¸a˜o
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
02/03/2015 : Data da Entrega - 30/03/2015 : Data da Devoluc¸a˜o
GABARITO do EXERCI´CIO 1 Mo´dulos I e II - - 10 pontos
Seja preciso. Pesquise. Use as informa¸co˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio. Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula so´ como
refereˆncia. Escreva somente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (1 ponto): Explique como a qualidade interna do produto, apesar de dif´ıcil percepc¸a˜o para
o usua´rio de um software, influencia na qualidade externa do produto.
A qualidade interna de um produto, tal qual a mate´ria-prima de um sapato, por exemplo,
sa˜o decisivas para a durabilidade e a aceitac¸a˜o do produto no mercado. Assim como o sap-
ato, o cliente percebe, via seu uso, se o produto realmente atende as reais necessidades dele.
Considerando um software como produto de um processo, as qualidades internas esperadas
como modularidade, legibilidade e manutenibilidade e´ refletida na qualidade externa. A
modularidade , por exemplo, pode refletir na extensibilidade e reusabilidade de um sistema;
a legibilidade em fatores como a portabilidade de um software e a manutenibilidade pode
estar ligada a correc¸a˜o e robustez. Para se obter um software de boa qualidade, e´ necessa´rio
que tanto fatores internos quanto externos sejam atendidos de forma a equilibrar o processo
e gerar um produto que satisfaa as expectativas dos usua´rios.
2. (1 ponto): Por que o projeto de sistemas, usando o me´todo top-down, ao privilegiar a
relac¸a˜o temporal do programa, prejudica a modularidade do mesmo? Proponha uma
forma de melhorar a modularidade desse tipo de sistema.
Isso acontece porque o me´todo top-down possui uma func¸a˜o u´nica, que e´ decomposta em
componentes diretamente implementa´veis. Esse fato prejudica a modularidade pois, o
me´todo no leva em considerac¸a˜o a natureza evolutiva dos sistemas de software. Sendo
assim, o me´todo no favorece ao reu´so de software, possui dificuldades com continuidade.
Considerando um software como produto de um processo, as qualidades internas esperadas
como modularidade, legibilidade e manutenibilidade sa˜o refletidas na qualidade externa.
Um exemplo disso seria na modularidade, pode refletir na extensibilidade e reusabilidade
de um sistema; a legibilidade em fatores como a portabilidade de um software e a manuteni-
bilidade pode ter ligac¸a˜o na correc¸a˜o e robustez. e´ necessa´rio que tanto fatores internos
quanto externos sejam atendidos de forma a equilibrar o processo e gerar um produto que
satisfaa as expectativas dos usua´rios, para se ter um software de boa qualidade. Sendo as-
sim, o me´todo top-down visualiza o problema de cima para baixo, e, a partir dessa ana´lise,
subdivide-o em suba´reas na tentativa de encontrar uma soluc¸a˜o ideal. A desvantagem deste
tipo e´ a dependeˆncia entre as sub-rotinas, prejudicando o reu´so e a capacidade de mudana
do software ao longo do seu ciclo de vida. Outra desvantagem de um sistema desenvolvido
dessa forma seria a modularidade, pois o sistema e´ visto pelas func¸o˜es que exerce e no
pela estrutura de dados no qual e´ formado, dando uma soluc¸a˜o que no leva em conta a
capacidade evolutiva do sistema. Havera´ melhoria nestes tipos de sistemas se minimizar
o acoplamento via a elaborac¸a˜o de mo´dulos que aceitem passagem por valor, aplicando
o acoplamento por informac¸a˜o e, maximizando a coesa˜o entre seus elementos por meio
da ana´lise do problema e do agrupamento de elementos que executam uma func¸a˜o bem
definida, evitando mo´dulos desnecessa´rios ou agrupamentos ao acaso.
3. (1 ponto): O comando a seguir, permitido no Linux, imprime todos os arquivos com
extensa˜o txt. A qual crite´rio de projeto modular esse comando obedece? Justifique.
ls -l | grep "\.txt$"
Composibilidade, pois ele favorece a produc¸a˜o independente de componentes de software que
podem ser combinados entre si para produzir novos sistemas. Sendo assim, e´ a combinac¸a˜o
de dois mo´dulos do Linux, o primeiro e o Ls, que e´ um comando independente do comando
grep. A combinac¸a˜o dos dois e´ feita via o pipeline ( | ), que utiliza os dois mo´dulos
independentes simultaneamente, produzindo o resultado: a impressa˜o de todos os arquivos
com extensa˜o txt.
4. (1 ponto): Em um projeto orientado a objetos, explique como encontrar e descrever obje-
tos.
Os objetos interagem entre si e sa˜o ativados por meio de troca de mensagens. A POO
introduz uma abordagem na qual o desenvolvedor visualiza seu programa em execuc¸a˜o como
uma colec¸a˜o de objetos cooperantes que se comunicam se por meio de troca de mensagens.
Sistema de software deve:
1. Fornecer respostas a
questo˜es do mundo exterior.
2. Interagir com o mundo exterior.
3. Criar novas entidades no mundo exterior.
Deve-se levar em considerac¸a˜o em um projeto orientado a objetos, aspectos importantes
no que tange os objetos. Um objeto, no contexto da orientac¸a˜o a objetos, e´ uma abstrac¸a˜o
do mundo real implementada em linguagem de computador. A forma de encontrar objetos
se da´ fazendo uma ana´lise do problema apresentado e criando entidades que representem
operac¸o˜es e atributos realizados no mundo real, aproximando, assim, da realidade do prob-
lema, facilitando a sua compreensa˜o. Uma vez encontrada as entidades relevantes de um
dado sistema, e´ necessa´rio agora descreveˆ-las de forma precisa e que no distora as carac-
ter´ısticas reais desta entidade. Para que isso seja poss´ıvel, e´ necessa´rio aplicar os conceitos
de tipos abstratos de dados. Um tipo abstrato e´ uma estrutura que permite unir os dados
em si com a sua interface e operac¸o˜es que podem ser aplicadas sobre estes dados. Um bom
projeto de orientac¸a˜o a objetos expressa, por meio de tipos abstratos de dados, os servios
e as propriedades conseguidas com a ana´lise do problema. Para se conseguir chegar nesses
tipos abstratos e´ necessa´rio ter uma visa˜o ampla do problema para abstrair as principais
entidades e as operac¸o˜es prova´veis destas entidades a partir de uma descric¸a˜o.
5. (1 ponto): Defina gap semaˆntico. Como um bom projeto orientado por objetos e´ capaz de
reduzir essa gap semaˆntico?
Definido como a distaˆncia entre os conceitos que seres humanos conhecem e entendem e
os conceitos que os computadores manipulam.
O papel de quem projeta o software e´ criar algoritmos que ao serem executados no computa-
dor produziro resultados, que podem ser mapeados fisicamente para alguma ac¸a˜o do mundo
real ou examinados/interpretados por pessoas, e´ nota´vel que quanto mais pro´ximo (con-
ceitualmente) estiver o espao de soluc¸o˜es do espao de problemas, mais fa´cil sera´: desen-
volver uma aplicac¸a˜o, assegurar a compreensa˜o, confiabilidade e manutenc¸a˜o da aplicac¸a˜o.
Objetivo do Paradigma de Orientac¸a˜o a Objetos e´ diminuir o Gap semaˆntico. Concluise
que Gap semaˆntico e´ a diferena entre conceitos definidos por diferentes representac¸o˜es
lingu´ısticas. Isto e´, a distaˆncia entre conceitos conhecidos por seres humanos, e os con-
ceitos que os computadores manipulam. No caso de projetos de software esta´ relacionado
diferena entre o que e´ especificado e analisado com o que realmente e´ implementado e
desempenhado pelo software. Um bom projeto orientado a objetos e´ capaz de reduzir esse
Gap Semaˆntico pelo fato de o pro´prio conceito de orientac¸a˜o a objetos fornecer ferramen-
tas que, aplicadas em uma boa ana´lise, e´ capaz de modelar o mundo real do domı´nio do
problema foco do projeto de maneira mais fiel poss´ıvel na sua representac¸a˜o.
6. (1 ponto) Defina e explique tipo abstrato de dados.
Um tipo abstrato e´ uma definic¸a˜o de um tipo com seus atributos e operac¸o˜es fornecidas para
ele, ou seja, seus servic¸os. Sua representac¸a˜o e´ encapsulada, oculta. A especificac¸a˜o do
tipo deve conter todas as informac¸o˜es sobre as suas caracter´ısticas e seu comportamento.
7. (1 ponto): Imagine um sistema operacional orientado por objetos, que no lugar de pro-
gramas administrasse a execuc¸a˜o de objetos. Quais seriam as construc¸o˜es fundamentais e
recursos que a linguagem de comandos deste sistema operacional deveria ter?
Este sistema operacional ofereceria servic¸os, tais como: gereˆncia do processador, gereˆncia
de memo´ria, entrada e sa´ıda, interpretac¸a˜o de comandos. O sistema operacional teria que
inicializar os objetos, criar os principais e enviar-lhes mensagens para iniciar a execua¸a˜o.
8. (1 ponto): Indique qual e´ o grave erro no programa Java abaixo e explique sua causa e
quando o erro e´ detectado.
class A {int x = 8; }
class B extends A { public int x= 9;}
class Array1{
public static void p(A x, A[] v){
for (int i = 0; i < v.length; i++) v[i] = x;
}
public static void main (String [] args){
A a = new A();
B b = new B();
B[] w = new B[10];
for (int i = 0 ; i < w.length; i++) w[i] = b;
p(a,w);
System.out.print(w[0].x); }
}
O tipo esta´tico de w e´ B. Na linha do for dentro do main, atribui-se uma refereˆncia de
classe tipo B para cada elemento de w. Ate´ enta˜o esta´ correto. Na linha seguinte, chama-
se o me´todo p, que tem dois paraˆmetros formais: um do tipo A e um vetor do tipo A.
Quando esta func¸a˜o e´ chamada, seus argumentos sa˜o: uma refereˆncia de classe tipo A,
e uma refereˆncia a um vetor do tipo B, como a classe B estende a classe A, esta´ tudo
correto, pois um paraˆmetro formal do tipo classe base pode receber argumento do tipo da
classe estendida. Dentro desse me´todo p, ha´ uma atribuic¸a˜o, que faz com que, neste caso,
um elemento do vetor w, que e´ do tipo B, receba uma refereˆncia a um valor do tipo A.
Isto esta´ errado, pois a atribuic¸a˜o de refereˆncia de classe base para refereˆncia de classe
estendida somente e´ permitida via casting expl´ıcito, e se o tipo dinaˆmico da refereˆncia
a` classe base for a classe estendida. Isto na˜o ocorre no programa acima. w[i] tem tipos
esta´tico e dinaˆmico igual a B, que e´ a classe estendida. Enquanto que a tem tipos esta´tico
e dinaˆmico igual a A, que e´ a classe base.
9. (1 ponto): Considere os seguintes arquivos de um programa Java abaixo, onde quase todas
as linhas esta˜o corretas. Se a(s) linha(s) errada(s) for(em) apagadas, o programa pode
ser compilado e executado. Identifique a(s) linha(s) errada(s), explique qual e´ o erro (ou
erros) e mostre qual seria o resultado da execuc¸a˜o do main apo´s a remoc¸a˜o do(s) erro(s).
Arquivo Ix.java no Diretorio P1:
1 package P1;
2 public interface Ix {void fx(); }
----------------------------------------------
Arquivo A.java no Diretorio P2:
1 package P2; import P1.*;
2 public class A {
3 private int pri = 1; protected int pro = 2;
4 public int pub = 3; int pac= 4;
5 private static class X implements Ix{
6 public A xpub = new A(); private A xpri = new A();
7 protected A xpro = new A(); A xpac = new A();;
8 public void fx(){
9 int soma1 = 0; int soma2 = 0;
10 soma1 = pri + pro + pub + pac;
11 soma2 = xpri.pri + xpro.pro + xpub.pub + xpac.pac;
12 System.out.println("Soma1 = " + soma1);
13 System.out.println("Soma2 = " + soma2);
14 }
15 }
16 public Ix fa() { return new X(); }
17 }
----------------------------------------------
Arquivo Ver1.java no Diretorio pai de P1 e P2:
1 import P1.*; import P2.*;
2 public class Ver1 {
3 static public void main(String[ ] arg) {
4 A a = new A(); Ix x;
5 x = a.fa();
6 x.fx();
7 }
8 }
O erro esta´ localizado na linha 10. Como X e´ uma classe esta´tica, na˜o ha´ como acessar
varia´veis de instaˆncia na˜o esta´ticas. Em relac¸a˜o aos objetos instanciados como campos
de X, referenciados em Soma2, e´ poss´ıvel buscar os valores desejados, ja´ que os referidos
objetos fornecem um paraˆmetro impl´ıcito this. Apo´s remover a linha 10 que conte´m o erro,
o programa pode ser compilado e executado. Os resultados da execuc¸a˜o sa˜o: soma1= 0,
soma2=10. Resumindo: os membros de dados que aparecem na linha 10 dentro da func¸a˜o
fx na˜o sa˜o esta´ticos. Portanto a chamada que aparece na linha 6 do arquivo Ver1.java,
x.fx( ), est’a errada.
10. (1 ponto): Em Java classes podem ter membros esta´ticos, que denotam atributos cujos
valores sa˜o compartilhados por todos os objetos da classe. Deˆ um exemplo que ilustre o uso
deste mecanismo e mostre como sua programac¸a˜o seria se membros esta´ticos na˜o fossem
usados, isto e´, como voceˆ deve organizar o seu programa para obter o mesmo efeito?
Em java pode
ter tambe´m me´todos de classes em contraposic¸a˜o aos me´todos de objetos. Os
me´todos de classe operam nas varia´veis esta´ticas da classe e esta restric¸a˜o existe porque um
me´todo esta´tico e´ chamado sem que exista o objeto. E´ poss´ıvel atingir o mesmo objetivo
sem a existeˆncia de membros esta´ticos repetindo o co´digo dentro das classes. Nos exemplos
dados, se o saldo mı´nimo for o mesmo para todas as contas ele deveria ser declarado como
esta´tico. Exemplo com membro de dado esta´tico:
class Conta2 {
String nome;
STATIC double saldoMinimo = 100,00;
class Banco2
{Conta2 c = new Conta2( );
Conta2 d = new Conta2( ) ..
}
... new(Banco2() ...
Exemplo sem membro de dado esta´tico:
class Conta1 {
String nome;
double saldoMinimo;
void Conta1(double s) {
saldoMinimo = s}
....}
class Banco1{
Conta1 a = new Conta1(100,00);
Conta1 b = new Conta1(200,00) ..
}
... new(Banco1() ...
progmod-TP2-Modulo3-gab-2015-1-grad.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Bacharelado em Cieˆncia da Computac¸a˜o
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
30/03/2015 : Data da Entrega - 15/04/2015 : Data da Devoluc¸a˜o
GABARITO do EXERCI´CIO 2 - Mo´dulo III - 10 pontos
Seja preciso. Pesquise. Use as informa¸co˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio. Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula so´ como
refereˆncia. Escreva somente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (1 ponto): Por que a heranc¸a para reu´so de implementac¸a˜o na˜o e´ recomendada? Deˆ um
exemplo desse tipo de heranc¸a em linguagem Java.
1. Na˜o e´ permitido mudar o que foi herdado em tempo de execuc¸a˜o.
2. Heranc¸a viola encapsulac¸a˜o (protected).
3. Mudanc¸as na superclasse teˆm impacto em suas subclasses (dependeˆncia).
Classe 1
package Exemplo1;
public class Calcula {
protected int x;
protected int y;
public Calcula(int x,int y){
this.x=x;
this.y=y;
}
private void resetar(){
this.x=0;
this.y=0;
}
public int add(){
return x+y;
}
}
Classe 2
package exemplo2;
import exemplo.Calcula;
public class Banco extends Calcula{
public Banco(int x,int y){
super(x,y);
}
public void violaProtected(int x,int y){
this.x = x;
this.y = y;
}
}
Problema 1. A classe 2, que esta´ contida em um pacote diferente, possui o me´todo viola
que consegue acessar diretamente a variavel declarada como protected.
Problema 2. Se alterarmos o construtor da classe, o construtor da classe 2 na˜o funcionaria
e assim sucessivamente, propagando o problema nas subclasses.
OUTRA RESPOSTA
O mecanismo de heranc¸a, dentro de orientac¸a˜o a objetos, e´ um importante recurso, pois
permite o reu´so de implementac¸o˜es de classes ja´ definidas. O problema e´ que, na relac¸a˜o
entre uma classe herdeira e uma classe-base, deve-se responder a uma simples pergunta:
a classe herdeira e´ uma especializac¸a˜o ou um subtipo da classe-base? Para responder essa
pergunta, considere a relac¸a˜o hiera´rquica a seguir:
public class Pessoa {
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
}
public class Empregado extends Pessoa{
private float salario;
public float getSalario() {
return salario;
}
public void setSalario(float salario) {
this.salario = salario;
}
}
Nessa relac¸a˜o, pode-se dizer que Empregado e´ uma Pessoa, logo Empregado e´ uma especial-
izac¸a˜o ou um subtipo de Pessoa. Essa semaˆntica e´ importante, pois deixa a compreensa˜o
do problema mais pro´xima dos seres humanos, facilitando o entendimento do domı´nio do
problema. Pore´m, pode ocorrer de se utilizar o mecanismo de heranc¸a pura e simplesmente
para reu´so de implementac¸a˜o, como na relac¸a˜o a seguir:
public class Validador {
public boolean validaCPF(String cpf){
if(cpf.length() == 11)
return true;
else
return false;
}
public boolean validaRG(String rg){
if(rg.length() > 11)
return true;
else
return false;
}
}
public class Pessoa extends Validador{
private String nome;
private String cpf;
private String rg;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
if(super.validaCPF(cpf))
this.cpf = cpf;
else
System.out.println("CPF Invalido");
}
public String getRg() {
return rg;
}
public void setRg(String rg) {
if(super.validaRG(rg))
this.rg = rg;
else
System.out.println("RG Invalido");
}
}
Neste caso, a classe Validador apenas conte´m rotinas comuns de validac¸a˜o de CPF e RG,
claro que hipoteticamente. Veja que a relac¸a˜o entre Pessoa e Validador na˜o satisfaz a regra
semaˆntica proposta pela orientac¸a˜o a objetos: Uma Pessoa na˜o e´ uma especializac¸a˜o de
Validador e um Validador, semanticamente falando, na˜o e´ um supertipo de Pessoa. Por-
tanto, o mecanismo de heranc¸a, utilizado como reu´so de implementac¸a˜o na˜o e´ recomen-
dado, dentro de uma ana´lise semaˆntica, por que na˜o estabelece uma relac¸a˜o de conjunto e
subconjunto um com o outro.
O exemplo fornecido, da classe Empregado ser uma subclasse da classe Pessoa, viola as
condic¸o˜es para uma boa heranc¸a, conforme estudado no assunto de princ´ıpios. Isso porque
Empregado e´ um papel da classe Pessoa
2. (1 ponto) Diferencie apontadores e semaˆntica de refereˆncia. Como a semaˆntica de refereˆncia
e´ empregada em programac¸a˜o orientada por objetos?
Semaˆntica de refereˆncia e´ a adoc¸a˜o do uso da refereˆncia, ligac¸a˜o, para um objeto, em vez de
seu valor, conteu´do, em operac¸o˜es tais como atribuic¸a˜o e comparac¸a˜o. As refereˆncias sa˜o
como apontadores, mas sem a sintaxe dos mesmos e os apontadores sa˜o responsa´veis pelo
polmorfismo, pois sem eles, os elementos seriam monomorficos, na˜o tendo refereˆncia aos
outros objetos. A semaˆntica de refereˆncias e´ utilizada para realizar a troca de informac¸o˜es
entre os ojetos e manter a coereˆncia semaˆntica.
3. (1 ponto) Descreva dois fatores de risco para o projeto de componentes para reu´so. Mostre
tambe´m duas vantagens de componentes para reu´so que suplantam seu risco.
Fatores de risco:
Repetic¸o˜es na˜o sa˜o exatas, implicando em modificac¸o˜es
Problemas sa˜o propagados
Vantagens:
Ganha de tempo no aproveitamento da estrutura
Diminuic¸a˜o de custos com desenvolvedores
Facilidade de manutenc¸a˜o
OUTRA RESPOSTA
Os fatores de riscos para o projeto de componentes para reu´so sa˜o:
1) Componentes reutiliza´veis sa˜o mais complexos, o que diminui sua confiabilidade.
2) Componentes de prateleira, sa˜o fornecidos como caixas-pretas, o que dificulta prever
seu comportamento em relac¸a˜o a falhas.
3) A reutilizac¸a˜o de componentes muitas vezes adiciona novos requisitos ao projeto, e exige
adaptac¸o˜es que o tornam mais complexos.
Vantagens de componentes para reu´so que suplantam seu risco em relac¸a˜o a fatores econoˆmicos
e mercadolo´gicos:
1) Permite reduzir custos no desenvolvimento.
2) Permite diminuir o per´ıodo de implementac¸a˜o necessa´rio aumentando a qualidade.
4. (1 ponto) Explique como a genericidade promove o reu´so de estrutura de dados. Deˆ um
exemplo de genericidade, mostrando o cabec¸alho dos me´todos necessa´rios para determinar
o valor mı´nimo contido em um arranjo.
Via genericidade
pode-se criar estruturas de dados que possibilitem sua utilizac¸a˜o em uma
gama maior de problemas, aplicac¸o˜es, etc. sendo assim, sua reutilizac¸a˜o sendo muito mais
propicia.
5. (1 ponto): Diferencie polimorfismo parame´trico impl´ıcito e expl´ıcito. Deˆ exemplos.
6. (1 ponto:) A linguagem C++ realiza e permite que programadores realizem sobrecarga
tanto de programas quanto de operadores.
(a) Qual a diferenc¸a entre as posturas adotadas por JAVA e C++ em relac¸a˜o ao polimor-
fismo de sobrecarga?
A diferenc¸a e´ que JAVA embute sobrecarga em operadores e em subprogramas de
suas bibliotecas, mas somente subprogramas podem ser sobrecarregados pelo progra-
mador, enquanto C++ realiza e permite que programadores realizem sobrecarga tanto
de programas quanto de operadores. Os criadores de JAVA resolveram na˜o incluir
a sobrecarga de operadores por considera´ -la capaz de gerar confuso˜es e aumentar a
complexidade da LP. A postura adotada por C++ e´ mais ampla e ortogonal, facili-
tando a leitura e redac¸a˜o dos programas, se utilizada corretamente.
(b) Qual dessas posturas voceˆ acha melhor? Apresente argumentos justificando sua
posic¸a˜o.
Em minha opinia˜o pessoal, considero a postura de C++ mais adequada em termos de
elegaˆncia. Em termos pra´ticos, acho que o ganho conferido e´ pequeno se comparado
a complexidade associada ao uso de sobrecarga de operadores.
7. (3 pontos) Dado o exemplo de Heranc¸a Simples em JAVA,
public class Liquidificador {
protected int velocidade;
protected int velocidadeMaxima;
public Liquidificador () {
velocidade = 0;
velocidadeMaxima = 2;
}
public Liquidificador (int v) {
this ();
ajustarVelocidadeMaxima (v);
}
protected void ajustarVelocidadeMaxima (int v)
{ if (v > 0) velocidadeMaxima = v;
}
protected void ajustarVelocidade (int v)
{if (v >= 0 && v <= velocidadeMaxima) velocidade = v;
}
public int obterVelocidadeMaxima () { return velocidadeMaxima; }
public int obterVelocidade () { return velocidade; }
}
public class LiquidificadorAnalogico extends Liquidificador {
public LiquidificadorAnalogico () { velocidade = 0; }
public void aumentarVelocidade () { ajustarVelocidade (velocidade + 1); }
public void diminuirVelocidade () { diminuirVelocidade (velocidade 1); }
}
public class LiquidificadorDigital extends Liquidificador {
public LiquidificadorDigital () { velocidade = 0; }
public void trocarvelocidade (int v) { ajustarVelocidade (v); }
}
public class LiquidificadorInfo {
public void velocidadeAtual (Liquidificador l) {
System.out.println (Velocidade Atual: + l.obterVelocidade ());
}
}
(a) (1 ponto) - Identifique o tipo de polimorfismo que ocorre neste exemplo.
Polimorfismo universal por inclusa˜o.
(b) (1 ponto) - Explique porque este trecho de co´digo e´ polimo´rfico.
Esse trecho e´ polimo´rfico porque a utilizac¸a˜o da classe Liquidificador permite o trata-
mento generalizado de todas as suas subclasses. O trata- mento generalizado de
classes permite escrever programas que podem ser mais facilmente extens´ıveis, isto e´,
que podem acompanhar a evoluc¸a˜o de uma hierarquia de classe sem necessariamente
serem modificados. Por exemplo, na classe LiquidificadorInfo, existe um me´todo ca-
paz de imprimir a velocidade atual de objetos liquidificador os quais podem ser tanto
do tipo digital como analo´gico. Nesta situac¸a˜o, o polimorfismo permite que um sim-
ples trecho de codigo seja utilizado para tratar objetos diferentes relacionados atraves
de seu ancestral comum, simplificando a implementac¸a˜o, melhorando a legibil- idade
do programa e tambem aumentando sua exibilidade.
(c) (1 ponto) - Indique ainda se o polimorfismo e´ ad-hoc ou universal e justifique.
O polimorfismo do exemplo e´ de tipo universal, pois as estruturas de dados incorporam
elementos de tipos diversos e um mesmo co´digo pode ser executado e atuar sobre
elementos de diferentes tipos.
progmod-TP3-Modulo-IV-gab-2015-1-grad.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Bacharelado em Cieˆncia da Computac¸a˜o
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
15/04/2015 : Data da Entrega - 29/04/2015 : Data da Devoluc¸a˜o
- GABARITO do EXERCI´CIO 3 - MO´DULO IV - 10 pontos
Seja preciso. Pesquise. Use as informa¸co˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio. Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula so´ como
refereˆncia. Escreva somente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (1 ponto) Defina e explique Programac¸a˜o por Contrato.
E´ uma te´cnica, um estilo de programac¸a˜o para melhorar a qualidade do software. Pro-
gramac¸a˜o por contrato e´ definido pelo relacionamento entre uma classe e seus clientes
via relac¸a˜o de direitos e obrigac¸o˜es. Todo me´todo deve definir cla´usulas de pre´-condic¸o˜es
e po´s-condic¸o˜es. As pre´-condic¸o˜es definem as condic¸o˜es sob as quais a chamada a uma
rotina e´ leg´ıtima e a po´s-condic¸a˜o define as condic¸o˜es que a rotina deve garantir no seu
retorno. Um retorno normal significa cumprimento do contrato.
2. (1 ponto): Me´todos pu´blicos e protegidos de uma classe podem ter suas definic¸o˜es sobre-
postas em suas subclasses.
De acordo com a programac¸a˜o por contrato, me´todos exigem pre´-condic¸o˜es satisfeitas e
devem produzir estados finais que satisfazem po´s-condic¸o˜es.
Isto significa que a redifinic¸a˜o de um me´todo de uma da classe em uma de suas subclasses,
embora possa ser feita com grande liberdade, deve respeitar o contrato do me´todo.
Qual enta˜o deve ser a relac¸a˜o entre a a pre´-condic¸a˜o e a po´s-condic¸a˜o de um me´todo
definido em A e as respectivas pre´-condic¸a˜o e po´s-condic¸a˜o de sua redefinic¸a˜o em alguma
subclasse de A, para que o contrato do me´todo seja respeitado?
Na redefinic¸a˜o da implementac¸a˜o de um contrato, pode-se enfraquecer as pre´-condic¸o˜es e
fortalecer as po´s-condic¸o˜es de me´todos. A po´s-condic¸a˜o pode ser fortalecida, mas nunca
enfraquecida.
3. (1 ponto): No processo de criac¸a˜o de uma subclasse C de uma classe A, pode-se redefinir o
comportamento de me´todos pu´blicos ou protegidos de A, redeclarando-os em C. Sabemos
que o programador tem a liberdade de definir qualquer novo comportamento para esses
me´todos, mas para que C seja de fato uma especializac¸a˜o de A, no sentido de Programac¸a˜o
por Contrato, que tipo de restric¸o˜es devem ser observadas neste processo?
Nesse processo deve-se observar para que na˜o ocorra violac¸a˜o de contrato da classe A, ou
seja, deve ser observado o fortalecimento/enfraquecimento de po´s e pre´-condic¸o˜es.
4. (1 ponto): Como o u´nico mecanismo de modularizac¸a˜o em Java e´ a classes, isto e´, em Java
nada ha´ fora de classe, poder-se-ia dizer que todo programa escrito em Java e´ necessaria-
mente orientado por objetos? Justifique sua resposta e de exemplos.
Na˜o. A programac¸a˜o orientada por objetos e´ a construc¸a˜o de um sistema de software
como uma colec¸a˜o de objetos que trocam mensagens entre si. Exemplo de um programa
na˜o orientado por objetos: um indiv´ıduo pode escrever o programa todo dentro de uma
u´nica classe, inclusive com a func¸a˜o main na mesma classe. Este programa na˜o seria
orientado por objetos. Na˜o passaria de um programa como em Fortran. Classe e´ apenas
um recurso que as linguagens orientadas por objeto oferecem para escrever programas. O
que define um programa orientado por objetos e´ a forma como se utiliza os conceitos de
poo, modularidade, adt, etc.
5. (1 ponto): O conjunto dos Ortopedistas e´ um subconjunto dos Me´dicos. A classe
Ortopedista pode ser definida como
uma subclasse de Me´dico, ja´ que esta oferece um
subconjunto dos servic¸os definidos pela primeira. Neste caso, a relac¸a˜o classe-subclasse
corresponde a` relac¸a˜o conjunto-subconjunto, isto e´, se a classe corresponde ao conjunto,
a subclasse corresponde a um de seus subconjuntos. Por outro lado, em Java ou Eiffel, e´ co-
mum definir a classe Complexo de nu´meros complexos como sendo uma subclasse de Real,
a classe dos nu´meros reais. Agora, entretanto, a correspondeˆncia conjunto-subconjunto e
classe-subclasse na˜o e´ mais va´lida, ja´ que Complexo na˜o pode ser considerado subconjunto
de Real. Explique este paradoxo. O que ha´ de errado nisto?
Isso se deve ao fato de que a heranc¸a pode ser vista como um mecanismo para criac¸a˜o
de subtipos e tambe´m como um mecanismo para reu´so de implementac¸a˜o. No caso de
Me´dicos e Ortopedistas, a relac¸a˜o conjunto-subconjunto e´ va´lida, realmente Ortopedistas e´
um subconjunto de Me´dicos, neste caso a heranc¸a esta´ sendo utilizada como um mecanismo
para criac¸a˜o de subtipos. Ja´ no caso de Real e Complexo, a relac¸a˜o conjunto-subconjunto
na˜o e´ va´lida, os nu´meros complexos na˜o sa˜o um subconjunto dos nu´meros reais. A classe
Complexo e´ definida como uma subclasse de Real para se aproveitar propriedades e me´todos
ja´ implementados na classe Real. Neste caso, a heranc¸a esta´ sendo utilizada como um
mecanismo para reu´so de implementac¸a˜o.
6. (1 ponto): Sob a o´tica da manutenc¸a˜o do software, defina um crite´rio para determinar se
uma constante deve ser de sistema ou de biblioteca.
Constantes simbo´licas de sistema sa˜o aquelas de interesse geral, dependentes de plataforma,
com o escopo de todo sistema, cuja alterac¸a˜o em seus valores na˜o implica em manutenc¸a˜o
nos mo´dulos que as utilizam. As constantes simbo´licas de biblioteca sa˜o de interesse so-
mente da biblioteca e de seus mo´dulos. Dessa forma, com base nos princ´ıpios de manutenc¸a˜o
e reu´so de software, constantes simbo´licas devem ser definidas como de sistema em casos
em que sera˜o u´teis em va´rios pontos da aplicac¸a˜o, e como de biblioteca em casos que
seu interesse e´ local, restrito a uma biblioteca espec´ıfica, e sera˜o irrelevantes para outros
mo´dulos ou bibliotecas.
7. (1 ponto) Mostre dois exemplos de uso de efeito colateral: um nocivo e outro bene´fico a`
qualidade do programa. Justifique os exemplos apresentados.
//Efeito colateral Nocivo
public int informaValorTopo() {
Vetor.remove(Vetor.size()).getValor();
}
//Efeito benefico
public <T> retiraItem() {
return Vetor.remove(Vetor.size());
}
//outros metodos
//...
}
O me´todo infomarValorTopo() produz um efeito colateral nocivo porque sua descric¸a˜o sug-
ere apenas que o valor do topo da pilha seja informado e, apesar disso, o valor e´ removido
da pilha, alterando o estado do objeto.
O me´todo retiraItem() produz o mesmo efeito colateral, que nesse caso e´ bene´fico porque
executa o esperado: retirar o item do topo da pilha.
OUTRA RESPOSTA
Todo me´todo provoca um efeito colateral. No entanto, alguns efeitos colaterais podem ser
nocivos a` boa qualidade do software enquanto outro sa˜o bene´ficos. A seguir um exemplo
desses dois tipos de efeitos colaterais.
Exemplo:
public class Ex {
private int[] vetor = new int[10];
public int[] multiplica(int mult) {
for(int i=0; i<10; i++) {
vetor[i] = vetor[i] * mult;
}
return vetor;
}
public int[] retornaVetor() {
return vetor;
}
}
No exemplo dao, o me´todo retornaVetor na˜o causa um efeito colateral, pois sempre que
chamado, sem que haja alterac¸a˜o anteriores no vetor, retornara´ o mesmo resultado, ou
seja, retornara´ o pro´prio vetor em seu estado atual. Por outro lado, e´ preciso atenc¸a˜o ao
usar o me´todo multiplica, pois se chamado por descuido por mais de uma vez, produzira´,
um resultado diferente a cada chamada, mudando o estado do objeto, isto e´, modificando
os valores contidos no vetor para valores indeseja´veis.
8. (1 ponto) - Qual a relac¸a˜o que existe entre efeito colateral e procedimentos e func¸o˜es.
A obrigac¸a˜o da func¸a˜o e´ somente retornar um valor. Mas se ale´m dela retornar o valor
ela muda o estado do objeto, enta˜o a func¸a˜o tem efeito colateral. Por outro lado, o
procedimento so´ existe pelo efeito colateral, que se resume em alterar o valor de paraˆmetros
e, ou varia´veis globais. Um procedimento sem efeito colateral na˜o serve para nada.
9. (2 pontos): Quais seriam as vantagens de se implementar objetos como ma´quinas de
estado? Que efeito tem esta abordagem nas interfaces dos objetos.
Eficieˆncia.
Implementar objetos como ma´quinas de estado afetam a interface. Na verdade, a inter-
face na˜o esta´ preocupada com o detalhe do que e´ uma lista, este e´ um problema da im-
plementac¸a˜o. MAS a interface influencia a implemementac¸a˜o, enta˜o existe uma relac¸a˜o
entre eles. Existem interfaces que sa˜o naturais mas a implementac¸a˜o e´ ineficiente.
Por exemplo, para implementar uma lista encadeada a interface poderia ser
class User \{
public static void main(String[ ] a) {
Linkedlist q;
int v1 = 1; int v2 = 2; int v3 = 3; int v4 = 4;
int n = 5; int k;
...
k = q.search(v1);
v4 = q.value(k);
q.insert(n,v2);
q.changevalue(n, v3);
q.delete(n); ... } }
Neste exemplo, toda operac¸a˜o tem que percorrer a lista, seja para pesquisar, seja para
inserir, etc. Ou seja, todas as func¸o˜es sa˜o O(n).
Existem outros tipos de interfaces que podem gerar implementac¸o˜es mais interessantes.
Uma metodologia seria ver o objeto como estado. Quando o me´todo do objeto e´ chamado
ele muda o estado do objeto. Enta˜o objetos agora tem servic¸os e estado. Neste caso temos
que mudar o contrato, mudar a interface. A ide´ia e´ a seguinte, a lista na nova abordagem
tem a ide´ia de nodo corrente, o nodo ativo. A todo momento tem um nodo que e´ o nodo
principal. Portanto, a interface vai ser definida em func¸a˜o do fato de existir um cursor
que e´ o nodo da lista.
O objeto como ma´quina de estado nos da´ a noc¸a˜o de que, ao olhar para o tipo e´ como se ele
fosse uma ma´quina de estado, ou seja, o objeto tem um estado, quando e´ executada uma
operac¸a˜o sobre o tipo ele retorna valores e pode mudar o estado do objeto. Este fato de ter
estado tem a ver com a interface. O ESTADO E´ SEMPRE DEFINIDO PELA U´LTIMA
OPERAC¸A˜O. ENTA˜O TODAS AS OPERAC¸O˜ES: INSERIR A DIREITA DO CURSOR,
INSERIR A ESQUERDA DO CURSOR, VOLTAR O VALOR DO ELEMENTO APON-
TADO PELO CURSOR, ETC tudo e´ O(1), EXCETO a PESQUISA, o BACK e o GO,
as u´nicas a percorrer a lista toda.
Assim com esta nova definic¸a˜o para o exemplo anterior temos:
class User {
public static void main(String[ ] a) {
Linkedlist q; BOOLEAN b;
int v1 = 1; int v2 = 2; int v3 = 3;
int v4 = 4; int n = 5;
.... b = q.search(v1);} v4 = q.value(k); {\bf q.go(n);
q.insertRight(v2);
q.changevalue(v3);
q.delete( );} ... } }
Note que foi mudada a definic¸a˜o da interface. Na˜o estou trazendo detalhe de imple-
mentac¸a˜o para a interface? NA˜O necessariamente, so´ estou mudando a visa˜o do estado
do objeto.
Resumindo, a interface foi mudada de tal forma que a implementac¸a˜o ficasse mais efi-
ciente, que ficasse mais barata. Como? Reconhecendo o fato de que objetos teˆm UM
COMPORTAMENTO E UM ESTADO. O comportamento e´ implementado pelas operac¸o˜es
e podem afetar o estado dos objetos, e mais ainda, que as operac¸o˜es podem ser definidas
em func¸a˜o do estado do objeto ou na˜o. Ao fazer isto na˜o se esta´ abaixando o n´ıvel, esta´
simplesmente mudando a visa˜o que se tem do tipo de dado.
progmod-TP4-Modulo-VeVI-gab-2015-1-grad.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Bacharelado em Cieˆncia
da Computac¸a˜o
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
27/04/2015 : Data da Entrega - 06/05/2015 : Data da Devoluc¸a˜o
GABARITO do EXERCI´CIO 4 - Mo´dulos V e VI - 10 pontos
Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (1 ponto): Para a criac¸a˜o de um software para gesta˜o de inventa´rio, foram propostas duas
alternativas, ilustradas pelas Figuras 1 e 2. Empregando os conceitos de modularidade e
abstrac¸a˜o, qual das duas alternativas traz maior flexibilidade ao software? Justifique.
Figura 1: Primeira alternativa do software para gesta˜o de inventa´rio
Figura 2: Segunda alternativa do software para gesta˜o de inventa´rio
A alternativa 2 traz maior flexibilidade. Pode existir uma especificac¸a˜o de eletrodomes-
tico igual para va´rios produtos, e este objeto podera´ ser reutilizado na criac¸a˜o de novas
instaˆncias da classe Eletrodomestico.
OUTRA RESPOSTA
A segunda alternativa e´ mais flex´ıvel, pois a especificac¸a˜o do eletrodome´stico isola carac-
ter´ısticas comuns a todos os eletrodome´sticos da classe Eletrodome´stico, que conte´m apenas
os atributos espec´ıficos de um eletrodome´stico no inventa´rio, tal como seu co´digo de barras.
OUTRA RESPOSTA
Ao criar o tipo de dados EspecificacaoDeEletrodomestico, ela evitou que as informac¸o˜es
contidas nesse novo tipo tivessem que ser replicadas em cada Eletrodome´stico e, ao mesmo
tempo, evitou que as alterac¸o˜es na estrutura da especificac¸a˜o interferissem no eletro-
dome´stico;
Pode-se atribuir a mesma especificac¸a˜o a mu´ltiplos eletrodome´sticos, o que permite que
eles sejam facilmente agrupados em relac¸a˜o a esse atributo;
Como as classes de eletrodome´stico e especificac¸a˜o sa˜o menores que a classe composta,
elas podem ser estendidas em mais casos.
A quantidade de informac¸o˜es trocadas no me´todo ”adicionar”foi reduzida em nu´mero de
paraˆmetros e ampliada em relac¸a˜o a` abstrac¸a˜o.
OUTRA RESPOSTA
Se o objetivo e´ a flexibilidade, a segunda opc¸a˜o e´ melhor pois permite a busca no inventa´rio
com base na marca, modelo e voltagem. Em termos de modularidade e abstrac¸a˜o, ambas as
classes apresentam caracter´ısticas semelhantes. No caso, a diferenc¸a na segunda opc¸a˜o e´
que as especificac¸o˜es foram abstra´ıdas do produto de forma a facilitar e compartimentalizar
a busca com base nessas caracter´ısticas, tornando essa opc¸a˜o mais flex´ıvel. A primeira
opc¸a˜o na˜o tem essa opc¸a˜o de busca e, neste caso, na˜o faz sentido separar as informac¸o˜es
de marca, modelo e volume criando mais uma abstrac¸a˜o.
2. (1 ponto): Explique como a linguagem Java oferece suporte a`s abstrac¸o˜es de:
(a) Func¸a˜o.
Java oferece suporte a func¸o˜es por meio de me´todos que podem ser declarados esta´ticos
e final de forma a manterem um comportamento fixo e pass´ıvel de acesso em qual-
quer ponto do co´digo desde que sejam pu´blicos. Via sua execuc¸a˜o promovem efeitos
colaterais no ambiente.
(b) Procedimento.
Tambe´m implementado via me´todos. O n´ıvel de acesso ao ambiente sera´ determinado
pelo executor do comando e estrutura do me´todo em si. Muito semelhante as func¸o˜es.
Dependendo da estrutura pode acessar valores constantes contidos na classe a que
pertencem e manipular varia´veis de sistema provocando efeitos colaterais.
(c) Tipo abstrato de dados.
Classes e pacotes permitem a criac¸a˜o de tipos abstratos de dados em Java. Tanto a
classe pode agrupar varia´veis e ac¸o˜es necessa´rias a implementac¸a˜o de um determinado
comportamento, como um pacote pode utilizar va´rias classe para atingir um mesmo
objetivo em um n´ıvel mais alto.
(d) Tipo parametrizado. A utilizac¸a˜o de tipos gene´ricos na declarac¸a˜o de classes permite
a parametrizac¸a˜o de tipos.
3. (1 ponto): De que forma o crite´rio de continuidade do software e´ influenciado, caso se
aplique o princ´ıpio da ocultac¸a˜o da informac¸a˜o? Justifique.
Tendo em mente que um software deve ser constru´ıdo de forma a permitir alterac¸o˜es
durante sua vida, a ocultac¸a˜o da informac¸a˜o possibilita que os mo´dulos sejam alterados
internamente sem afetar sua interface, ou seja, os mo´dulos que utilizam seus servic¸os
continuara˜o fazendo-o da mesma forma.
OUTRA RESPOSTA
Com a ocultac¸a˜o da informac¸a˜o, fica mais simples identificar os pontos de comunicac¸a˜o
entre os mo´dulos pelo simples fato de que os pontos de contato e o universo no qual se
deve buscar por eles diminuem. Portanto, quando se aplica o princ´ıpio da ocultac¸a˜o da
informac¸a˜o, fica mais fa´cil fazer verificac¸o˜es de continuidade entre mo´dulos.
4. (1 ponto): Analise a classe Validador e responda:
public class Validador {
public boolean validarEmail(String email) { ? }
public boolean validarCartaoDeCredito(String numeroCartao)
{ ? }
public boolean validarIntervalo(int valor, int min, int max)
{ ? }
}
(a) Que tipo de mo´dulo essa classe expressa?
A classe Validador e´ um mo´dulo do Tipo Rotinas Relacionadas.
(b) Esse tipo de mo´dulo e´ bom ou ruim? Justifique. Desde que usado com crite´rio
e onde realmente seja va´lido, esse tipo de mo´dulo e´ bom pois permite encontrar de
forma fa´cil fuc¸o˜es relacionadas. Uma vez que eu tenho um mo´dulo Validador, toda vez
que for necessa´rio executar uma operac¸a˜o de validac¸a˜o esse me´todo vai ser utilizado,
reaproveitando os me´todos ja´ previstos na classe.
5. (1 ponto): Demonstre como um mo´dulo pode ser constru´ıdo usando a linguagem Java.
//TAD Casa com acesso pu´blico (pode ser acessada fora de seu pacote)
public class Casa {
//varia´veis de insta^ncia privadas (acessı´veis somente a` classe)
private String corFachada;
private Comodo[] comodo;
//construtor da classe
public Casa(int qtdComodos) {
//co´digo a ser executado quando um novo objeto Casa for criado
comodo = new comodo[qtdComodos];
}
//me´todo pu´blico que retorna a cor da fachada da casa
// (o setCorFachada foi omitido)
public String getCorFachada() {
return corFachada;
}
//me´todo que insere um novo co^modo se couber
public boolean insereComodo(String cor,int cumprimento,int largura) {
for(int i=0;i<comodo.length;i++) {
if(comodo[i]==null) {
comodo[i] = new Comodo(cor,cumprimento,largura);
return true; }
} return false;
}
//estrutura de dados que representa um co^modo
private class Comodo {
public String cor;
public int cumprimento;
public int largura;
public Comodo(String cor,int cumprimento,int largura) {
this.cor = cor;
this.cumprimento = cumprimento;
this.largura = largura;
}
}
}
Em java um mo´dulo sempre sera´ constru´ıdo a partir de uma classe. Na class e´ poss´ıvel
determinar o tipo de mo´dulo e a partir da´ı constru´ı-lo. Se for um TAD, agregar os atri-
butos e me´todos necessa´rios utilizando classes aninhadas e privadas criteriosamente para
representar estruturas internas a´ classe. Ale´m disso, os modificadores de acesso podem ser
usados para definir a interface externa da classe. Se for um mo´dulo de Rotinas Relaciona-
das, basta criar os me´todos e agrupa´-los em uma classe. Se for um mo´dulo de declarac¸a˜o
de dados, basta utilizar uma classe e colocar nela os atributos necessa´rios, interna a classe
que a usa. Se for um mo´dulo de agrupamento geral, podemos usar todos os mecanismos
anteriores.
6. (1 ponto): O uso correto de classes aninhadas em Java privilegiam quais princ´ıpios de
modularidade? Justifique.
O uso de classes aninhadas privilegia os princ´ıpios de ocultac¸a˜o de informac¸a˜o, unidade
lingu´ıstica e interface pequena. A ocultac¸a˜o
de informac¸a˜o se manifesta na ocultac¸a˜o de
uma estrutura dentro da pro´pria classe aninhada que na˜o sera´ vis´ıvel no ambiente externo
ao mo´dulo mas servira´ o seu propo´sito internamente. A unidade lingu´ıstica permite repre-
sentar abstrac¸o˜es que existem na linguagem, mas que dizem respeito somente ao mo´dulo
internamente e por tanto na˜o devem ser vis´ıveis no ambiente externo. Princ´ıpio Poucas
Interfaces porque existem casos em que um tipo de dados e´ utilizado apenas por uma u´nica
classe, logo, o mais via´vel e´ implementar esses tipos como uma classe aninhada a` primeira,
evitando comunicac¸a˜o com mo´dulos externos;
7. (1 ponto): Para cada crite´rio relacionado a seguir, indique como ele interfere na modula-
ridade de um sistema:
(a) Acoplamento
O acoplamento entre mo´dulos se refere ao n´ıvel de dependeˆncia entre dois ou mais
mo´dulos. Dessa forma, quanto menos acoplados forem os mo´dulos de um sistema,
menor sera´ sua conectividade, contribuindo assim para sua modularidade. Mo´dulos
pouco acoplados teˆm suas interfaces bem definidas, influenciam poucos mo´dulos com
os quais se relacionam e dependem muito pouco deles. Isso facilita sua manutenibi-
lidade e extensibilidade, visto que em modificac¸o˜es futuras, havera´ a necessidade de
poucas alterac¸o˜es nos mo´dulos envolvidos, erros na˜o sera˜o muito propagados, o reu´so
do mo´dulo sera´ facilitado e o seu papel e´ mais facilmente entendido.
(b) Coesa˜o
A coesa˜o de mo´dulos esta´ ligada ao relacionamento dos membros internos de um
mo´dulo. Um mo´dulo deve ter elevado grau de coesa˜o interna para favorecer sua ma-
nutenibilidade, extensibilidade e integridade, pois mo´dulos coesos sa˜o bem estrutura-
dos, implementam uma u´nica abstrac¸a˜ao, tem sua interface e contrato bem definidos
e promovem o encapsulamento de informac¸o˜es importantes de interesse interno do
mo´dulo.
8. (1 ponto): Defina e deˆ um exemplo para cada um dos tipos de acoplamento:
(a) Acoplamento por conteu´do
O acoplamento por conteu´do se verifica quando um mo´dulo possui atributos pu´blicos e
um outro mo´dulo altera sutilmente o conteu´do desses atributos de forma indesejada.
Exemplo: No exemplo apresentado abaixo a classe Refrigerador possui todos os seus
atributos privados, exceto temperatura, que por descuido do programador esta´ com
acesso pu´blico. Na classe CamaraFria que instancia um objeto de Refrigerador ha´
um acesso indevido ao atributo temperatura alterando seu valor, de forma que pode
ocorrer problemas no funcionamento da aplicac¸a˜ao. Esse tipo de acoplamento na˜o e´
desejado, pois viola o encapsulamento.
public class Refrigerador {
public int temperatura;
private int capacidade;
private bool ligado;
...
}
public class CamaraFria {
...
Refrigerador r = new Regrigerador();
...
r.temperatura = 0;
...
}
(b) Acoplamento por controle
O acoplamento por controle ocorre quando um mo´dulo invoca um me´todo de outro
mo´dulo, necessitando conhecer seu conteu´do, e passar um paraˆmetro para controlar
sua execuc¸a˜ao. No exemplo a seguir a classe Cadastro invoca o me´todo registrar-
Consulta da classe ConsultaCliente, pore´m para isso e´ preciso conhecer o conteu´do
do me´todo, uma vez que e´ necessa´rio passar um paraˆmetro para alcanc¸ar o resultado
desejado.
public class ConsultaCliente {
...
public void registrarConsulta(int p, int protocolo) {
if(p == 1) {
incluirPendencia(protocolo);
}
else {
incluirConsulta(protocolo);
}
}
...
}
public class Cadastro {
...
ConsultaCliente cc = new ConsultaCliente();
...
cc.registrarConsulta(1);
...
}
9. (1 ponto): Identifique o tipo de coesa˜o existente em cada uma das classes a seguir. Justi-
fique sua resposta.
(a) Classe LousaVirtual. Possui o me´todo iniciar, que inicializa o subsistema gra´fico,
e os me´todos desenharCirculo e desenharRetangulo, que exibem algumas figuras
geome´tricas na lousa.
public class LousaVirtual {
private Grafico gr;
public void iniciar(String[] parametros) {
gr = new Grafico(parametros);
}
public void desenharCirculo(Posicao p, int raio) {
gr.circulo(p, raio);
}
public void desenharRetangulo(Posicao p, int alt, int larg) {
gr.retangulo(p, alt, larg);
}
}
A classe LousaVirtual possui, de maneira mais n´ıtida, coesa˜o procedimental, pois os
me´todos desenharCirculo e desenharRetangulo para serem executados normalmente
necessitam que antes tenha sido invocado o me´todo iniciar. Essa mesma classe possui
tambe´m coesa˜o comunicacional, visto que seus me´todos operam sobre dados comuns
entre si, nesse caso, o objeto gr do tipo Grafico.
(b) Classe PlanejamentoDeViagem. Possui me´todos para calcular o custo de uma viagem,
se o meio de transporte escolhido for automo´vel, trem ou avia˜o.
public class PlanejamentoDeViagem {
public double viajarPorAutomovel() { ... }
public boolean viajarPorTrem() { ... }
public boolean viajarPorAviao() { ... }
}
A classe PlanejamentoDeViagem possui coesa˜o contratual, pois implementa um u´nico
contrato, ou seja, tem o objetivo puro e simples de calcular o custo de viagem de
acordo com o meio de transporte, e seus me´todos possuem ainda coesa˜o funcional,
pois cada um desempenha uma u´nica func¸a˜ao, a de calcular o custo da viagem.
10. (1 ponto): Sobre a estruturac¸a˜o do software em camadas, responda:
(a) Defina arquitetura de software e modelo de camadas. Arquitetura de software e´ o pro-
cesso de organizar estruturalmente os mo´dulos de um programa definindo seus inter-
relacionamentos, de modo a produzir softwares de fa´cil manutenc¸a˜o e reutilizac¸a˜o. O
modelo de camadas ou arquitetura tipo-classe e´ uma maneira de se estruturar softwa-
res orientados a objetos de forma a proporcionar um aumento da sua modularidade,
extensibilidade, manutenibilidade e portabilidade. Nessa arquitetura as classes com
propo´sitos comuns sa˜o organizadas em camadas, proporcionando um menor acopla-
mento entre mo´dulos, e encapsulando dentro de cada camada as funcionalidades de
classes com objetivos comuns. O ponto central do modelo de camadas esta´ no fato de
que entre camadas, o fluxo de mensagens flui em uma u´nica direc¸a˜o.
(b) (1 ponto): Qual e´ a responsabilidade da camada de interface? Qual e´ o fluxo de
mensagens dessa camada?
A camada de interface encapsula as classes de comunicac¸a˜o com o mundo exterior,
tendo como responsabilidade modelar as interac¸´ oes com os usua´rios da aplicac¸a˜o.
O fluxo de mensagens dentro da camada de interface flui normalmente entre suas
classes. Pore´m, o fluxo para outras camadas, flui sempre da camada de interface
para a camada de nego´cio, pois, dessa forma se aumenta a modularidade do software
diminuindo a conectividade de classes de camada diferentes.
(c) (1 ponto): No modelo de quatro camadas, em qual situac¸a˜o sa˜o usados os me´todos
de rechamada? Explique seu funcionamento.
Os me´todos de rechamada sa˜o utilizados no modelo de quatro camadas, quando da
comunicac¸a˜o entre a camada de sistema com as demais camadas, em situac¸´ oes
onde e´ necessa´rio, apo´s uma primeira invocac¸a˜o de um me´todo, notificar o me´todo
chamador sobre a ocorreˆncia de um evento. Por exemplo, um me´todo A, pertencente
a uma classe da camada de persisteˆncia, invoca um me´todo B, pertencente a uma
classe da camada de sistema, solicitando que lhe avise em um dado momento sobre
a ocorreˆncia futura de um evento. Sendo assim, o me´todo B da classe da camada de
sistema e´ chamado me´todo de rechamada.
11. (1 ponto EXTRA): Descreva duas caracter´ısticas do modelo de camadas que contribuem
para a manutenibilidade do software.
O modelo de camadas agrupa classes com propo´sitos semelhantes, encapsulando
suas fun-
cionalidades, o que contribui para a modularidade do sistema, reduzindo o acoplamento
entre classes de camadas diferentes. Isso tambe´m traz benef´ıcios para a manutenibilidade
da aplicac¸a˜o, pois em modificac¸o˜es futuras, alterac¸o˜es em uma camada acarretara˜o pouca
ou nenhuma modificac¸a˜o em outras camadas. A portabilidade tambe´m e´ favorecida pois,
caso seja necessa´ria a migrac¸a˜o de plataforma, por exemplo, sera˜o necessa´rias adaptac¸o˜es
somente na camada relacionada. Outra vantagem esta´ na programac¸a˜o, visto que a equipe
de desenvolvimento pode trabalhar em uma camada sem depender das outras, eliminando
a necessidade de ser ter uma parte do sistema pronta para se iniciar o desenvolvimento de
outra.
progmod-TP5-Modulo-VII-gab-2015-1-grad.pdf
Universidade Federal de Minas Gerais
Departamento de Cieˆncia da Computac¸a˜o
Especializac¸a˜o em Informa´tica, Eˆnfase: Ana´lise de Sistemas a` Distaˆncia
Programac¸a˜o Modular
Prof. Mariza A. S. Bigonha
06/05/2015 : Data da Entrega - 25/05/2015 : Data da Devoluc¸a˜o
GABARITO DO EXERCI´CIO 5 - Mo´dulo VII - 10 pontos
Seja preciso. Pesquise. Use as informac¸o˜es das notas de aula sa˜o como refereˆncia. Escreva so-
mente o necessa´rio.
ALGUMAS QUESTO˜ES DESSE EXERCI´CIO PODERA˜O CAIR NA PROVA, PORTANTO
RECOMENDO FAZEˆ-LO COM ATENC¸A˜O.
1. (1 ponto): O princ´ıpio da restric¸a˜o ao acesso discute os conceitos de abstrac¸a˜o e encap-
sulamento. Como esses dois conceitos se relacionam entre si a fim de atingir os objetivos
desse princ´ıpio?
Segundo o material Princ´ıpios de Projeto Orientado por objetos, ”Encapsulac¸a˜o e´ processo
de compartimentalizar os elementos de uma abstrac¸a˜o, a qual e´ realizada por meio de
estruturas e comportamento.”
O encapsulamento esconde os dados de um objeto, que e´ uma refereˆncia a uma determinada
abstrac¸a˜o.
2. (2 pontos): Analise a hierarquia abaixo, referente a um software de biotecnologia:
public class Sequencia { ... }
public class DNA extends Sequencia { ... }
public class Proteina extends Sequencia { ... }
(a) Mostre um trecho de co´digo em Java, refatorando essa soluc¸a˜o para empregar Com-
posic¸a˜o em vez de Heranc¸a.
O modificador private pode ser aplicado ao objeto do tipo Sequencia:
public class DNA {
private Sequencia seq;
public DNA(Sequencia seq) { this.seq = seq; }
}
(b) Analise os pro´s e contras de cada soluc¸a˜o.
Pro´s Composic¸a˜o: Boa encapsulac¸a˜o, objeto e´ encapsulado dentro da classe. Menos
dependeˆncias da implementac¸a˜o dos objetos contidos. Objetos contidos sa˜o acessados
pela classe compositora somente via suas interfaces, garantindo encapsulamento. A
composic¸a˜o e´ vista como caixa-preta.
Contras Composic¸a˜o: Tendeˆncias a´ proliferac¸a˜o de objetos, uso de objetos de forma
descontrolada.
Po´s Heranc¸a: Fa´cil gerar novas implementac¸o˜es, porque reu´so e´ facilitado. Aproveita
metodos e atributos da classe pai, o que gera facilidade para implementar classes fi-
lhas. Reu´so de func¸o˜es polivalentes decorrente do polimorfismo inerente a` estrutura
hiera´rquica de tipos, func¸o˜es podem ser reutilizadas em va´rios mo´dulos.
Contras Heranc¸a: Heranc¸a possibilita violar encapsulac¸a˜o, porque detalhes da super-
classe podem estar expostos na subclasse. O uso de composic¸a˜o leva vantagem neste
aspecto. Subclasses podem ter que ser mudadas quando altera-se sua superclasse,
retrabalho na manutenc¸a˜o de co´digo. A heranc¸a e´ vista como caixa-branca.
3. (1 ponto): Explique dois benef´ıcios obtidos por um software que adere ao Princ´ıpio da
Programac¸a˜o para a Interface.
Aumenta grau de reu´so de classes: Classes podem implementar mais de uma interface, o
que gera reu´so. Facilita composic¸a˜o: objetos contidos podem ser de qualquer classes que
implementa a interface.
4. (1 ponto): Suponha que a classe Calculadora, a seguir, tenha que ser alterada para fun-
cionar em um terminal remoto. Ou seja, essa classe deve usar uma instaˆncia da classe
java.net.Socket ao inve´s de System.out para imprimir o resultado. Em face dessa alterac¸a˜o,
o analista de sistema determinou que ”essa classe viola o Princ´ıpio de Inversa˜o de De-
pendeˆncia e que ela deve ser refatorada”. Voceˆ concorda ou discorda dessa declarac¸a˜o?
Justifique.
public class Calculadora {
private int acumulador;
public Calculadora() { zerar(); }
public void zerar() { acumulador = 0; }
public void somar(int operando) {
acumulador += operando;
}
public void resultado() {
System.out.println(acumulador);
}
}
Para solucionar o problema da classe Calculadora por inversa˜o de dependeˆncia, devemos
criar uma interface que declare um me´todo de impressa˜o, e fazer com que System.out e
java.net.Socket implementem essa interface. Como ambas as classes na˜o esta˜o abertas para
modificac¸a˜o, pois pertencem a biblioteca padra˜o Java, e´ poss´ıvel criar adaptadores dessas
classes para a interface (padra˜o de projeto Adapter). Importante: a classe Calculadora deve
receber uma instaˆncia da interface em seu construtor, ao inve´s de invoca´-la estaticamente,
como esta´ no co´digo mostrado no enunciado.
OUTRA RESPOSTA
Concordo. No exemplo dado Calculadora e´ um abstrac¸a˜o, e depende de System.out. O
ideal seria passar o objeto como paraˆmetro no me´todo, deste modo na˜o iria depender de
nenhuma classe que implemente System.out ou java.net.socket espec´ıficos. O me´todo enta˜o,
ficaria da seguinte forma:
public void resultado(Socket s){}
5. (1 ponto): Como o conceito de abstrac¸a˜o e´ empregado para promover o Princ´ıpio Aber-
toFechado em um software?
Um mo´dulo que promove o princ´ıpio do aberto fechado , so´ pode ser aberto para extenso˜es
e fechado para modificac¸o˜es. As abstrac¸o˜es desenvolvidas no mo´dulo (classes), devem ser
bem constru´ıdas, pois na˜o devem ser alteradas, garantindo assim o fechamento do mo´dulo.
So´ podera´ ser estendida para novas funcionalidades.
6. (2 pontos): A biblioteca padra˜o da linguagem Java conte´m duas classes, java.util.Date
ejava.sql.Date, pertencentes a biblioteca padra˜o da linguagem Java, as quais violam o
Princ´ıpio de Substituic¸a˜o de Liskov. A classe java.util.Date representa um instante
espec´ıfico no tempo, com precisa˜o de milisegundos.
Observe um trecho dessa classe, a seguir:
packagejava.util;
public class Date {
/** Cria uma data a partir de sua representacao em milisegundos
* O valor 0 representa 01/01/1970.
* @see http://pt.wikipedia.org/wiki/Era_Unix
*/
public Date(long date) { /* ... */ }
/**
* Retorna a hora representada por esse objeto Date. O valor
* retornado ´e um n´umero (entre 0 e 23) representando a hora dentro
* do dia que cont^em esse instante de tempo.
*/
publicintgetHours() { /* ... */ }
/**
* Retorna o ano representado por esse objeto Date.
*/
publicintgetYear() { /* ... */ }
}
A classe java.sql.Date, por sua vez, representa uma coluna no banco que dados do tipo
DATE. Esse tipo de coluna armazena apenas informac¸o˜es de data: dia, meˆs e ano. Uma
pequena parte dessa classe e´ destacada a seguir:
packagejava.sql;
public class Date extends java.util.Date {
public Date(long date) {
super(date);
}
@Override public int getHours() {
throw new IllegalArgumentException();
}
}
Sobre as classes java.util.Date e java.sql.Date, RESPONDA:
(a) (1 ponto): Demonstre que a classe java.sql.Date infringe o Princ´ıpio de Substi-
tuic¸a˜o de Liskov.
Quando o me´todo getHours() da classe java.util.Date e´ invocado, ele retorna a hora
representada por este objeto. Quando o me´todo getHours() da classe java.sql.Date
e´ invocado, e´ lanc¸ada uma excec¸a˜o. O princ´ıpio de Liskov esta´ sendo violado neste
ponto,
a po´s-condic¸a˜o na˜o retorna o esperado. A pre´-condic¸a˜o deveria ser mantidade
ou estendida.
(b) (1 ponto): Escreva um pequeno trecho de co´digo em Java que utilize instaˆncias de
ambas as classes para comprovar essa violac¸a˜o.
public class Horario{
long horas = = System.currentTimeMillis();
System.out.println(java.util.Date(horas));
System.out.println(java.sql.Date(horas));
}
O primeiro valor impresso sera´ a hora atual. O segundo comando de impressa˜o
lanc¸a´ra uma excec¸a˜o, lanc¸ado pela func¸a˜o java.sql.date.getHour, porque ele na˜o con-
segue extrair a hora.
7. (1 ponto): A respeito do Princ´ıpio da Segregac¸a˜o de Interfaces, RESPONDA:
(a) O que e´ uma interface polu´ıda?
Sa˜o interfaces na˜o coesas, que sugerem a existeˆncia de mais de um contrato. Seus
servic¸os geralmente sa˜o utilizados por va´rios clientes. A interface polu´ıda se ca-
racateriza quando uma classe e´ obrigada a ter em sua interface um ou mais
me´todos apenas porque uma de suas subclasses precisa deste comportamento.
(b) De que maneira esse tipo de interface pode ser aperfeic¸oada?
O ideal e´ criar uma interface para cada tipo de cliente
8. (1 ponto): No contexto do Princ´ıpio da U´nica Responsabilidade, RESPONDA:
(a) O que e´ responsabilidade de uma classe?
E´ o objetivo da classe, a func¸a˜o que ela desempenha ou representa.
(b) Mostre um exemplo de uma classe, escrita em Java, que viole esse princ´ıpio.
public class Modem{
public void ligar(){...}
public void desligar(){...}
public void enviar(){...}
public void receber(){...}
}
A classe pode ser alterada por motivos independentes. O ideal seria ”quebrar”a classe
em duas: uma com os me´todos ligar() e desligar(), e outra com os me´todos enviar()
e receber().

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais