INSTITUTO SUPERIOR TÉCNICO
Engenharia de Software
LEIC/LETI, 3o Ano, 2o Semestre
2
oTeste, 8 de Junho de 2016
Nome: Número:
• Este teste tem um conjunto de10 perguntas de escolha múltipla, e um conjunto de 3 perguntas de resposta aberta.
• Escreva o seu número em todas as folhas da prova. O tamanho das respostas
deve ser limitado ao espaço fornecido para cada questão. Pode responder a lápis. • Em cima da mesa devem estar apenas: enunciado, material de escrita ecartão de aluno. Apenas são permitidas folhas de rascunho fornecidas pelos docentes que
devem ser devolvidas no final.
• A utilização dede qualquer aparelho electrónico (tais como telemóveis,
calcula-doras, etc)implica a anulação imediata do teste.
Leia cuidadosamente as perguntas de escolha múltipla ecoloque na grelha a letra
correspon-dente à resposta correta para cada pergunta. Por favor, use apenasletras maiúsculas. Se não responder a uma determinada pergunta, marque a resposta com um X.
A classificação das perguntas de escolha múltipla é feita da seguinte forma: uma resposta correta vale 0,5; uma resposta errada vale -0,2; uma pergunta não respondida vale 0. Por isso, no
caso de não saber responder a uma determinada pergunta é preferível deixar a pergunta por responder.Para cada pergunta deve escolher a que considera mais correta.
Respostas às questões de escolha múltipla (componente teórica):
1. 6. 2. 7. 3. 8. 4. 9. 5. 10. Não preencher. Reservado para a correcção.
Perguntas de escolha múltipla
1. Um hipotético pedido para que um sistema “execute rapidamente todas as operações
que sejam solicitadas pelos seus utilizadores”:
⇒ A) Não é um requisito porque não é passível de ser testado para aferir sobre a sua satisfação na fase de validação e verificação de software.
B) Não é um requisito porque não descreve nenhuma funcionalidade que o
sis-tema deva suportar.
C) É um requisito perfeitamente válido, desejável, e aceitável para o sistema. D) Não é um requisito porque está escrito em língua natural.
2. Os requisitos devem ser classificados para ’estabilidade’ e ’prioridade’ porque:
⇒ A) Permite determinar quais os requisitos que devem ser implementados pri-meiro.
B) Só depois de estáveis é que os requisitos podem ser prioritizados. C) Só é necessário concretizar os requisitos estáveis e prioritários.
D) Os requisitos mais prioritários necessitam de ser classificados quanto à
es-tabilidade do código.
3. No padrão de desenho Estratégia (Strategy) qual a afirmação mais correta:
A) Existe uma ligação fraca do Context para as ConcreteStrategy pois o primeiro
depende apenas da interface Strategy.
B) Pode existir uma ligação forte das ConcreteStrategy para o Context pois o
algoritmo pode necessitar de informação específica do Context.
C) Existe coesão forte nas ConcreteStrategy pois agrega todas as
funcionalida-des associadas a cada algoritmo específico. ⇒ D) Todas as anteriores.
4. O princípio do aberto-fechado carateriza-se por:
A) O código ser aberto a alterações durante o desenvolvimento e fechado a
alterações quando entregue ao cliente.
⇒ B) O código ser aberto para a alterações por extensão e fechado para modifica-ções no código já existente.
C) O código ser aberto a alterações devido a novos requisitos e fechado a
alte-rações devido a requisitos já existentes.
D) Após a fase de amadurecimento, o código deve ser aberto a alterações por
programadores experientes e fechado a alterações por programdores inexpe-rientes.
5. Relativamente aos mecanismos de herança e delegação, pode dizer-se que: A) A herança é preferível face à delegação pois é uma forma de reutilização por
caixa-preta (black-box ).
B) A herança é preferível face à delegação pois resulta em menor ligação
(cou-pling).
⇒ C) A delegação é preferível face à herança pois resulta em menor ligação (cou-pling).
D) A delegação é preferível face à herança porque é um mecanismo estático. 6. A refatorização de desenho é uma atividade onde:
A) Se retiram comentários do código.
⇒ B) Se altera a estrutura preservando a funcionalidade.
C) Se identificam as abstrações relevantes no início do desenho. D) Se constroem hierarquias profundas de herança.
7. Uma framework e uma biblioteca de software distinguem-se porque:
A) Uma framework é um desenho sem código e uma biblioteca contém uma
implementação.
B) É mais complicado aprender a utilizar uma biblioteca.
⇒ C) A framework de software define um desenho para os programas que a usam.
D) A biblioteca de software é utilizada por herança. 8. Os custos de reutilização são:
⇒ A) Os custos de procurar, avaliar a adaptar o código potencialmente reutilizável.
B) Os custos de re-escrever todo o código que se pretende reutilizar.
C) As dificuldades em convencer a equipa de gestão a reutilizar em vez de
de-senvolver de origem.
9. Nas regras da programação dependente deve-se:
A) Utilizar pair-programming como forma de evitar dependências.
⇒ B) Reduzir a utilização de construções sujeitas a erro.
C) Realizar primeiro as tarefas com mais dependências.
D) Envolver o cliente nas decisões das tarefas a realizar primeiro.
10. Os modelos de processo assentes na prototipagem não devem ser utilizados para: A) Verificar os requisitos e a viablidade da solução.
⇒ B) Evitar construir um produto final.
C) Evitar que os utilizadores criem falsas expectativas acerca do produto. D) Permitir testar implementações alternativas de um algoritmo.
Perguntas sobre a componente prática
O projeto MYDRIVE desenvolvido durante a execução da disciplina de Engenharia de Software permite a criação e gestão de um sistema de ficheiros transacional hierárquico onde os utilizadores manipulam ficheiros e diretorias.
11. (2) Tendo em conta a arquitetura em camadas aplicada no desenvolvimento da aplicação
MYDRIVE, altere a camada deserviços (e também a de domínio, caso seja necessário)
da aplicação por forma a concretizar o serviço FindFilesByName. Este serviço é respon-sável por devolver, para cada ficheiro encontrado com nome igual ao dado, o caminho para o ficheiro, o username do dono do ficheiro e as permissões do ficheiro. Este serviço recebe o token do utilizador que realiza o serviço e nome a pesquisar.
Solução:
No exame seria necessário escrever o código.
public class FindFileDto implements Comparable<FindFileDto> { private String path;
private String uname; private String perm;
public FindFileDto(String path, String uname, String perm) { this.path = path;
this.uname = uname; this.perm = perm; }
public final String getPath() { return path; } public final String getUname() { return uname; } public final String getPerm() { return perm; } }
public class FindFilesService extends MyDriveService {
private List<FindFileDto> res = new ArrayList<FindFileDto>(); private final long tok;
private final String name;
public FindFilesService(long tok, String name) { this.tok = tok;
this.name = name; }
@Override
protected void dispatch() throws MyDriveException { Manager.getInstance().getLogin(tok);
for (File f: Manager.getInstance().getFileSet())
res.add(new FindFileDto(f.getPath(), f.getUser().getUsername(), f.getPerm()); }
public FindFileDto result() { return res; } }
12. (2) Considere o serviço desenvolvido na questão anterior. Concretize uma classe de teste
que realize um teste completo que permite verificar o bom funcionamento do serviço.
Solução:
No exame seria necessário escrever o código.
public class FindFilesTest extends MyDriveTest { private long tok;
@Override
protected void populate() {
tok = new Session(Manager.getInstance(), "root", "***").getToken(); }
@Test
public void success() {
FindFilesService s = new FindFilesService(tok, ".."); s.execute(); assertEquals(s.result().size(), 3); assertEquals("/", s.result().get(0).getPath()); assertEquals("/home", s.result().get(1).getPath()); assertEquals("/home/root", s.result().get(2).getPath()); } }
13. (1) Considere o serviço desenvolvido na questão 11. Concretize um comando da camada
de apresentação que permite uma utilização correcta deste serviço. O comando não recebe argumentos.
Solução:
No exame seria necessário escrever o código.
public class FindFilesCommand extends MyCommand { public FindFilesCommand(Shell sh) {
super(sh, "find", "find all file with the given name"); }
public void execute(String[] args) {
if (args.length < 1) throw new RuntimeException("Missing arg"); FindFilesService lds =
new FindFilesService(token(), args[0]); lds.execute();
for (FindFileDto dto: lds.result())
print(dto.getPath()+" "+dto.getUname()+" "+dto.getPerm()); }