Linguagem de Programação 4
Projeto Avançado de Software
Lista de Exercícios
O Processo de Desenvolvimento de Software
- Qual é o objetivo principal de um Processo de
Desenvolvimento de Software?
- Qual é diferença entre desenvolver um software com e
sem um processo adequado?
- Nas suas palavras, defina o que significa Software de
Qualidade.
- Descreva brevemente as 6 grandes etapas necessárias ao
desenvolvimento de software de qualidade.
- O que se entende por Deliverables nas etapas do
processo de desenvolvimento de software.
- Comente o que se entende pela frase seguinte: "Os
requisitos devem falar dos problemas e não das
soluções".
- Comente o que se entende pela frase seguinte: "Os
requisitos existem para reduzir o espaço de
solução".
- Os produtos de informática de hoje frequentemente exibem
funcionalidades que claramente sairam da cabeça da
equipe de desenvolvimento. Isso é ruim? É bom? Comente.
- Indique algumas sub-atividades que podem ser utilizadas
na obtenção de requisitos.
- Forneça uma possível estrutura de um documento de
requisitos.
- Escreva um parágrafo típico que poderia fazer parte de
um documento de requisitos com respeito a cada um dos
itens seguintes:
- Sinopse do problema a ser resolvido
- Tarefas ou funções que devem ser providas na
solução
- Como o usuário opera hoje e que problemas ele
enfrenta
- Ambiente típico do usuário que usará o produto
- Facilidade de uso necessária
- Quem utilizará o produto
- Hardware/software alvo para o produto
- Qualidade
- Desempenho
- Segurança
- Compatibilidade com outros produtos/versões e
necessidades de migração
- Necessidades de internacionalização do produto ou
de alguma de suas partes
- Suporte
- Preço da solução
- Documentação
- Uso de padrões
- Aspectos Legais
- Integração com outros produtos
- Packaging
- Quem deve aprovar um documento de requisitos?
- Qual é a importância do documento de direções? Por
que não fornecer a especificação logo?
- Por que um documento de direções deve ser feito por
poucas pessoas?
- Quais são as principais considerações que um documento
de direções deve abordar?
- Escreva um parágrafo típico que poderia fazer parte de
um documento de direções com respeito a cada uma das
considerações do quesito anterior.
- Indique por que cada uma das considerações acima é importante.
Isto é, em que ela afeta a qualidade da solucão final.
- Defina em um parágrafo curto o que um documento de
especificação funcional deve conter.
- O que é Product Creep e por que deve ser
evitado?
- Por que o documento de especificação funcional deve ser
fechado em sincronia com o documento de design de alto
nível?
- Argumente a favor ou contra a afirmação de que
"Todo documento gerado no processo de
desenvolvimento deve ter um dono único".
- Quais são os objetivos principais do documento de design
de alto nível?
- Por que um produto deve ter um único projetista
principal?
- Por que um documento de design de alto nível se
preocupar tanto com as interfaces entre
componentes?
- Justifique a atividade de design de baixo nível.
- O documento de design de baixo nível é preparado por
quantas pessoas?
- Descreva o que um documento de design de baixo nível
deveria conter numa metodologia orientada a objeto.
- O que é code review? Qual é sua importância?
- Quais são os tipos de atividades de teste de software?
Descreva cada atividade em uma ou duas frases.
- Por que existem tantos tipos de testes?
- O que se perde quando testes não são automatizados?
- O que é scaffolding?
- O que um plano de testes de unidade deve conter?
- Como a função main pode ser utilizada em Java para os
propósitos de testes?
- Que fase de testes pretende testar as interfaces entre
módulos?
- Dê um exemplo de uma "função" típica que
seria testada num teste de função.
- Qual é diferença entre teste lógico e teste físico e
qual é a utilidade dessa diferenciação?
- O que um plano de teste de função deve tipicamente
conter?
- Explique a importância de manter um histórico dos erros
descobertos durante os testes numa base de dados.
- Quais tipos de testes podem ser considerados black
box e quais podem ser considerados white box?
- Qual é o motivo principal que explica a utilização de
testes de componentes?
- O que um plano de teste de componente deve conter?
- Como identificar um "componente" na atividade
de teste de componentes?
- O que é um Total System Environment? Por que
testar nessas condições?
- Quem deve executar cada tipo de teste?
- Qual é a diferença entre testes de sistema e testes de
regressão?
- Descreve o que é um teste alfa e como ele deve ser
feito.
- Quem deve ser responsável pela condução de um teste
alfa?
- O que um teste alfa deve testar?
- Descreve o que é um teste beta e como ele deve ser
feito.
- Quem deve ser responsável pela condução de um teste
beta?
- O que um teste beta deve testar?
- O que diferencia um teste alfa de um teste beta?
- O que são as Publicações de um produto?
- O que é um Plano de Publicações?
Introdução à Linguagem de Programação Java
Os exercícios abaixo foram retirados dos capítulos 1 a 4 do
livro Data
Structures and Problems Solving Using Java, Weiss,
Addison-Wesley, 1998.
Capítulo 1: Primitive Java
- Que extensões são usadas para arquivos contendo código
fonte e codigo compilado em Java?
- Descreva os três tipos de comentários utlizados em
programa Java.
- Quais são os oito tipos primitivos em Java?
- Qual é a diferença entre os operadores * e *=?
- Explique a diferença entre os operadores de
incrementação pré-fixados e pós-fixados.
- Descreva os três tipos de laços em Java.
- Descreva todos os usos do comando break. O que é um comando break com rótulo?
- O que é feito pelo comando continue?
- O que é sobrecarga de métodos?
- Descreva a chamada por valor.
- Suponha que b tenha valor
5 e c tenha valor 8. Qual
é o valor de a, b e c
após cada linha no seguinte fragmento de programa:
a = b++ + c++;
a = b++ + ++c;
a = ++b + c++;
a = ++b + ++c;
- Qual é o resultado de true
&& false || true?
- No seguinte fragmento de programa, forneça um exemplo
para o qual o laço for
não seja equivalente ao laço while:
for( init; test; update ) {
statements
}
init;
while( test ) {
statements
update;
}
- Quais são as possíveis saídas do seguinte programa?
public class WhatIsX {
public static void f( int
x ) { /* body unknown */
public static void main(
String [] args ) {
int x = 0;
f( x );
System.out.println( x
);
}
}
- Escreva um comando while
que seja equivalente ao seguinte fragmento for. Por que isso seria útil?
for( ; ; )
statement
- Escreva um programa para gerar as tabuadas de adição e
multiplicação para números de um único dígito (as
tabuadas que alunos do primeiro grau estão acostumados a
ver).
- Escreva dois métodos estáticos. O prmeiro deve retornar
o máximo entre três inteiros e o segundo deve retornar
o máximo entre quatro inteiros.
- Escreva um método estático que receba um ano como
parâmetro e retorne true
se o ano for bissexto e false
caso contrário.
- Escreva um programa para determinar todos os pares de
inteiros positivos, (a, b), tais que a
< b < 100 e (a^2 + b^2 +
1)/(ab) seja inteiro.
- Escreva um método que imprima a representação do seu
parâmetro inteiro como número Romano. Assim, se o
parâmetro for 1998, a saída é MCMLXLVIII.
- Suponha que você queira imprimir números entre
colchetes formatados como segue: [1][2][3],
e assim por diante. Escreva um método que receba dois
marâmetros: howMany e lineLength. O método deve
imprimir números de 1 até howMany
no formato já mencionado, mas não deve imprimir mais do
que lineLength caracteres
numa mesma linha. Ele não deveria iniciar um [ se o ]
correspondente não couber na linha.
- No problema seguinte usando aritmética decimal, cada uma
das dez letras diferentes recebe o valor de um dígito.
Escreva um programa que descubra todas as possíveis
soluções (uma daas quais está mostrada).
MARK |
A=1
W=2 N=3 R=4 E=5 |
9147 |
+ALLEN |
L=6
K=7 I=8 M=9 S=0 |
+16653 |
----- |
|
----- |
WEISS |
|
25800 |
Capítulo 2: References
- Liste as diferenças principais entre tipos de
referência e tipos primitivos.
- Liste cinco operações que podem ser aplicadas a um tipo
de referência.
- Descreva como exceções funcionam em Java.
- Liste as operações básicas que podem ser aplicadas a
strings.
- Se x e y têm valores 5 e 7, respectivamente, qual é sa
saída do seguinte fragmento:
System.out.println( x + ' ' +
y );
System.out.println( x +
" " + y );
- Um checksum é um inteiro de 32 bits que é
obtido pela soma dos caracteres Unicode contidos num
arquivo (permitimos um overflow silencioso,
embora um overflow silencioso seja improvável
se todos os caracteres forem ASCII). Dois arquivos
idênticos possuem o mesmo checksum. Escreva um
programa para calcular o checksum de um arquivo
cujo nome é dado como argumento da linha de comando.
- Escreva um método que retorne true
se String str1 for um
prefixo de String str2.
Não use qualquer uma das rotinas especiais de pesquisa
em strings com exceção de charAt.
- Escreva um programa que imprima na saída o número de
caracteres, palavras e linhas nos arquivos cujos nomes
são dados como argumentos da linha de comando.
- Implemente um programa de cópia de arquivos de texto.
Inclua um teste para ter certeza de que os arquivos fonte
e destino seja diferentes. Você terá que ler um livro
de referência java para aprender como fazer saída para
arquivos.
Capítulo 3: Objects and Classes
- O que significa esconder informação? O que é
encapsulação? COmo Java dá suporte a estes conceitos?
- Explique as seções públicas e privadas da classe.
- Descreva o papel do construtor.
- Qual é o resultado quando uma classe não provê um
construtor?
- O que significa acesso package friendly?
- Como a saída é feita para uma classe ClassName?
- Dê as duas formas de diretivas de importação que
permitem que longPause
seja usado sem ter que mencionar o nome do package Supporting.
- Por que classes não podem ser declaradas como privadas?
- Um cadeado de segredo tem as seguintes
propriedades básicas: o segredo (uma sequência de 3
números) está escondido; o cadeado pode ser aberto ao
fornecer o segredo; e o segredo pode ser alterado, mas
apenas por alguém que saiba o segredo atual. Projete uma
classe com método público open
e changeCombo (mude
segredo) e campos de dados privados que armazenem o
segredo. O segredo deve ser inicializado no construtor.
Desabilite a cópia de cadeados de segredo.
- Escreva uma classe que dê suporte a números racionais.
Os campos devem ser duas variáveis do tipo long, uma armazenando o
numerador e a outra o denominador. Armazene o número
racional sempre na forma reduzida, isto é, com o
numerador sempre não-negativo. Inclua um conjunto
razoável de construtores; os métodos add, subtract,
multiply, e divide; também inclua toString, equals, compareTo (que se comporta como
o método semelhante da classe String).
Tenha certeza que toString
se comporte corretamente caso o denominador seja zero.
- Implemente uma classe Date
simples. Você deve ser capaz de representar qualquer
data de 1 de janeiro de 1800 até 31 de dezembro de 1500;
subtrair datas; incrementar uma data por um número de
dias; e comprar duas datas usando equals e compareTo. Uma data é
representada internamente como o número de dias desde
uma data inicial, que, neste caso, é o início de 1800.
Isto faz com que todos os métodos com exceção dos
construtores e toString
triviais.
A regra para anos bissextos é que um ano é bissexto se
for divisível por 4 e não for divisível por 100 a não
ser que seja divisível por 400. Desta forma, 1800, 1900
e 2100 não são anos bissextos mas 2000 o é. O
construtor deve verificar a validade da data e toString também. Uma data pode
estar errada se uma operação de incrementação ou uma
subtração a deixar fora de faixa.
Quando você tiver terminado a especificação, você
poderá passar à implementação. A parte difícil é a
conversão entre a representação interna e a
representação externa de uma data. O que segue é um
possível algoritmo.
Use dois arrays que são campos estáticos. O primeiro
array, daysTillFirstOfMonth
contém o número de dias até o primeiro dia de cada
mês num ano não-bissexto. Isto é, ele contém 0, 31,
59, 90, e assim por diante. O segundo array, daysTillJan1, contém o número
de dias até o início de cada ano, iniciando com firstYear. Isto é, ele contém
0, 365, 730, 1095, 1460, 1826, e assim por diante já que
1800 não é bissexto mas 1804 o é. Seu programa ode
inicializar este array uma única vez usando um
inicializador estático. Você pode então usar o array
para converter da representação interna para a
representação externa.
- Implemente uma classe de número complexo. Lembre que um
número complexo consiste de uma parte real e uma parte
imaginária. Forneça as mesma operações da classe Rational, quando isso fizer
sentido (por exemplo, compareTo
não faz sentido). Adicione método de acesso para
extrair a parte real e a parte imaginária.
- Implemente uma classe completa IntType
que tenha um conjunto razoavelmente completo de
construtores, add, subtract, multiply, divide, equals, compareTo e toString. Implemente IntType usando um array
suficientemente grande. Para esta classe, a operação
difícil é a divisão seguida de perto da
multiplicação.
Capítulo 4: Inheritance
- Quais membros de uma classe herdada podem ser usados na
classe derivada? Quais membros se tornam públicos para
os usuários da classe derivada?
- O que é composição?
- Explique polimorfismo.
- Explique binding (amarração) dinâmico.
- O que é um método final?
- Considere o programa abaixo para testar a visibilidade:
public class Base {
public int bPublic;
protected int bProtect;
private int bPrivate;
// Public methods omitted
}
public class Derived extends
Base {
public int dPublic;
private int dPrivate;
// Public methods omitted
}
public class Tester {
public static void main(
String [] args ) {
Base b = new Base();
Derived d = new
Derived();
System.out.println(
b.bPublic + " " + b.bProtect + "
"
+ b.bPrivate +
" " + d.dPublic + " "
+ d.dPrivate );
}
}
a. Quais acessos são legais?
b. Coloque main como método
de Base. Que acessos são
legais?
c. Coloque main como método
de Derived. Que acessos são
legais?
d. Como essas respostas mudam se a palavra protected for removida na classe Base?
e. Escreva um construtor de três parâmetros para Base. Em seguida, escreva um
construtor de cinco métodos para Derived.
f. A classe Derived consiste
de cinco inteiros. Quais estão acessíveis à classe Derived?
g. Um método na classe Derived
é passado para um objeto de classe Base.
Quais entre os membros do objeto podem ser acessados pela
classe Derived?
- Qual é a diferença entre uma classe final e outras
classes? Para que classes finais são usadas?
- O que é um método abstrato?
- O que é uma classe abstrata?
- O que é uma interface? Como uma interface difere de uma
classe abstrata? Que membros podem estar numa interface?
- Como são implementados algoritmos genéricos em java?
- Escreva métodos genéricos min
e max, cada um dos quais
aceita dois parâmetros do tipo Comparable.
Então use esses métodos com tipo MyInteger.
- Escreva métodos genéricos min
e max, cada um dos quais
aceita um array do tipo Comparable.
Então use esses métodos com tipo MyInteger.
- Para o exemplo Shape (do
livro) modifique readShape
e main atirando (?) e capturando uma exceção (em vez de
criar um círculo de raio zero) ao detectar um erro de
entrada.
- Modifique a classe Shape
(do livro) para que passe a usar um algoritmo de
ordenação genérico.
- Um SingleBuffer tem os
métodos get e put: o SingleBuffer
armazena um item único e um membro de dados que indica
se o SingleBuffer está
logicamente vazio. Um put
pode ser aplicado apenas a um buffer vazio, e ele insere
um item no buffer. Um get
pode ser aplicado somente num buffer não vazio, e ele
remove e retorna o conteúdo do buffer. Escreva uma
classe genérica para implementar SingleBuffer. Defina uma
exceção para sinalizar erros.
- Reescreva a hierarquia Shape
(do livro) de forma a armazenar a área como membro de
dados e faça com que seja calculado pelo construtor de Shape. Os construtores das
classes derivadas devem calcular uma área e passar o
resultado para o método super.
Faça com que area seja
um método final que apenas retorne o valor deste membro
de dados.
- Adicione o conceito de uma posição à hierarquia Shape (do livro) pela inclusão
de coordenadas como membors de dados. Então acrescente
um método distance.
- Escreva uma classe abstrata para Date
e sua classe derivada GregorianDate.
- Implemente uma hierarquia de pagadores de impostos que
consista de uma interface TaxPayer
e das classes SinglePayer
e MarriedPayer que
implementem a interface.
Sobre o jogo Mancala de Arnow e Weiss
- De várias formas, a implementação do Jogo de Mancala
de Arnow e Weiss tem falhas. Identifique essas falhas e
explique por que são falhas.
- Reescreva o programa do Jogo de Mancala de forma a
remover as falhas.
- Repita para a versão applet.
Aspectos Práticos do Desenvolvimento de Software
- Que características uma boa ferramenta de
testes deve ter?
- Qual é importância de ter várias fases de testes
realizadas fora do ambiente de desenvolvimento?
- Quais testes podem/devem ser realizados pelo pessoal de
marketing?
- Que tipo de informação a Base de Dados de Defeitos
deveria conter?
- O que é feito com a base de dados de defeitos? Para que
serve?
- Por que motivos desenvolver software de acordo com um
cronograma é importante?
- Cite algumas das consequências de não utilizar
cronogramas rigorosos durante o desenvolvimento de
software.
- Por que o cronograma deve obter o compromisso dos
envolvidos?
- O que é um cronograma agressivo?
- Qual é o momento certo de fazer o cronograma de um
projeto? De refazê-lo?
- Quais são os níveis de cronogramas e qual é utilidade
de cada um?
- Para cada nível de cronograma, responda: O que um
cronograma deve conter? Qual é o tamanho de um documento
de cronograma?
- Forneça dicas para ajudar a estimar a duração de uma
atividade.
- O que são buffers de contingência e qual é
sua utilidade?
- Oque é um cronograma de dependência?
- O que é um cronograma de recursos?
- O que é uma checklist de projeto?
- Identifique claramente as etapas principais na
elaboração de um cronograma.
- O que é feito numa reunião de planejamento de
cronograma?
- Cite condições necessárias para que uma mudança de
cronograma seja aceitável.
- Qual é o objetivo maior da artividade de acompanhamento
de projetos?
- Qual deve ser o foco da atividade de acompanhamento?
- Quais são as 4 grandes coisas que devem ser acompanhadas
durante um reunião de acompanhamento?
- Qual deve ser a frequência de acompanhamento de um
projeto?
- Em várias etapas do processo de desenvolvimento, é dito
que determinadas coisas devem ser "colocadas sob
controle de mudança". O que é isso? Por que é
importante?
- O que significa check in e check out no
contexto de controle de mudança?
- Que regras devem ser seguidas ao fazer check in e check
out de fontes? Essas regras devem variar de uma empresa
para outra?
- Que tipo de item deve ser colocado sob controle de
mudança?
- O que é Good Enough Software? Quais são suas
implicações no processo de desenvolvimento de software?
Padrões de Projeto (Design Patterns)
- Qual é propósito de estudar design patterns?
- Descreva os quatro elementos essenciais de um design
pattern?
- O que são design pattern criacionais?
- O que são design pattern estruturais?
- Oque são design pattern comportamentais?
- Explique a afirmação "Program to an interface, not
an implementation".
- Explique a afirmação "Favor composition over class
inheritance".
- Explique através de um exemplo como "Criar um
objeto através da especificação explícita de uma
classe" pode ser causa de mudanças de projeto.
- Explique através de um exemplo como "A dependência
de objetos específicos" pode ser causa de mudanças
de projeto.
- Explique através de um exemplo como "A dependência
de plataformas de hardware e software" pode ser
causa de mudanças de projeto.
- Explique através de um exemplo como "A dependência
da representação ou implementação de objetos"
pode ser causa de mudanças de projeto.
- Explique através de um exemplo como "A dependência
de algoritmos" pode ser causa de mudanças de
projeto.
- Explique através de um exemplo como "Um acoplamento
estreito" pode ser causa de mudanças de projeto.
- Explique através de um exemplo como "A extensão de
funcionalidade através de herança" pode ser causa
de mudanças de projeto.
- Explique através de um exemplo como "A inabilidade
de alterar classes convenientemente" pode ser causa
de mudanças de projeto.
- Explique como design patterns podem ser utilizados
especificamente para melhor projetar programas de
aplicação.
- Explique como design patterns podem ser utilizados
especificamente para melhor projetar toolkits.
- O que são frameworks?
- Explique como design patterns podem ser utilizados
especificamente para melhor projetar frameworks.
- Descreva várias formas de selecionar design patterns
apropriados.
- Qual é a intenção básica do design pattern Composite?
- Repetir a pergunta anterior para os padrões Strategy,
Decorator, Abstract Factory, Bridge, Command, Iterator,
Visitor, Factory Method, Observer, Template Method.
- Quais são as consequências positivas do uso do design
pattern Composite?
- Repetir a pergunta anterior para os padrões Strategy,
Decorator, Abstract Factory, Bridge, Command, Iterator,
Visitor, Factory Method, Observer, Template Method.
- Quais são as consequências negativas do uso do design
pattern Composite?
- Repetir a pergunta anterior para os padrões Strategy,
Decorator, Abstract Factory, Bridge, Command, Iterator,
Visitor, Factory Method, Observer, Template Method.
- Compare os design patterns Composite e Decorator. De que
forma são semelhantes? Diferentes?
- Demonstre como vários design patterns são usados para encapsular
variações.
- Comente a afirmação: "Design patterns criam um
vocabulário comum de projeto".
- Comente a afirmação: "Design patterns ajudam a
documentar do projeto".