UNIVERSIDADE DE LISBOA INSTITUTO SUPERIOR TÉCNICO Engenharia de Software LEIC/LETI, 3 o Ano, 2 o Semestre Repescagem do 2 o Teste, 1 de Julho de 2016 Nome: Número: Este teste tem um conjunto de 10 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 e cartão de aluno. Apenas são permitidas folhas de rascunho fornecidas pelos docentes que devem ser devolvidas no final. A utilização de de qualquer aparelho electrónico (tais como telemóveis, calculadoras, etc) implica a anulação imediata do teste. Leia cuidadosamente as perguntas de escolha múltipla e coloque na grelha a letra correspondente à resposta correta para cada pergunta. Por favor, use apenas letras 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. 2. 3. 4. 5. 6. 7. 8. 9. 10. Não preencher. Reservado para a correcção. 11: 12: 13:
Número: Pág. 2/7 Perguntas de escolha múltipla 1. É frequente, durante o desenvolvimento de um sistema de software, que os requisitos do sistema tenham que ser alterados numa fase avançada do desenvolvimento. Isto acontece porque A) Não foram usadas as boas práticas de Engenharia de Software na passagem dos requisitos para a solução. B) O processo de desenvolvimento de software seguido pela equipa não é o mais correcto. C) É comum existir incerteza sobre as reais necessidades do sistema no início do seu desenvolvimento. D) O processo de levantamento de requisitos não validou os requisitos. 2. A rastreabilidade dos requisitos é necessária para: A) Permitir comparar requisitos. B) Permitir que cada requisito possa ter um identificador único. C) Permitir que cada requisito possa ser re-utilizado. D) Permitir aferir os impactos de alterações aos requisitos. 3. O padrão de desenho conhecido como Decorator melhora a métrica de coesão pois: A) Cada decorador tem menos métodos protected do que a solução baseada na herança. B) Cada decorador tem menos responsabilidades por comparação com uma solução baseada na herança. C) Cada decorador passa a implementar comportamentos mais complexo por comparação com uma solução baseada na herança. D) Torna possível a realização de operações de refactoring do código em tempo útil.
Número: Pág. 3/7 4. Em programação por objectos podemos fazer reutilização através de herança e de composição. De acordo com o princípio de desenho da substituição de Liskov : A) A herança deve ser o mecanismo usado para reutilização porque permite substituir instâncias da superclasse por instâncias das subclasses. B) A herança apenas deve ser usada quando a subclasse satisfaz o mesmo contrato da superclasse. C) A composição deve ser usada sempre que pretendemos substituir uma instância de uma classe por uma instância de outra classe que seja de um subtipo da primeira, mas que não herde o comportamento da primeira. D) A herança nunca deve ser usada como mecanismo de reutilização devido às anomalias que pode introduzir. 5. Segundo o princípio do Desenho para Herança (Design for Inheritance): A) Uma classe deve ser sempre desenhada para ser extendida. B) Deve-se impedir a herança de uma classe que não está desenhada para ser extendida. C) Deve promover-se um equilíbrio entre a utilização de herança e delegação. D) Deve promover-se a utilização herança (face à delegação). 6. Pode dizer-se que Refactoring consiste em: A) Alterar os requisitos para o software responder a novas necessidades. B) Alterar a estrutura interna de software através de uma sequência de passos que preservam o seu comportamento observável. C) Alterar a estrutura do software através de uma sequência de passos apoiados por pair-programming. D) Todas as anteriores. 7. O modelo de processo de desenvolvimento Reuse-oriented software engineering A) Pode corresponder à criação de uma object-oriented framework que servirá como a estrutura base para as restantes fases do desenvolvimento. B) Pode ser usado durante a fase de Elaboração do Método Unificado. C) Requer atividade de identificação das possíveis alterações aos requisitos. D) Todas as anteriores. 8. Commercial off-the-shelf (COTS) são: A) Aplicações comerciais que deixaram de ser utilizadas. B) Aplicações comerciais reutilizadas por configuração. C) Aplicações comerciais com uma arquitectura cliente-servidor. D) Aplicações comerciais construídas pela ligação e coordenação de componentes existentes.
Número: Pág. 4/7 9. Sistemas confiáveis são: A) Sistemas imunes a falhas. B) Sistemas de uso geral e muito difundidos. C) Sistemas com mecanismos que evitam ou limitam a perda. D) Sistemas de baixo custo e fáceis de manter. 10. Ao adotar um processo em Cascata deve ter em conta que: A) Não é viável sem requisitos estáveis e de alta qualidade. B) Existir pouco feedback entre as etapas o que resulta na frustração dos programadores. C) Um processo que recorra à prototipagem dá mais feedback. D) Todas as anteriores. 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.
Número: Pág. 5/7 11. (2) Tendo em conta a arquitetura em camadas aplicada no desenvolvimento da aplicação MYDRIVE, altere a camada de serviços da aplicação por forma a concretizar o serviço ListUsers. Este serviço é responsável por devolver o nome, username e máscara de permissões de cada um dos utilizadores do sistema. Este serviço recebe o token do utilizador que realiza o serviço. Solução: No exame seria necessário escrever o código. public class UserDto implements Comparable<UserDto> { private String name; private String uname; private String mask; public UserDto(String name, String uname, String mask) { this.name = name; this.uname = uname; this.mask = mask; public final String getname() { return name; public final String getuname() { return uname; public final String getmask() { return mask; @Override public int compareto(userdto other) { return getuname().compareto(other.getuname()); public class ListUsersService extends MyDriveService { private List<UserDto> res = new ArrayList<UserDto>(); private final long tok; public ListUsersService(long tok) { this.tok = tok; @Override protected void dispatch() throws MyDriveException { Manager.getInstance().getLogin(tok); for (User u: Manager.getInstance().getUserSet()) res.add(new UserDto(u.getName(), u.getuname(), u.getmask()); Collections.sort(res); public List<UserDto> result() { return res;
Número: Pág. 6/7 12. (1,5) 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 ListUsersTest extends MyDriveTest { private long tok; @Override protected void populate() { tok = new Session(Manager.getInstance(), "root", "***").gettoken(); @Test public void success() { ListUsersService s = new ListUsersService(tok); s.execute(); assertequals(s.result().size(), 2); assertequals("root", s.result().get(0).getuname()); assertequals("super User", s.result().get(0).getname()); assertequals("rxwdr-x-", s.result().get(0).getmask()); assertequals("nobody", s.result().get(1).getuname()); assertequals("guest", s.result().get(1).getname()); assertequals("rxwdr-x-", s.result().get(1).getmask());
Número: Pág. 7/7 13. (1,5) 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 imprime apenas a informação dos utilizadores cujos username são indicados como argumentos. Se não forem indicados argumentos, então são impressos todos os utilizadores do sistema. Solução: No exame seria necessário escrever o código. public class UsersCommand extends MyCommand { public UsersCommand(Shell sh) { super(sh, "lu", "list users"); public void execute(string[] args) { ListUsersService lds = new ListUsersService(token()); lds.execute(); if (args.length == 0) for (UserDto dto: lds.result()) print(dto.getuname()+" "+dto.getname()+" "+dto.getmask()); else { int i = 0; Arrays.sort(args); for (UserDto dto: lds.result()) if (args[i].equals(dto.getuname())) { print(dto.getuname()+" "+dto.getname()+" "+dto.getmask()); if (++i >= args.length) break; Matriz das perguntas de escolha múltipla (4 versões): pergunta A B C D 1 C D A B 2 D B D A 3 B A C C 4 B A D C 5 B A D C 6 B A C C 7 D D A A 8 B A D C 9 C D A B 10 D A D A