Baixe o app para aproveitar ainda mais
Prévia do material em texto
Questões comentadas Programação para concursos Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Bons estudos, Grupo Handbook de TI Programação é o processo de criação de programas de computador. Para fazê-lo bem, o programador necessita dominar conceitos como modularização, coesão, aco- plamento, funções, passagens de parâmetros, entre outros. Além disso, um bom programador precisa conhecer os principais paradigmas de programação, como programação estruturada, pro- gramação procedural, programação funcional e, principalmente, a programação orientada a ob- jetos. Como as técnicas e os paradigmas de programação são assuntos obrigatórios em grande parte dos concursos na área de tecnologia da informação, o Grupo Handbook de TI preparou este volume, que traz uma série de questões comentadas sobre programação para você se preparar ainda melhor para os certames de seu interesse. Bons estudos, Grupo Handbook de TI Página 1 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Direitos Autorais Este material é registrado no Escritório de Direitos Autorais (EDA) da Fundação Biblioteca Nacional. Todos os direitos autorais referentes a esta obra são reservados exclusivamente aos seus autores. Os autores deste material não proíbem seu compartilhamento entre amigos e colegas próxi- mos de estudo. Contudo, a reprodução, parcial ou integral, e a disseminação deste material de forma indiscriminada através de qualquer meio, inclusive na Internet, extrapolam os limites da colaboração. Essa prática desincentiva o lançamento de novos produtos e enfraquece a comuni- dade concurseira Handbook de TI. A série Handbook de Questões de TI Comentadas para Concursos � Além do Gabarito é uma produção independente e contamos com você para mantê-la sempre viva. Grupo Handbook de TI Página 2 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Canais de Comunicação O Grupo Handbook de TI disponibiliza diversos canais de comunicação para os concurseiros de TI. Loja Handbook de TI Acesse a nossa loja virtual em http://www.handbookdeti.com.br Serviço de Atendimento Comunique-se diretamente conosco através do e-mail faleconosco@handbookdeti.com.br Twitter do Handbook de TI Acompanhe de perto promoções e lançamentos de produtos pelo nosso Twitter http://twitter. com/handbookdeti Página 3 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 1. Assuntos relacionados: Técnicas de Programação, Modularização de Algoritmos, Banca: CESGRANRIO Instituição: BNDES Cargo: Analista de Suporte Ano: 2008 Questão: 35 Considere o projeto da rotina escrita em pseudo-código, apresentada a seguir. 1. função processar() { 2. // recuperar lista do banco de dados 3. // ordenar lista 4. // atualizar lista 5. // enviar lista via e-mail 6. // gravar lista no banco de dados 7. fim da função } Sabendo-se que o desenvolvedor implementou o algoritmo responsável pelas linhas 2, 3, 4, 5 e 6 completamente no corpo da função apresentada acima, quais são as características deste trecho de código? (a). Alta coesão e baixa modularização. (b). Alta coesão e alto acoplamento. (c). Baixo acoplamento e baixa modularização. (d). Baixa coesão e baixa modularização. (e). Baixa coesão e alta modularização. Solução: A forma natural de solucionarmos problemas complexos é dividi-los em problemas mais simples, aos quais chamamos de módulos. Essa divisão em programação é chamada de mo- dularização. Um módulo é um grupo de comandos, constituindo de um trecho de algoritmo, com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. Deve- mos utilizar módulos de tamanho limitado, pois módulos muito extensos acabam perdendo sua funcionalidade. Cada módulo pode definir as próprias estruturas de dados necessárias para sua execução. A comunicação entre módulos deverá ser feita através de variáveis glo- bais ou por transferência de parâmetros. O objetivo da modularização é aumentar a confiabilidade, legibilidade, manutenibilidade e flexibilidade de um software. Em linguagens procedurais, podemos utilizar dois tipos de ferramentas para fazer a modularização: procedimentos ou funções. A declaração de um procedimento ou função é composta por um cabeçalho e um corpo. O cabeçalho, que contém um nome e uma lista de parâmetros, identifica o procedimento. O corpo contém declarações locais e os comandos do procedimento. Para ativarmos um módulo, fazemos referência a seu nome e indicamos parâmetros atuais. Página 4 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Quando projetamos um algoritmo, devemos construir módulos com os seguintes propósi- tos: alta coesão e baixo nível de acoplamento. Ou seja, o ideal é projetar software de forma que cada módulo encaminhe uma sub-função específica de requisitos e tenha uma interface simples quando visto de outras partes da estrutura do programa. A independência funcional é fundamental para um bom projeto. A coesão mede o quão relacionadas ou focadas estão as responsabilidades da classe ou módulo. Uma classe com baixa coesão faz muitas coisas não relacionadas, ou seja, assume responsabilidades que pertencem a outras classes e leva aos seguintes problemas: difícil de entender; difícil de reusar; difícil de manter; e �delicada� (constantemente sendo afetada por outras mudanças). O acoplamento ou conexão é a interdependência relativa entre módulos, ou seja, o que um módulo conhece sobre o outro. Mudanças em módulos com baixo acoplamento não são refletidas em outros módulos. Podemos classificar um software, em relação ao acoplamento, da seguinte maneira: • baixo acoplamento: quando a interface entre módulos se faz através da passagem de dados; • acoplamento moderado: quando a interface entre os módulos é feita por controle, p.ex., quando o módulo 1 passa o controle para o módulo 2; • acoplamento elevado: quando o módulo está ligado a um ambiente externo ao soft- ware, p.ex., a E/S acopla um módulo a dispositivos, formatos e protocolos de comuni- cação. Ou ainda, módulos que utilizam variáveis globais. De acordo com o algoritmo apresentado, o desenvolvedor não se preocupou com a modula- rização, coesão e acoplamento. Isto é, concentrou todas as funcionalidades em uma única função. Assim, caracterizando o código com baixa modularidade, baixa coesão e alto aco- plamento. Página 5 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 2. Assuntos relacionados: Estruturas de Dados, Árvores Binárias, Árvores AVL, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 26 No projeto de módulos adequadamente estruturados deve-se (a). evitar o baixo acoplamento. (b). evitar escopo de efeito de um módulo fora de seu escopo de controle. (c). evitar a coesão funcional. (d). adotar o acoplamento por conteúdo. (e). adotar a coesão lógica. Solução: Módulo é a parte do sistema responsável por uma tarefa bem definida e que pode ser aco- plado a um sistema para permitir ao mesmo executar a tarefa disponibilizada pelo mesmo. O conceito de módulo é similar ao de uma caixa preta. A função é bem clara. É conhecida a entrada, a saída e a função. Um projeto de módulos visa atingir os seguintes objetivos: • Precisão: um módulo deve fazer exatamente o que se espera dele; • Solidez: capacidade de um módulo manipular corretamente situações inesperadas. Um módulo sólido não propaga erros; • Extensibilidade:módulos devem ser construídos de tal forma que uma nova funciona- lidade possa ser adicionada sem a necessidade de se refazer o serviço; • Facilidade de adaptação: os módulos devem ser de tal forma que possam ser facilmente adaptados a novas utilizações; • Reutilização: os módulos devem ser projetados de tal forma que possam ser utilizados em mais de uma aplicação. Para atingirmos os objetivos acima em um projeto de módulos, os seguintes princípios devem ser seguidos: • Ocultar informações: o funcionamento interno de um módulo deve estar oculto aos outros módulos. Assim, módulos podem utilizar-se de outros módulos e depender destes para realizar as tarefas esperadas sem se preocupar como devem ser realizadas tais tarefas; • Poucas interfaces: um módulo deve interagir com outros o mínimo possível, pois quanto mais interfaces tiverem uns com os outros, mais difícil será a manutenção dos mesmos; • Pequenas interfaces: a interface de um módulo deve precisar somente das informações necessárias para que o mesmo complete a tarefa. Este princípio limita as ligações que um módulo tem com uma aplicação em particular, tornando-o mais fácil de ser reutilizado; • Interfaces explícitas: as interfaces devem ser feitas de forma que todas as informações pertinentes sejam claramente especificadas no código fonte; Página 6 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI • Clareza um módulo deve ser dedicado a uma finalidade bem definida, e a função de- sempenhada pelo módulo não deve gerar nenhum �efeito colateral� inesperado. Uma vantagem da obediência deste princípio é a facilidade de depuração. Dentre os critérios de qualidade de um projeto de módulos se destacam o acoplamento e a coesão. O acoplamento mede o grau de interdependência entre os módulos do diagrama. O que se deseja são módulos de baixo acoplamento para diminuir o máximo possível o efeito em cadeia quando um módulo for alterado. Os tipos de acoplamento são: • Acoplamento de dados: corresponde a comunicação de dados necessária entre módulos. Uma vez que os módulos têm que se comunicar, a ligação de dados é inevitável, e não é crítica desde que mantidas as taxas mínimas. Deve-se tomar cuidado com o chamado dado migrante (um grupo de informações que vagueia pelo sistema), indesejável e sem sentido para a maioria dos módulos pelos quais passa; • Acoplamento de imagem: dois módulos apresentam acoplamento por imagem se eles fazem referência a uma mesma estrutura de dados. Este tipo de acoplamento tende a fornecer mais dados do que o necessário a um módulo; • Acoplamento de controle: dois módulos são acoplados por controle se um passa um grupo de dados (controle) para o outro para controlar sua lógica interna; • Acoplamento comum: dois módulos possuem Acoplamento Comum quando fazem re- ferência a uma área global de dados. Um bom exemplo é a Working Storage Section da linguagem Cobol. Este tipo de acoplamento não é desejável, pois um erro em uma área global pode se propagar por diversos módulos. Além disso, programas com muitos dados globais são de difícil entendimento e fica difícil descobrir que módulos devem ser alterados quando um dado é modificado; • Acoplamento de conteúdo: dois módulos apresentam acoplamento de conteúdo (ou patológico) se um faz referência ou desvia a sequência de instruções para o interior de um outro módulo (GOTO). Tal acoplamento torna o conceito de caixas-pretas sem sentido. Já a coesão mede a intensidade da associação funcional dos elementos de um módulo. Deseja-se módulos altamente coesos, cujos elementos são relacionados uns com os outros. Por outro lado, os elementos de um módulo não devem ser fortemente relacionados com os elementos de outros módulos, pois isto levaria a um forte acoplamento entre eles. Ter certeza de que todos os módulos têm boa coesão é a melhor forma de minimizar o acoplamento. Os tipos de coesão são: • Coesão funcional: um módulo apresenta coesão funcional quando suas funções internas contribuem para a execução de uma e apenas uma tarefa relacionada ao problema; • Coesão sequencial: um módulo apresenta coesão sequencial quando suas funções in- ternas estão envolvidas em atividades de tal forma, que os dados de saída de uma atividade sirvam como dados de entrada para a próxima. Este fluxo estabelece uma sequência de execução das funções, no entanto, não se pode caracterizar o conjunto delas como uma única tarefa. Um módulo com coesão sequencial caracteriza-se por ser de fácil manutenção, porém de baixa reutilização, pois contém atividades que são utilizadas juntas; • Coesão comunicacional: um módulo possui coesão comunicacional quando suas funções internas estão relacionadas por utilizarem as mesmas informações, ou seja, utilizam a Página 7 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI mesma entrada ou mesma saída. Nesta situação o módulo fornece mais informações que o necessário. Módulos com coesão comunicacional e sequencial são semelhantes, pois ambos contém atividades organizadas em torno dos dados do problema original. A principal diferença entre eles é que um módulo sequencialmente coeso opera como uma linha de montagem onde suas atividades são executadas em uma ordem específica. Já em um módulo com coesão comunicacional a ordem de execução não é importante; • Coesão procedural: um módulo possui coesão procedural quando suas funções internas executam atividades diferentes e não correlacionadas, exceto por serem executadas em uma mesma ordem, nas quais o controle flui (e não os dados) de uma atividade para outra. É comum em um módulo com coesão procedural que os dados de entrada e saída tenham pouca relação. É típico também que tais módulos devolvam resultados parciais, tais como: flags, chaves, etc.; • Coesão temporal: um módulo possui coesão temporal quando suas funções internas executam atividades que estão relacionadas apenas com o tempo (as atividades não estão relacionadas entre si). A ordem de execução de atividades é mais importante em módulos procedurais do que em módulos temporais; • Coesão lógica: um módulo possui coesão lógica quando suas funções internas contri- buem para atividades da mesma categoria geral, onde a atividade é selecionada fora do módulo. Desta forma, módulos logicamente coesos apresentam uma interface des- caracterizada; • Coesão coincidental: um módulo possui coesão coincidental quando suas funções não possuem nenhuma correlação entre si, não há uma ordem específica de execução, nem sempre todas as funções são ativadas e a ativação das funções é decidida fora do módulo. As formas de coesão apresentadas acima estão em ordem decrescente de importância para um bom projeto. Ou seja, o ideal é que a coesão funcional seja adotada e funcionando como uma verdadeira �caixa-preta�. A medida que �descemos� a lista acima, vamos adentrando em um enfraquecimento da coesão e, portanto, a uma piora do projeto de módulos. Além do acoplamento e coesão devemos considerar outras diretrizes dentro do projeto tais como Factoring, Divisão de Decisão, Fan-In, Fan-Out, etc. O factoring corresponde a separação de uma função contida em um módulo, passando- a para um novo módulo. Este separação pode ter com objetivo: • reduzir o tamanho do módulo; • obter as vantagens modulares de um projeto top-down, tornando o sistema mais com- preensível e permitindo modificações mais localizadas; • evitar a codificação de uma mesma função em mais de um módulo; • prover módulos de utilização mais genérica; • simplificar a implementação. A fatoração de um módulo grande deve ser efetuada se não diminuir a coesão e não aumentar o acoplamento do módulo original. Uma decisão é constituída de duas partes: o reconhecimento da açãoa ser tomada e a execução desta ação. Deve-se evitar ao máximo a divisão de decisão. A parte referente a execução da decisão deve ser mantida o mais próximo possível da parte referente ao reconhe- cimento, a fim de que a informação reconhecida não tenha que percorrer um longo caminho Página 8 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI para ser processada(dado migrante). O escopo de controle é um conjunto formado por um módulo e todos os seus subor- dinados. Já o escopo de efeito de uma decisão é conjunto de todos os módulos cujo seu procedimento depende da decisão. É importante que o escopo de efeito de uma decisão de um módulo seja um subconjunto do escopo de controle deste módulo. Sempre que esta regra for violada, deve-se elaborar uma nova organização dos módulos com o objetivo de aproximar o reconhecimento da execução. O FAN-OUT corresponde ao número de subordinados imediatos de um módulo. Deve- se limitar o FAN-OUT de um módulo em torno de sete. Para corrigir um alto FAN-OUT pode-se utilizar o factoring de módulos. Já a definição de FAN-IN corresponde ao número de módulos superiores de um módulo. Um alto FAN-IN acarreta reutilização de módulos. Dada as melhores diretrizes para um projeto de módulos, vamos analisar as alternativas da questão. (A) Está errada. Como já foi exposto, o baixo acoplamento é desejável em um bom projeto de módulos. (B) Correta. É importante que um escopo de efeito de uma decisão de um módulo es- teja dentro do seu escopo de controle. (C) Errada. A coesão funcional é a forma de coesão mais importante para um bom projeto, pois consiste em atribuir somente uma tarefa para um determinado módulo para resolução de um problema. (D) Errada também. Ao adotarmos o acoplamento por conteúdo, estaremos ignorando as principais vantagens da modularização como a reutilização e a facilidade de adaptação. (E) Na coesão lógica, um módulo faz um conjunto de funções relacionadas, uma das quais é escolhida através de um parâmetro ao chamar o módulo. Um exemplo abaixo. public void faça(int flag) { switch(flag) { case ON: // passos para tratar de ON break; case OFF: // passos para tratar de OFF break; case FECHAR: // passos para tratar de FECHAR break; case COR: // passos para tratar de COR break; } } Tal tipo de coesão não é desejável para um bom projeto na maioria do casos. A alternativa Página 9 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI E está errada. A solução para obtermos uma melhor coesão é quebrarmos o módulo em módulos diferentes cada qual com a sua função específica. Página 10 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 3. Assuntos relacionados: Projeto de Software, Coesão, Banca: FCC Instituição: TRT 16a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2009 Questão: 42 Dentro do espectro de coesão entre tarefas de um módulo é menos indicado usar a (a). procedimental do que a temporal. (b). funcional do que a temporal. (c). lógica do que a coincidental. (d). comunicacional do que a procedimental. (e). sequencial do que a funcional. Solução: A forma natural de solucionarmos problemas complexos é dividi-los em problemas mais sim- ples, aos quais chamamos de módulos. A modularização é uma ferramenta da programação estruturada, que tem como objetivo aumentar a confiabilidade, legibilidade, manutenibilidade e flexibilidade dos algoritmos. Um módulo é, então, um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. Quando projetamos um algoritmo devemos construir módulos com apenas um propósito (alta coesão), e diminuir ao máximo a interação entre eles (baixo nível de acoplamento). Ou seja, o ideal é projetar software de forma que cada módulo encaminhe uma sub-função específica de requisitos e tenha uma interface simples quando visto de outras partes da es- trutura do programa. A coesão mede a intensidade da associação funcional dos elementos de um módulo. Uma classe com baixa coesão possui funcionalidades não relacionadas, ou seja, uma classe com baixa coesão possui responsabilidades que pertencem a outras classes, e leva a problemas de dificuldade de entendimento, de reutilização e de manutenção. Os tipos de coesão (do melhor tipo para o pior tipo) são: • Funcional: um módulo com coesão funcional contém elementos que contribuem para a execução de uma e apenas uma tarefa relacionada ao problema; • Seqüencial: um módulo seqüencialmente coeso é aquele cujos elementos estão envolvi- dos em atividades tais que os dados de saída de uma atividade servem como dados de entrada para a próxima; • Comunicacional: um módulo com coesão comunicacional é aquele cujos elementos con- tribuem para atividades que usem a mesma entrada ou a mesma saída; • Procedural: módulo cujos elementos estão envolvidos em atividades diferentes e pos- sivelmente não relacionadas, mas nas quais o controle flui de uma atividade para a outra; • Temporal: módulo cujos elementos estão envolvidos em atividades que estão relaciona- das no tempo; Página 11 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI • Lógica: módulo cujos elementos contribuem para atividades da mesma categoria geral, onde a atividade ou as atividades a serem executadas são selecionadas fora do módulo; • Coincidental: um módulo coincidentemente coeso é aquele cujos elementos contribuem para atividades sem relação significativa entre si. O acoplamento mede o grau de interdependência entre os módulos do diagrama. Um alto acoplamento dificulta manutenções no sistema. A seguir, analisamos as alternativas desta questão: (A) ERRADA A coesão procedimental ou procedural é mais indicada para ser utilizada do que a coe- são temporal. (B) ERRADA A coesão funcional é mais indicada para ser utilizada do que a coesão temporal. (C) ERRADA A coesão lógica é mais indicada para ser utilizada do que a coesão coincidental. (D) ERRADA A coesão comunicacional é mais indicada para ser utilizada do que a coesão procedimental. (E) CORRETA A coesão seqüencial é menos indicada para ser utilizada do que a coesão funcional. Página 12 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 4. Assuntos relacionados: Técnicas de Programação, Passagem de Parâmetros, Banca: CESGRANRIO Instituição: BNDES Cargo: Analista de Suporte Ano: 2008 Questão: 36 Observe a rotina abaixo escrita em pseudocódigo. 1. inicio 2. p : inteiro = 20 3. misturar(p,p) 4. imprimir p 5. fim 6. procedimento misturar(a:inteiro, b:inteiro) 7. a = a + (b / 2) � (b / 5) + 14; 8. b = (a / b) - 1; 9. fim da função Considerando-se a linha 1 como o ponto de entrada, e que os parâmetros `a' e `b' da sub- rotina são passados por referência, qual será o valor impresso na linha 4? (a). 0 (b). 1 (c). 19 (d). 20 (e). 40 Solução: Existem vários tipos de passagem de parâmetros e a escolha depende do nosso objetivo. Em uma passagem de parâmetro por valor, as alterações realizadas nos parâmetros dentro da função invocada (parâmetros formais) não refletem nos parâmetros da função invocadora (parâmetros efetivos) correspondente. Nesse caso, os parâmetros são de entrada. Em uma passagem por referência, as alterações realizadas nos parâmetros formais refle- tem nos parâmetros efetivos da função correspondente. Nesse caso, os parâmetros são de entrada e saída. As alterações dos parâmetros são refletidas,pois se altera o valor na me- mória endereçada pelo parâmetro. Na linha 2 do código, a variável p, que é do tipo inteiro, recebe o valor 20. Na linha 3, a função misturar é invocada. Como os parâmetros dessa função são passados por referên- cia, devemos lembrar que qualquer alteração dentro do corpo da função misturar reflete no valor de p. Para essa função, os parâmetros a e b são iguais a p, isto é, a = 20 e b = 20. Vale destacar que qualquer alteração em a é refletida em b, e em b refletida em a e conse- quentemente em p, pois as três variáveis apontam para o mesmo endereço de memória. Página 13 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI No corpo da função misturar, linha 7, o parâmetro a é alterado. O resultado dessa ope- ração é a = 40, e consequente b = 40, pois apontam para mesmo endereço de memória. Na linha 8, o parâmetro b é alterado. O resultado dessa operação é b = 0. Ou seja, o valor de p foi atualizado para 0. Na linha 4, o valor atual de p é 0. Então, o valor impresso de p é igual 0. Vale lembrar que cada linguagem de programação tem suas regras específicas para reali- zar a passagem de parâmetros. Página 14 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 5. Assuntos relacionados: Programação, Estruturas de Dados, Banca: ESAF Instituição: Receita Federal (RF) Cargo: Técnico da Receita Federal - Tecnologia da Informação Ano: 2006 Questão: 21 Analise as seguintes afirmações relacionadas a Noções de Programação: I. Quando uma função é chamada e os parâmetros formais da função copiam os valores dos parâmetros que são passados para ela, sem que ocorra alteração dos valores que os parâmetros têm fora da função, este tipo de chamada de função é denominado chamada com passagem de parâmetros por valor. Isso ocorre porque são passados para a função apenas os valores dos parâmetros e não os próprios parâmetros. II. Uma função que pode chamar a si própria é chamada função recursiva. Um critério de parada vai determinar quando a função deverá parar de chamar a si mesma. Isso impede que a função entre em loop. III. Uma fila é uma lista de informações com operações especiais de acesso. O acesso aos elementos da fila é feito pela extremidade oposta à da inserção, ou seja, o elemento disponível estará sempre na extremidade oposta à da inserção. Esta regra é também conhecida como LIFO (Last In First Out). IV. No desenvolvimento estruturado, uma boa prática de modularização é proporcionar um alto acoplamento entre os módulos, mantendo a dependência lógica e liberdade de comunicação entre eles. Indique a opção que contenha todas as afirmações verdadeiras. (a). II e III (b). I e II (c). III e IV (d). I e III (e). II e IV Solução: Vamos analisar as afirmativas separadamente, pois termos diferentes são utilizados em cada uma. I. CORRETA. Na passagem de parâmetros por valor, a função recebe uma cópia dos argumentos quando é invocada. Ou seja, as alterações de valor nas variáveis que repre- sentam os argumentos não é propagado fora do escopo da função. Já na passagem de parâmetros por referência, são enviadas internamente para a função, as referências dos argumentos que foram passados, e não uma simples cópia. Os valores alterados, neste caso, irão ser efetivados fora do escopo da função. II. CORRETA. Uma função recursiva é uma função que pode invocar a si própria. Em toda função recursiva existem dois passos importantes: o passo básico e o passo re- cursivo. O passo básico é o passo em que o resultado é imediatamente conhecido, já o passo recursivo é o passo em que se tenta resolver um sub-problema do problema inicial. O passo básico é, em si, o critério de parada, pois uma vez que o conjunto de entrada �bate� com o caso básico, a função recursiva não é mais chamada. Página 15 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI III. ERRADA. As filas são estruturas baseadas no princípio FIFO (first in, first out), ou seja, os elementos que foram inseridos no início são os primeiros a serem removidos. É verdadeiro dizer que, neste caso, o acesso ao elemento da fila é feito pela extremidade oposta ao da inserção. O erro está em dizer que a regra utilizada é a LIFO (Last In First Out). A regra LIFO, a qual se refere a afirmativa, é a regra básica da estrutura de dados conhecida como pilha. Na pilha, os dados que foram inseridos por último, serão os primeiros a serem removidos, ou seja, a extremidade de inserção e de deleção é a mesma. IV. ERRADA. Dizemos que o acoplamento é baixo quando uma mudança em um módulo não requererá a mudança em outro módulo. Acoplamento baixo é sinal de um sistema bem estruturado e isso se consegue através de uma modularização bem pensada. O acoplamento baixo pode reduzir o desempenho em relação a um sistema com alto acoplamento. Entretanto, o acoplamento baixo é requerido na maioria dos casos, pois oferece uma manutenabilitadade mais simplificada. Além disso, o acoplamento baixo facilita a coesão elevada. Módulos com alta coesão possuem responsabilidades bem definidas e é bem difícil dividi-las em duas ou mais classes. Dado o exposto, as afirmativas corretas são somente a (I) e (II), logo, a alternativa correta é a letra (B). Página 16 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 6. Assuntos relacionados: Orientação a Objeto, Java, Banca: FCC Instituição: TRT 2a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 31 Em uma hierarquia de classes é possível especificar operações com a mesma assinatura em pontos diferentes da hierarquia. Portanto, essas operações presentes nas classes-filha (a). anulam o comportamento das operações existentes nas classes-mãe. (b). herdam os atributos existentes nas classes-mãe. (c). são composições de alguns atributos existentes nas classes-mãe. (d). complementam o comportamento das operações existentes nas classes-mãe. (e). agregam as operações existentes nas classes-mãe. Solução: Herança de métodos permite a você definir e usar métodos repetidamente em subclasses (classes filhas) sem ter que replicar código. Porém, existem momentos em que mesmo que o método da superclasse (classe pai) seja apropriado para a subclasse, esta freqüentemente necessita customizá-lo, isto é, você deseja que estes métodos tenham um comportamento diferente quando for chamado. Em tais situações, a subclasse pode redefinir o método da superclasse com uma implementação apropriada. Para redefinir um método, tudo que você precisa fazer é criar um método em sua sub- classe com a mesma assinatura (nome, tipo de retorno e lista de parâmetros) que o método da superclasse. E, uma vez que Java executa a primeira definição do método que ele en- contra com a mesma assinatura, isto �esconde� eficazmente o método original existente na superclasse. Por este motivo que a alternativa A é a CORRETA. Devemos citar ainda que, em Java, quando um método da subclasse redefine o da superclasse, o método desta última ainda pode ser acessado a partir da subclasse, bastando simplesmente inserir antes do nome do método a palavra-chave super e um ponto separador (.). Isto evita a duplicação de procedimento em ambos os métodos (o da superclasse e o da subclasse), permitindo que você chame o método original no corpo do método substituído e adicione apenas o que precisa. Página 17 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 7. Assuntos relacionados: Orientação a Objeto, Java, C++, Banca: FCC Instituição: TRT 2a RegiãoCargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 34 As instâncias de uma classe são (a). seus atributos. (b). suas superclasses. (c). suas operações. (d). seus objetos. (e). seus relacionamentos. Solução: Analisemos alternativa por alternativa. (A) ERRADA Atributos são informações individuais que diferenciam um objeto de outro e determinam a aparência, estado, ou outras qualidades do objeto. Eles são definidos por variáveis e po- dem ser considerados análogos a variáveis globais para o objeto inteiro. (B) ERRADA Superclasse é simplesmente a classe que está acima na hierarquia. Somente para lembrar: Java não dá suporte nativo à herança múltipla de implementações (herdar de mais de uma superclasse), ao contrário de C++. No entanto, ainda é possível ob- ter uma herança múltipla virtual, onde você consegue herdar assinaturas de métodos através das interfaces. (C) ERRADA As operações, ou métodos, de uma classe determinam o que as instâncias daquela classe fazem quando o estado do objeto muda ou quando estas instâncias são solicitadas a fazer alguma coisa por outra classe ou objeto. Lembre-se que as operações nem sempre afetam somente um único objeto; objetos se comu- nicam usando métodos também. Uma classe ou objeto pode chamar métodos em uma outra classe ou objeto para comunicar mudanças no ambiente ou para pedir que o objeto altere o seu estado. (D) CORRETA Uma classe é um modelo para múltiplos objeto com características similares. Ela incor- pora todas as características de um conjunto de objetos. Quando você escreve um programa em uma linguagem orientada a objetos, você não define objetos reais, você define classe de Página 18 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI objetos. Por exemplo, você pode ter uma classe Árvore que descreve as característica de todas as árvores (tem folhas e raízes, cresce, produz clorofila). A classe Árvore serve como um modelo abstrato para o conceito de uma árvore � para alcançar e �agarrar�, ou interagir com, ou cortar uma árvore você tem que ter uma instância concreta desta árvore. Naturalmente, uma vez que você tenha uma classe Árvore, você pode criar muitas instâncias de árvores diferentes, e cada instância de árvore diferente pode ter diferentes características (pequena, alta, etc.). Uma instância de uma classe é uma outra palavra para objeto. Se uma classe é uma repre- sentação abstrata de um objeto, uma instância é a sua representação concreta. Portanto não há diferença alguma entre instância e objeto. Objeto é o termo mais geral, mas ambos os termos são a representação concreta de uma classe. (E) ERRADA Como os objetos usualmente necessitam co-operar a fim de alcançar seus objetivos, eles comumente entram em relacionamento uns com outros. Citamos aqui três tipos de relacio- namento: 1. Associação: trata-se do tipo de relacionamento mais importante. Objetos que estão associados co-operam pelo envio de mensagem. Em geral, associação deveria ser usada onde dois objetos não estão conceitualmente relacionados, mas dentro do contexto do problema precisam fazer uso do serviço dos outros. Por exemplo, uma interação na qual um único objeto Empregado é empregado por um único objeto Companhia; 2. Agregação composta: também referenciada como relacionamento �tem um� ou �parte de� ela indica que um objeto (o todo) é composto de outros objeto (as partes). Com a agregação composta o relacionamento existente entre objetos é muito mais forte que com associação. Nela, o todo não pode existir sem suas partes e as partes não podem existir sem o todo, de forma que: apagar o todo implica em apagar as partes; existe um único todo, isto é, as partes não são compartilhadas entre os todos; partes não podem ser �acessadas� fora do todo, isto é, elas são privadas ao todo; uma mensagem destinada a uma parte precisa ser enviada para o todo e posteriormente transmitida para a parte; 3. Agregação compartilhada: nela ainda há o relacionamento todo/parte, mas agora as partes são compartilháveis com outros todos. Como com a agregação composta uma mensagem para a parte necessita ser enviada através do todo. Porém, apagar o todo não implica em apagar as partes. Assim, o acoplamento entre o todo e sua parte é enfraquecido. Página 19 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 8. Assuntos relacionados: Engenharia de Software, Orientação a Objeto, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 27 São dois conceitos utilizados especificamente nos modelos orientados a objetos: (a). fluxo de dados e herança. (b). entidade externa e classe. (c). método e polimorfismo. (d). seleção e processo. (e). depósito de dados e relacionamento. Solução: No paradigma orientado a objeto, pressupõe-se que o mundo é composto por objetos, onde um objeto combina estrutura de dados e comportamento funcional. Neste paradigma, os sistemas são estruturados a partir dos objetos existentes no domínio do problema, ou seja, como os objetos interagem. Este paradigma tem origem no projeto de banco de dados e, normalmente, o modelo de Entidade e Relacionamento (ER) é utilizando como principal ferramenta. A orientação a objeto oferece alguns conceitos para a modelagem de sistemas, entre eles: objetos, atributos, comportamento, identidade, classes e instâncias, abstração, encapsula- mento, modularidade, hierarquia, mensagens, sobrecarga, polimorfismo, interfaces e pacotes. Em sistemas modelados com base no paradigma orientado a objetos, os objetos relacionam- se uns com outros. Vários mecanismos têm sido propostos para a estruturação de classes e objetos, entre eles: ligações e associações, agregações ou composições e generalização e especialização. Algumas linguagens de programação que dão suporte a orientação a objetos: Smaltalk, Perl, Python, Ruby, PHP, ColdFusion, C++, Object Pascal, Java, JavaScript, ActionS- cript, Delphi e C#. A seguir, analisamos as alternativas desta questão: (A) ERRADA O conceito de fluxo de dados está relacionado ao paradigma estruturado, que, basicamente, consiste em um modelo de entrada-processamento-saída, e os dados são considerados sepa- radamente das funções que os transformam. O conceito de herança é utilizado no modelo orientado a objeto. A herança é um meca- nismo que permite criar novas classes a partir de classes já existentes. A classe nova criada, chamada de subclasse, aproveita (herda) todas as características (atributos e operações) da classe existente, chamada de superclasse. As subclasses não estão limitadas somente aos atributos e às operações (métodos) herdados Página 20 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI da superclasse. Elas podem criar novos atributos e métodos a aqueles herdados e podem herdar características de uma ou mais superclasse. Portanto, a alternativa está errada porque o termo fluxo de dados não é um conceito utili- zado no paradigma de orientação a objeto. (B) ERRADA O conceito de entidade externa está relacionado com o Diagrama de Fluxo de Dados da modelagem de sistemas e representa fontes ou destinos de dados de um sistema. Tipica- mente, uma entidade externa pode representar pessoas, sistemas ou empresas. O conceito de classe é utilizado no modelo orientado a objeto. Uma classe descreve um conjunto de objetos com as mesmas propriedades (atributos), mesmo comportamento (mé- todo), mesmos relacionamentos com outros objetos e a mesma semântica. Os objetos que se comportam da maneira especificada pela classe são ditosinstâncias dessa classe. Todo objeto pertence a uma classe, isto é, é instância de uma classe. Portanto, a alternativa está errada porque o termo entidade externa não é um conceito específico do paradigma de orientação a objeto. (C) CORRETA Tanto o conceito de método quanto de polimorfismo é utilizado especificamente no mo- delo orientado a objeto. Logo, alternativa correta. Os métodos ou operações são utilizados para recuperar ou manipular o estado (proprie- dades) de um objeto. O estado de um objeto corresponde ao conjunto de suas propriedades e é representado como atributo. O método é análogo às funções da programação estruturada. A comunicação entre os objetos ocorrem por meio de troca de mensagens. Uma mensa- gem consiste do nome do método e dos argumentos requeridos. A mensagem é utilizada para acessar os atributos de um objeto, podendo alterar o estado do objeto. O polimorfismo está ligado à comunicação entre objetos. Significa que uma mesma mensa- gem enviada a diferentes objetos resulta em um comportamento que dependente da classe do objeto que está recebendo a mensagem. Ou seja, uma mensagem pode ser interpretada de diferentes maneiras, dependendo da classe do objeto receptor e, é o objeto receptor que determina a interpretação da mensagem e não o objeto emissor. Então, o polimorfismo é caracterizado como o fato de uma operação poder ser implementada de diferentes maneiras em diferentes classes. O código abaixo mostra um exemplo de polimorfismo. Note neste exemplo, que apesar do método calcular ter sido chamado duas vezes pelo método mostrarCalculo, o comportamento do objeto varia de acordo com a classe ao qual o objeto pertence (Soma ou Subtração). Aliado ao conceito de polimorfismo há outro conceito que precisar ser explicado: o de so- brecarga. Uma operação é dita polimórfica se ela existe com a mesma assinatura (número e tipo de argumentos e valor de retorno) e os métodos que a implementam conservam uma única semântica. Na sobrecarga, as operações não têm necessariamente a mesma semântica Página 21 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI e não existe necessidade de preservar a assinatura. Na prática, as operações de sobrecarga são, normalmente, uma coincidência na escolha de nomes das operações. public abstract class OpMat { public abstract double calcular(double x, double y); } public class Soma extends OpMat { public double calcular(double x, double y) { return x+y; } } public class Subtracao extends OpMat { public double calcular(double x, double y) { return x-y; } } public class Contas { public static void mostrarCalculo(OpMat operacao, double x, double y) { system.out.println("O resultado é: " + operacao.calcular(x, y); } public static void main( String args[] ) { //Primeiro calculamos uma soma Contas.mostrarCalculo(new Soma(), 5, 5); //O resultado é: 10 Contas.mostrarCalculo(new Subtracao(), 5, 5); //O resultado é: 0 } } (D) ERRADA O conceito de seleção e processo não são, especificamente, utilizados na modelo de ori- entação a objetos. Por exemplo, o conceito de seleção pode estar relacionado à instrução de seleção se-então-senão. Portanto, a alternativa está errada porque os termos seleção e processo não são concei- tos específicos do paradigma de orientação a objeto. (E) ERRADA O conceito de depósito de dados não está relacionado ao modelo orientado a objetos, e Página 22 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI o conceito de relacionamento também não está, especificamente, relacionado modelo orien- tado a objeto. Relacionamento, por exemplo, pode estar relacionado à modelagem de casos de uso e ao modelo de Entidade e Relacionamento. No modelo de orientação a objetos, uma forma de representar os relacionamentos é por meio de associação ou ligações e composição ou agregação. Portanto, a alternativa está errada porque os termos depósito de dados e relacionamento não são conceitos específicos do paradigma de orientação a objeto. Página 23 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 9. Assuntos relacionados: Engenharia de Software, Orientação a Objeto, Atributos e Clas- ses, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 28 O acesso aos atributos e operações das classes somente por intermédio de serviços (mensa- gens) que conhecem suas interfaces é uma proteção garantida (a). pela sub-classe. (b). pela herança. (c). pelo balanceamento. (d). pela agregação. (e). pelo encapsulamento. Solução: No modelo orientado a objetos, a comunicação entre os objetos ocorrem por meio de troca de mensagens. Uma mensagem consiste do nome do método (da operação) e dos argumentos requeridos. A mensagem é utilizada para acessar os atributos de um objeto, podendo alterar o estado desse objeto. A seguir, analisamos as alternativas desta questão: (A) ERRADA Uma subclasse herda todas as características (atributos e métodos) de uma superclasse. A subclasse por herdar as características da superclasse não garante a proteção aos atribu- tos e às operações de uma classe. Logo, alternativa, errada. (B) ERRADA A herança é um mecanismo que permite criar novas classes a partir de classes já exis- tentes. A classe nova criada, chamada de subclasses, herda todos os atributos e métodos da superclasse. A herança não garante a proteção a atributos e operações de uma classe. Portanto, alternativa errada. (C) ERRADA O termo balanceamento não é utilizado no modelo de orientação a objeto. Logo, alter- nativa errada. (D) ERRADA As ligações e associações são formas de representar relacionamentos entre objetos e clas- ses, respectivamente. Uma ligação é uma conexão entre objetos, e uma associação descreve um conjunto de ligações com estrutura e semântica comuns. Todas as ligações de uma as- sociação interligam objetos da mesma classe. No exemplo �o empregado José trabalha no departamento de Informática�, temos um relacionamento entre o objeto empregado José e o objeto departamento Informática. Neste exemplo, uma ligação é representada entre José Página 24 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI e Informática e uma associação é representada entre as classes empregado e departamento. A agregação é um tipo forte de associação, onde um objeto agregado é constituído de vá- rios objetos componentes. Por exemplo, um carro é composto por motor, rodas, carroceria, etc. Um motor, por sua vez, é composto de bloco, válvulas, pistões, etc. A agregação é representada pelo relacionamento �todo-parte� ou �uma-parte-de� no qual os objetos, que representam os componentes de alguma coisa (classe parte), são associados a um objeto representando o todo (classe todo). Na agregação, a classe todo existe independente da classe parte (e vice-versa), não existe uma �ligação forte� entre as duas classes e os objetos da classe todo são independentes da classe parte. A agregação não garante proteção aos atributos e às operações de uma classe. Logo, al- ternativa, errada. (E) CORRETA O encapsulamento consiste na separação dos aspectos externos de um objeto, acessíveis por outros objetos, de seus detalhes internos de implementação, que ficam ocultos dos de- mais objetos. Este mecanismo é utilizado para impedir o acesso direto aos atributos de um objeto, disponibilizando métodos que alterem esses atributos. Com encapsulamento, não há necessidade de saber como as operações encapsuladas estão implementadas, masapenas o que as operações realizam. Se uma operação está encapsulada, apenas o objeto que a define precisa ser modificado. A principal motivação para o encap- sulamento é facilitar a reutilização de códigos. A utilização de encapsulamento é possível garantir a proteção aos atributos e as operações das classes. Portanto, alternativa correta. Página 25 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 10. Assuntos relacionados: Engenharia de Software, Orientação a Objeto, Associação entre Classes, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 29 Na associação entre classes, o número de instâncias de uma classe que pode se relacionar com outra é definido (a). unicamente pela quantidade de objetos contidos na classe-mãe. (b). nas operações das classes. (c). nos atributos das classes. (d). pela multiplicidade. (e). pela quantidade de características mutuamente herdadas. Solução: Relacionamentos são representações estáticas que modelam associações entre objetos. Cada classe desempenha um papel na associação, e para cada papel é possível especificar a mul- tiplicidade (cardinalidade) de uma classe, que indica quantos objetos de uma classe podem estar associados a um objeto de outra classe. Em geral, a multiplicidade indica a fronteira inferior e superior para os objetos participantes de um relacionamento. Por exemplo, em uma empresa, um empregado está lotado em um departamento e, op- cionalmente, o empregado pode ser chefe do departamento. Por sua vez, um departamento pode ter vários empregados lotados, mas apenas um chefe. No relacionamento empregado e departamento, um empregado tem um e somente um departamento. No relacionamento departamento e chefe, um departamento possui um e somente um chefe. Neste exemplo, mostramos o tipo de multiplicidade um para um, mas existem outros, como: zero ou um, um para muitos, zero ou muitos, muitos para muitos, etc. A seguir, analisamos as alternativas desta questão: (A) ERRADA Os objetos são instâncias de uma classe e não estão contidos na classe, e também não tem nenhuma relação com a multiplicidade de relacionamento de uma classe. Logo, alter- nativa errada. (B) ERRADA As operações de uma classe são utilizadas para recuperar ou manipular o estado (proprieda- des) de um objeto, e não para especificar relacionamento entre classes. Portanto, alternativa errada. (C) ERRADA Os atributos definem as propriedades de um objeto, e não são utilizados para especificar Página 26 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI relacionamento entre classes. Logo, alternativa errada. (D) CORRETA O número de instâncias que pode se relacionar com outra é definido pela multiplicidade ou cardinalidade, conforme explicado anteriormente. Portanto, alternativa correta. (E) ERRADA A herança é um mecanismo para modelar similaridades entre classes, e por meio dela, é possível tornar explícitos atributos e serviços comuns em uma hierarquia de classes. A he- rança não é utilizada para especificar o número de instâncias em um relacionamento entre classes. Logo, alternativa errada. Página 27 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 11. Assuntos relacionados: Engenharia de Software, Orientação a Objeto, Relacionamentos entre Classes, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 30 São dois tipos de relacionamento todo-parte: (a). agregação e composição. (b). generalização e composição. (c). generalização e especialização. (d). composição e dependência. (e). especialização e agregação. Solução: Vários tipos de relacionamento têm sido propostos para estruturar classes e objetos na orien- tação a objeto, entre eles: associação, composição, agregação, generalização e especialização. As ligações e associações são formas de representar relacionamentos entre objetos e clas- ses, respectivamente. Uma ligação é uma conexão entre objetos, e uma associação descreve um conjunto de ligações com estrutura e semântica comuns. Todas as ligações de uma as- sociação interligam objetos de mesma classe. No exemplo �o empregado José trabalha no departamento de Informática�, temos um relacionamento entre o objeto empregado José e o objeto departamento Informática. Neste exemplo, uma ligação é representada entre José e Informática e uma associação é representada entre as classes empregado e departamento. A composição e a agregação são um tipo forte de associação, onde um objeto agregado é constituído de vários objetos componentes. Por exemplo, um carro é composto por mo- tor, rodas, carroceria, etc. Um motor, por sua vez, é composto de bloco, válvulas, pistões, etc. A agregação e a composição são representadas pelo relacionamento �todo-parte� ou �uma-parte-de� no qual os objetos, que representam os componentes de alguma coisa (classe parte), são associados a um objeto representando o todo (classe todo). Na agregação, a classe todo existe independente da classe parte (e vice-versa), não existe uma �ligação forte� entre as duas classes e os objetos da classe todo são independentes da classe parte. Por outro lado, na composição, existe uma �ligação forte� entre a classe todo e a classe parte e os objetos da classe parte são dependentes da classe todo. Um exemplo de agregação é a relação entre a classe todo Apartamento e a classe parte Garagem. Um exemplo de composição é a relação entre a classe todo Edifício e a classe parte Apartamento. Muitas vezes, um conceito geral pode ser especializado, adicionando novas características. Por exemplo, no conceito de estudantes, há características que são intrínsecas a quaisquer estudantes, e é possível especializar este conceito para mostrar as especificidades de subtipos de estudantes, tais como estudantes do 1 o grau, do 2 o grau, de graduação e pós-graduação. De maneira inversa, é possível extrair um conjunto de conceitos, características comuns que, quando generalizadas, formam um conceito geral. Por exemplo, ao avaliarmos o conceito que temos de carros, motos, caminhões e ônibus, podemos notar que esses possuem carac- terísticas comuns que podem ser generalizadas em classe mais geral. O primeiro exemplo é Página 28 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI de especialização e o segundo exemplo é de generalização. A generalização permite definir, a partir de um conjunto de classes, uma classe mais geral contendo todas as características comuns entre esse conjunto de classes. A especialização é uma operação inversa, isto é, a partir de uma classe geral, a especialização defini um número de subclasses, explicitando as diferenças entre as novas subclasses. Com a especialização e a generalização é possível capturar similaridades entre classes, dispondo-as em hierarquias de classes. De acordo com o explicado anteriormente, os tipos de relacionamento todo-parte são a agregação e a composição. Portanto, alternativa correta é a (A). Página 29 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 12. Assuntos relacionados: Engenharia de Software, Orientação a Objeto, Herança, Banca: FCC Instituição: TRT 18a Região Cargo: Analista Judiciário - Tecnologia da Informação Ano: 2008 Questão: 31 Em um diagrama de classes, considere que Seguridade e Imóveis herdam características de Ativos. A classe ItemSuportado é super-classe de Imóveis mas não de Ativos. Nesse cenário, o relacionamentogeral em que se envolve Imóveis caracteriza-se por (a). ocultação. (b). herança múltipla. (c). dependência. (d). polimorfismo. (e). composição. Solução: A herança é um mecanismo que permite criar novas classes a partir de classes já existentes, aproveitando-se das características existentes na classe a ser estendida. Com a herança é possível criar classes derivadas (subclasses) a partir de classes bases (superclasses). As subclasses herdam todas as características de suas superclasses, como suas variáveis (estado) e seus métodos (comportamento). Entretanto, as subclasses não estão limitadas ao comportamento herdado de sua superclasse. As subclasses podem adicionar variáveis e métodos a aqueles herdados. Quando uma subclasse herda características de uma única superclasse, tem-se herança sim- ples. Quando uma classe é definida a partir de duas ou mais superclasses, tem-se herança múltipla. É importante observar, no entanto, que na herança múltipla podem ocorrer dois problemas: colisão de nomes herdados a partir de diferentes superclasses e a possibilidade de herança repetida. A colisão quando uma classe C herda de duas classes A e B, sendo que A possui um atributo de mesmo nome que na classe B. Assim, como será a característica desse atributo na classe C. A herança repetida ocorre quando a classe D herda das classes B e C, que por sua vez herdam da classe, isto é, a classe D herda, indiretamente, duas vezes da classe A. No enunciado desta questão, temos um exemplo de hierarquia entre classes. A Figura 1 ilustra a herança das classes Seguridade, Imóveis, Ativos e ItemSuportado. Figura 1: herança entre as classes. Página 30 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI A classe Ativos é superclasse das classes Seguridade e Imóveis, isto é, Seguridade e Imó- veis são subclasses de Ativos. A classe Imóveis também é subclasse da superclasse Item- Suportado. A subclasse Imóveis herda características das classes Ativos e ItemSegurado, caracterizando uma herança múltipla. Portanto, a alternativa correta é a (B). Página 31 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 13. Assuntos relacionados: Programação, Orientação a Objeto, Tipos de Métodos, Banca: ESAF Instituição: Controladoria-Geral da União (CGU) Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de Sistemas de Informação Ano: 2008 Questão: 21 Com relação aos conceitos de programação orientada a objetos, é correto afirmar que (a). métodos abstratos são aqueles que não devem ser redefinidos em classes derivadas, devem ser herdados tal como foram definidos. (b). métodos estáticos são aqueles que, ao serem executados, não acessam atributos de instância da classe. (c). métodos finais, também conhecidos como finalizadores ou destrutores, são chama- dos na destruição de uma instância. (d). métodos construtores são métodos chamados sobre um objeto quando ele é criado. Em Java, os construtores têm o mesmo nome da classe da qual são membros e o tipo retornado por eles é especificado na sua definição. (e). métodos de classe são aqueles que executam operações que afetam objetos indivi- duais da classe. Solução: Criado por Alan Kay (autor da linguagem de programação Smalltalk), o termo Programa- ção Orientada a Objetos diz respeito a um paradigma de análise, projeto e programação de software baseado na interação entre diversas unidades chamadas de objetos. A ideia funda- mental é simular o mundo real através de programas de computador. Os objetos interagem entre si através do envio de mensagens, sendo que o programador deve especificar quais são as mensagens que cada objeto pode receber e que ações realizar ao receber mensagens específicas. Os objetos, instâncias de classes, possuem métodos cujos acessos podem ser (re)definidos por modificadores de acesso. Em Java, esses modificadores podem ser private, protected, public e static. Quando aplicado a um método, o modificador de acesso private indica que ele só pode ser acessado de dentro da classe que o criou, característica chamada de encapsulamento. Assim, uma classe que herde de uma superclasse com métodos �privados� não conseguirá utilizá-los diretamente. O modificador protected indica que o método apenas poderá ser acessado dentro do pacote em que estiver contida sua classe. Já o modificador public indica que o método pode ser acessado em qualquer lugar e a qualquer momento da execução do programa. Por fim, o modificador static indica que o método �estático� deve ser acessado diretamente na classe e não em suas instâncias, ou seja, ele define métodos de classe em vez de métodos de instância. Em conjunto com os modificadores de acesso, podem ser utilizados os modificadores abstract e final. O primeiro, serve para declarar métodos abstratos, isto é, métodos que deverão ser implementados nas subclasses. O segundo, indica que o método não pode ser alterado no decorrer do processamento (constante). Página 32 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Os métodos construtores são métodos especiais executados no momento da criação de um objeto. Não possuindo valor de retorno, representam uma oportunidade de inicializar dados de forma organizada e sempre têm o nome da classe à qual pertencem. Paralelamente, os métodos destrutores têm o objetivo de �destruir� o objeto e devolver ao sistema a memória alocada. Relativamente à questão, o item a) apresenta uma afirmação contrária à teoria, já que os métodos abstratos devem ser definidos nas classes derivadas através de herança. O item c) busca confundir o candidato ao associar os termos destrutores e finalizadores ao modificador final, insinuando que este último tenha a função de finalizar (destruir) a instância de uma classe. O item d) expõe uma teoria parcialmente correta sobre construtores, exceto pelo fato de afirmar que tais métodos possuem valor de retorno. O item e) inverte as definições de método de classe e método de instância, afirmando que o primeiro possui o comportamento do segundo. O item b) faz uma afirmativa que está de acordo com a teoria exposta, haja vista que os métodos estáticos não acessam atributos de instâncias (objetos) da classe, mas sim atributos da classe, sendo a resposta para a questão. Página 33 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 14. Assuntos relacionados: Programação, Orientação a Objeto, Encapsulamento, Herança, Polimorfismo, Abstração, Banca: ESAF Instituição: Controladoria-Geral da União (CGU) Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de Sistemas de Informação Ano: 2008 Questão: 22 A programação orientada a objetos é baseada em diversos conceitos, tais como encapsula- mento, herança, polimorfismo e abstração. Com relação a esses conceitos, é correto afirmar que (a). o conceito de encapsulamento é alcançado por meio da definição da visibilidade pública aos atributos e métodos. (b). herança é um mecanismo que permite que uma classe herde todo o comportamento e os atributos de outra classe. Em Java, pode-se implementar tanto a herança única quanto a herança múltipla. (c). interface pode ser considerada como a forma com que um objeto se apresenta para outros, no que diz respeito aos seus atributos e métodos. Em Java, uma mesma classe não pode implementar mais de uma interface. (d). polimorfismo é o uso de um mesmo nome para identificar diferentes implemen- tações dos métodos. Seu uso é comum na definição de construtores, em que os mesmos podem ser implementados em diferentes versõespara as diferentes formas de se instanciar a classe. (e). para uma classe ser considerada abstrata, todos os seus métodos devem ser abs- tratos. Em Java, para se definir uma classe abstrata deve-se utilizar a palavra chave �abstract� no início de sua declaração. Solução: (A) INCORRETA O encapsulamento permite esconder os detalhes funcionais de uma classe a objetos que podem enviar mensagens para ela. E, em linguagens de programação, pode significar duas coisas distintas: • Um mecanismo de uma linguagem de programação para restrição de acesso aos com- ponentes de um objeto; • Uma construção da linguagem que facilita o agrupamento de dados com métodos que operam naqueles dados. Como forma de restrição de acesso, seu propósito é o de manter a integridade de um objeto pela prevenção de que usuários possam alterar seu estado interno, pois existe a possibilidade dessa modificação levar o objeto a um estado inválido. No contexto da linguagem Java, há três palavras-chave explícitas para implementação da restrição de acesso (os especificadores de acesso): public, private e protected. Quando a visibilidade pública (public) é definida para algum elemento, isso significa que Página 34 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI qualquer outro objeto de outra classe é capaz de acessar esse elemento. Já quando a palavra- chave private é usada, é definido que apenas o implementador da classe (e a própria classe) possui acesso aos membros privados. Qualquer cliente que tentar acessar um membro pri- vado receberá um erro de compilação. A palavra-chave protected, por sua vez, funciona de maneira semelhante à private, exceto que qualquer classe que herde da classe original também terá acesso aos membros protegidos. Portanto, apesar da definição da visibilidade de membros de uma classe fazer parte da implementação do encapsulamento, o uso de apenas a visibilidade pública não garante en- capsulamento. (B) INCORRETA É verdade que a herança permite que uma classe herde o comportamento e os atributos de outra classe. No entanto, não é verdade que com ela é possível herdar todos os com- portamentos e atributos, pois, como discutido na alternativa anterior, a visibilidade privada impede que subclasses herdem quaisquer características por ela afetadas. Outra informação importante é que não existe forma direta de implementar herança múltipla em Java. Uma forma de contornar essa restrição, no entanto, é através do uso de interfaces. (C) INCORRETA A parte inicial da alternativa, �interface pode ser considerada como a forma com que um objeto se apresenta para outros, no que diz respeito aos seus atributos e métodos�, está correta. Outras formas de compreender uma interface é como a especificação de um proto- colo para comunicação entre classes ou como um contrato de comportamento entre as classes. Em Java, quando uma interface é definida, a palavra-chave interface deve ser usada. Já quando ela é implementada, a classe que a implementa deve usar a palavra-chave imple- ments. Como uma interface não possui implementação, apenas especificação, não há nada que impeça a combinação de interfaces. Isso, aliás, permite dizer �uma coisa x é um a, um b e um c�, através da implementação de diversas interfaces. Como no exemplo abaixo (retirado do capítulo 8 do livro Thinking in Java, revisão 4.0): interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } class ActionCharacter { public void fight() {} } Página 35 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() {} public void fly() {} } public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // O trata como CanFight u(h); // O trata como CanSwim v(h); // O trata como CanFly w(h); // O trata como ActionCharacter } } (D) CORRETA A definição está correta. Uma vantagem do polimorfismo é que ele permite outra forma de separação entre interface e implementação. Pois desacopla o que do como. (E) INCORRETA Em Java, para uma classe ser considerada abstrata é necessário que um ou mais méto- dos dessa classe seja definido como abstract. Além disso, é necessário que a própria classe seja definida como abstract, pois em caso contrário o compilador não a compilará. Ainda em classes abstratas, quando uma subclasse de uma classe abstrata é definida, se não houver definição dos métodos abstratos da classe pai, a subclasse também será conside- rada abstrata e, portanto, não poderá ser instanciada. Página 36 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 15. Assuntos relacionados: Orientação a Objeto, Atributos e Classes, Banca: ESAF Instituição: Receita Federal (RF) Cargo: Técnico da Receita Federal - Tecnologia da Informação Ano: 2006 Questão: 24 Analise as seguintes afirmações relacionadas à Programação Orientada a Objetos: I. Em um Programa Orientado a Objetos as instâncias de uma classe armazenam tipos diferentes de informações e apresentam comportamentos distintos. II. Em uma Aplicação Orientada a Objetos podem existir múltiplas instâncias de uma mesma classe. III. Em Programação Orientada a Objetos deve existir um e somente um objeto de uma mesma classe. IV. Os serviços que podem ser solicitados a um objeto são definidos pelos métodos. Indique a opção que contenha todas as afirmações verdadeiras. (a). II e IV (b). II e III (c). III e IV (d). I e III (e). I e II Solução: Para responder essa questão, examinaremos cada uma das afirmações, concluindo se são verdadeiras ou faltas para, então, apresentar a alternativa correta. Como conceitos como classe e objeto são discutidos nessa questão, convém defini-los. �Uma classe é uma 'planta' de um objeto. Quando um objeto é instanciado, uma classe é usada como base descritiva do objeto a ser construído.� As classes podem ser compreendidas como modelos para objetos e, portanto, uma classe é usada para criar um ou mais objetos. Essa planta descreve o estado e comportamento que todos os objetos da classe compartilham. Fonte: The object-oriented thought process, Matt A. Weisfeld Um objeto é uma instância específica de uma classe. Por exemplo, uma bicicleta especí- fica é um objeto. No entanto, foi necessário usar uma �planta� para construí-la: uma classe. A Figura 2 abaixo exemplifica o relacionamento entre classes e objetos, em que um modelo de biscoito (classe) é usado para cortar uma massa e gerar biscoitos (objetos). Página 37 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI Figura 2: exemplo de relacionamento entre classes e objetos. Afirmação I Sendo uma classe uma planta ou modelo a ser seguido, é natural que objetos de uma mesma classe possuam características semelhantes e, portanto, essa afirmativa é incorreta. Como exemplo, considere o seguinte código Python que define a classe �Person�: class Person: def __init__(self, name, address): self.name = name self.address = address def __repr__(self): return "Hi, I am %s and live at %s." % (self.name, self.address) Ao instanciar dois objetos, por exemplo, yakko e root com o código: yakko = Person("Yakko", "WB Tower") root = Person("Charlie Root", "UNIX") Vemos que eles exibem comportamento semelhanteao solicitarmos que seja impressa sua representação: >>> print yakko Hi, I am Yacko and live at WB Tower. >>> print root Hi, I am Charlie Root and live at UNIX. Além disso, ao listarmos o conteúdo desses objetos, vemos que eles possuem os mesmos atributos: Página 38 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI >>> print dir(yakko) ['__doc__', '__init__', '__module__', '__repr__', 'address', 'name'] >>> print dir(root) ['__doc__', '__init__', '__module__', '__repr__', 'address', 'name'] Confirmando que essa afirmação é incorreta. Afirmação II Como exemplificado na discussão da afirmação anterior e na introdução desta questão, vi- mos que uma mesma classe, �Person�, possuía duas instâncias, �yakko� e �root�, confirmando que é possível haver múltiplas instâncias de uma mesma classe. Portanto, essa afirmação é verdadeira. Afirmação III Essa afirmação diz o oposto da anterior (II). Como a afirmação II está correta, esta está, consequentemente, incorreta. Afirmação IV Em orientação a objetos, um método é uma função associada a uma classe ou a um ob- jeto. Em Java, os métodos são criados como parte de uma classe e podem ser chamados somente por objetos e o objeto deve ser capaz de realizar a chamada ao método. Os métodos determinam as mensagens que um objeto pode receber, ou os serviços providos pelo objeto. [1] Pela descrição anterior, vemos que essa afirmativa está correta. [1] Thinking in Java, Bruce Eckel. Discussão Como vimos, as afirmações II e IV estão corretas e, portanto, a alternativa a é a que responde corretamente a esta questão. Um breve comentário adicional é que, ao perceber que a afirmativa II está correta e a III é seu oposto, é possível concluir que a alternativa a é a que responde corretamente, mesmo sem saber se a afirmação IV está correta. É importante sempre ficar atento a esse tipo de situação para explorá-la sempre que possível. Página 39 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 16. Assuntos relacionados: Programação, Orientação a Objeto, Banca: ESAF Instituição: Receita Federal (RF) Cargo: Técnico da Receita Federal - Tecnologia da Informação Ano: 2006 Questão: 25 Na Programação Orientada a Objetos podem-se definir as visibilidades dos métodos e atri- butos. Quanto a essa característica é correto afirmar que (a). o acesso aos atributos e aos métodos privados só pode ser feito a partir dos métodos membros da classe. (b). os métodos protegidos podem ser acessados a partir dos métodos de qualquer classe, desde que instanciada na mesma aplicação. (c). os métodos públicos e os atributos protegidos só podem ser acessados a partir dos métodos da própria classe ou de classes derivadas. (d). os métodos privados e os atributos protegidos podem ser acessados a partir dos métodos de qualquer classe. (e). o acesso aos atributos privados e aos métodos públicos só pode ser feito a partir dos métodos membros da classe. Solução: Na orientação a objetos, existe o conceito de abstração, que é a habilidade de extrair somente o que é necessário em um contexto específico. Isso simplifica a programação, pois diminui a complexidade. Mesmo assim, quando um programa cresce demais, alguns problemas co- meçam a surgir, principalmente, em relação à clareza e à manutenção que deve ser dada ao código. O conceito de encapsulamento está diretamente ligado com o conceito de abstração. Num dado objeto, somente interessa ao cliente, as funções que ele executa e não a implementação. A interface descreve as operações que o objeto pode executar e define o que é acessível aos outros objetos. Já outras informações, como a implementação, fica encapsulada e só é visível ao próprio objeto. A visibilidade de métodos ou atributos é utilizada na definição da interface e especifica a maneira pela qual os atributos e os métodos da classe podem ser acessados. Na linguagem de programação mais famosa da atualidade, Java, os atributos ou métodos podem ser públi- cos, privados ou protegidos. Os modificadores de acesso implementam a visibilidade no Java. Os atributos públicos (public), além de poderem ser acessados pelos métodos da própria classe, os atributos públicos podem ser acessados por métodos de outras classes. Os atribu- tos são uma má prática em orientação a objetos, pois violam o conceito de encapsulamento. Só devem ser utilizados em casos excepcionais. Os atributos privados (private) só podem ser acessados por métodos da classe. É uma boa prática que a maioria dos atributos seja privada. Os atributos protegidos (protected) podem ser acessados por métodos da classe em que foram declarados e, além disso, em subclasses desta classe e, ainda, em classes que Página 40 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI fazem parte do mesmo pacote (package) da classe onde houve a declaração do atributo pro- tegido. Os métodos públicos podem ser chamados de qualquer classe. Os métodos públicos são aqueles que realmente definem a interface da classe para que ela possa ser acessada por outros objetos. Os métodos privados só podem ser acessados a partir de métodos declarados na classe e são úteis quando é necessário definir trechos de código que precisam ser executados a partir de mais de um método da classe, sem que seja necessário fornecê-los para outras classes. Os métodos protegidos podem ser invocados por métodos de classe que façam parte do pacote (package). Os pacotes são uma forma de organizar diversas classes em grupos menores dentro do projeto. Dados esses conceitos básicos, vamos analisar as alternativas da questão. a) CORRETA. Tanto atributos quanto métodos privados só podem ser acessados por métodos membros da própria classe em que foram declarados. b) ERRADA. Somente métodos pertencentes ao mesmo pacote podem acessar os méto- dos protegidos, não importando se forem instanciados na mesma aplicação ou não. c) ERRADA. Pois os métodos públicos podem ser acessados a partir do método de qualquer classe. Soma-se a esse erro, o fato dos atributos protegidos também poderem ser acessados por métodos que façam parte do mesmo pacote, mas não somente na classe, e nas suas derivadas, em que forem declarados. d) ERRADA. Somente métodos e atributos públicos podem ser acessados a partir de métodos de qualquer classe. e) ERRADA. Os métodos públicos podem ser acessados a partir dos métodos de qualquer classe, essa é a falha da alternativa. A alternativa a ser marcada é a alternativa (A). Página 41 de 50 www.handbookdeti.com.br Handbook de Questões de TI Comentadas para Concursos Volume questões de TI 17. Assuntos relacionados: Orientação a Objeto, Polimorfismo, Banca: ESAF Instituição: Superintendência de Seguros Privados (SUSEP) Cargo: Analista Técnico da SUSEP - Tecnologia da Informação Ano: 2010 Questão: 23 Polimorfismo é a (a). utilização múltipla de programas em análise orientada a objetos. (b). habilidade de uma única operação ou nome de atributo ser definido em mais de uma classe e assumir diferentes implementações em cada uma dessas classes. (c). habilidade de um programador em desenvolver aplicações e caracterizar objetos com múltiplos atributos. (d). utilização de uma classe com diferentes formatos em programas com definição de objetos e atributos. (e). habilidade de uma única variável ser utilizada em diferentes programas orientados a objetos. Solução: O paradigma de Programação Orientada a Objeto (POO) surgiu no início da década de 1970, com o advento da linguagem de programação Simula-68, e foi popularizado pela lin- guagem SmallTalk, desenvolvida nos laboratórios da Xerox.
Compartilhar