INSTITUTO SUPERIOR TÉCNICO
Engenharia de Software
LEIC/LETI, 3o Ano, 2o Semestre2
oTeste, 17 de Junho de 2017
Duração: 90 minutos
Nome: Número:
• Este teste tem um conjunto de8 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çãode qualquer aparelho electrónico (tais como telemóveis,
calculado-ras, 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,6; 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. 5. 2. 6. 3. 7. 4. 8.
Não preencher. Reservado para a correcção.
Perguntas de escolha múltipla
1. Qual dos seguintes modelos de desenvolvimento de software não é adequado a
altera-ções frequentes de requisitos durante o desenvolvimento de software?
A) Rational Unified Process B) Incremental
⇒ C) Waterfall
D) Extreme Programming
2. Qual o padrão arquitetural mais adequado para implementar um compilador de código
Java para Java Byte Code?
A) Model-View-Controller
⇒ B) Pipe and Filter
C) Camadas D) Cliente-Servidor
3. O Unit of Work, um dos padrões estudados sobre Object-Relational Behavioral Patterns A) Garante que cada objeto só é carregado em memória uma única vez
⇒ B) Mantém uma lista de objetos que foram alterados numa transação e coordena a persistência dessas alterações e a resolução de conflitos
C) Só carrega para memória a informação estritamente necessária para a
tran-sação
D) Utiliza uma estrutura Map para guardar os objetos que estão em memória
4. Sobre o Template View em Web Presentation Patterns, qual das seguintes afirmações é
verdadeira?
A) É um objeto que processa o pedido para uma página ou ação específica
numa sítio web
B) É um controlador que processa todos os pedidos num sítio web
⇒ C) Processa e mostra informação através da incorporação de marcadores na página HTML
D) Processa uma página web em duas fases, apresentação lógica e formatação. 5. As ferramentas Cucumber e Dafny são utilizada para verificação de software.
A) Verdadeiro
B) Falso: Dafny é uma ferramenta de validação
⇒ C) Falso: Cucumber é uma ferramenta de validação, que segue a filosofia de test-first.
6. Considere a arquitetura de software do projeto deste ano. Partindo do princípio que
não se deseja fazer programação defensiva em todo o código, onde se deve colocar as verificações das entradas, dado que em cada um dos módulos trabalha uma equipa diferente? ⇒ A) Controladores B) Vistas C) Interfaces D) Domínio 7. Uma framework é:
A) Um conjunto de bibliotecas usadas por um programa
⇒ B) Um desenho reutilizável de módulos para uma família de aplicações
C) Um desenho baseado numa arquitetura de software D) Um conjunto de diagramas de desenho
8. Qual das seguintes não é uma tarefa associada à análise de requisitos?
⇒ A) Verificação da exequibilidade de negócio (business case)
B) Reconhecimento das fronteiras do sistema C) Especificação, modelação e revisão D) Definição da rastreabilidade dos requisitos
Perguntas sobre a componente prática
9. (2.0) Considere o código abaixo que representa o método getCharge da classe Rental do caso
de refatorização da aplicação do arrendamento de videos discutido nas aulas teóricas. Que refatorização se deve aplicar nesta situação? Escreva o código que resulta de se aplicar essa refatorização.
class Rental...
private double getCharge() { double result = 0; switch (getMovie().getPriceCode()) { case Movie.REGULAR: result += 2; if (getDaysRented() > 2) result += (getDaysRented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += getDaysRented() * 3; break; case Movie.CHILDREN: result += 1.5; if (getDaysRented() > 3) result += (getDaysRented() - 3) * 1.5; break; } return result; } Solução:
A refatorização é o Extract Method, isto é mover o método getCharge para a classe Movie.
class Movie...
private double getCharge(int daysRented) { double result = 0; switch (getPriceCode()) { case Movie.REGULAR: result += 2; if (daysRented > 2) result += (daysRented - 2) * 1.5; break; case Movie.NEW_RELEASE: result += daysRented * 3; break; case Movie.CHILDREN: result += 1.5; if (daysRented > 3) result += (daysRented - 3) * 1.5; break;
} return result; } class Rental... double getCharge() { return movie.getCharge(getDaysRented()); }
10. (2.0) Considere os seguintes fragmentos de código. Escreva o código referente às partes TODO A, TODO B e TODO C.
@RequestMapping(value = "/banks/{code}/clients/{id}/accounts", method = RequestMethod.POST)
public String accountSubmit(Model model, @PathVariable String code, @PathVariable String id) { try {
BankInterface.createAccount(code, id); } catch (BankException be) {
// TODO A: implementar a gestão do erro,
// devendo retornar para a vista accounts.html (abaixo) }
return "redirect:/banks/" + code + "/clients/" + id + "/accounts"; }
<h2>
<span th:text="${client.name}">José</span> has
<!-- TODO B: escrever o número de contas associadas ao cliente --> accounts </h2> <h3>Create Account</h3> <p class="text-danger" th:text="${error}">Error</p> <form class="form-inline" th:action="@{/banks/{code}/clients/{id}/accounts (code=${client.bankCode},id=${client.id})}" method="post">
<input class="btn btn-primary" type="submit" value="Create" /> </form>
<br />
<h3>List of Accounts</h3>
<table class="table table-striped"> <thead> <tr> <th>Iban</th> <th>Balance</th> <th>Operations</th> </tr> </thead> <tbody>
<!-- TODO C: implementar a lista de contas, incluindo iban, balance, e link para as operações considerando que
é um GET /banks/{code}/clients/{id}/accounts/{iban}/operations, um ciclo é representado por <tr th:each="...">
e um link é representado por <a th:href="..."></a> --> </tbody>
</table>
// TODO A:
model.addAttribute("error", "Error: it was not possible to create de account"); model.addAttribute("client", BankInterface.getClientDataById(code, id)); return "accounts"; // TODO B: <span th:text="${client.accounts.size()}">2</span> // TODO C: <tr th:each="account : ${client.accounts}"> <td th:text="${account.iban}">123456789</td> <td th:text="${account.balance}">xpto3456</td> <td><a th:href="@{/banks/{code}/clients/{id}/accounts/{iban}/operations( code=${client.bankCode},id=${client.id},iban=${account.iban})}"> Operations </a></td> </tr>
11. (1.2) Preencha o formulário de JMeter e indique a estrutura e conteúdo dos ficheiros de dados
que necessita de definir, considerando que
1. Pretende usar a ferramenta JMeter para fazer sequencialmente 50 depósitos na conta com IBAN BK121 do cliente com identificação 11 do banco com código BK12, e em que cada um dos depósitos possui um valor diferente.
2. O serviço é suportado pelo controlador abaixo e o servidor está a correr em localhost:8080.
3. AccountData possui um atributo amount.
@RequestMapping(value = "/banks/{code}/clients/{id}/accounts/{iban}/deposit", method = RequestMethod.POST)
public String accountDeposit(Model model, @PathVariable String code,
@PathVariable String id, @PathVariable String iban, @ModelAttribute AccountData account)
Solução:
serverName or IP: localhost Port Number: 8080
Path: /banks/BK12/clients/11/accounts/BK121/deposit
Send Parameters With the Request: - amount ${amount}
[$amount é o valor lido do ficheiros de dados.]
Estrutura e conteúdo dos ficheiro com os dados:
1 2 3 ... 50