Prévia do material em texto
1 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO PROGRAMAÇÃO ORIENTADA A OBJETOS II 2 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO A Faculdade Multivix está presente de norte a sul do Estado do Espírito Santo, com unidades em Cachoeiro de Itapemirim, Cariacica, Castelo, Nova Venécia, São Mateus, Serra, Vila Velha e Vitória. Desde 1999 atua no mercado capixaba, des- tacando-se pela oferta de cursos de gradua- ção, técnico, pós-graduação e extensão, com qualidade nas quatro áreas do conhecimen- to: Agrárias, Exatas, Humanas e Saúde, sem- pre primando pela qualidade de seu ensino e pela formação de profissionais com cons- ciência cidadã para o mercado de trabalho. Atualmente, a Multivix está entre o seleto grupo de Instituições de Ensino Superior que possuem conceito de excelência junto ao Ministério da Educação (MEC). Das 2109 institui- ções avaliadas no Brasil, apenas 15% conquistaram notas 4 e 5, que são consideradas conceitos de excelência em ensino. Estes resultados acadêmicos colocam todas as unidades da Multivix entre as melhores do Estado do Espírito Santo e entre as 50 melhores do país. missão Formar profissionais com consciência cida- dã para o mercado de trabalho, com ele- vado padrão de qualidade, sempre mantendo a credibilidade, segurança e modernidade, visando à satisfação dos clientes e colaboradores. Visão Ser uma Instituição de Ensino Superior reconheci- da nacionalmente como referência em qualidade educacional. GRUPO MULTIVIX 3 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO bibLioteCa mULtiViX (dados de publicação na fonte) As imagens e ilustrações utilizadas nesta apostila foram obtidas no site: http://br.freepik.com de Campos Souza Paulo Vitor Programação Orientada a Objetos II / de Campos Souza Paulo Vitor. – Serra: Multivix, 2019. editoriaL Catalogação: Biblioteca Central Anisio Teixeira – Multivix Serra 2019 • Proibida a reprodução total ou parcial. Os infratores serão processados na forma da lei. FaCULdade CaPiXaba da serra • mULtiViX Diretor Executivo Tadeu Antônio de Oliveira Penina Diretora Acadêmica Eliene Maria Gava Ferrão Penina Diretor Administrativo Financeiro Fernando Bom Costalonga Diretor Geral Helber Barcellos da Costa Diretor da Educação a Distância Pedro Cunha Conselho Editorial Eliene Maria Gava Ferrão Penina (presidente do Conselho Editorial) Kessya Penitente Fabiano Costalonga Carina Sabadim Veloso Patrícia de Oliveira Penina Roberta Caldas Simões Revisão de Língua Portuguesa Leandro Siqueira Lima Revisão Técnica Alexandra Oliveira Alessandro Ventorin Graziela Vieira Carneiro Design Editorial e Controle de Produção de Conteúdo Carina Sabadim Veloso Maico Pagani Roncatto Ednilson José Roncatto Aline Ximenes Fragoso Genivaldo Félix Soares Multivix Educação a Distância Gestão Acadêmica - Coord. Didático Pedagógico Gestão Acadêmica - Coord. Didático Semipresencial Gestão de Materiais Pedagógicos e Metodologia Direção EaD Coordenação Acadêmica EaD 4 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Aluno (a) Multivix, Estamos muito felizes por você agora fazer parte do maior grupo educacional de Ensino Superior do Espírito Santo e principalmente por ter escolhido a Multivix para fazer parte da sua trajetória profissional. A Faculdade Multivix possui unidades em Cachoei- ro de Itapemirim, Cariacica, Castelo, Nova Venécia, São Mateus, Serra, Vila Velha e Vitória. Desde 1999, no mercado capixaba, destaca-se pela oferta de cursos de graduação, pós-graduação e extensão de qualidade nas quatro áreas do conhecimento: Agrárias, Exatas, Humanas e Saúde, tanto na mo- dalidade presencial quanto a distância. Além da qualidade de ensino já comprova- da pelo MEC, que coloca todas as unidades do Grupo Multivix como parte do seleto grupo das Instituições de Ensino Superior de excelência no Brasil, contando com sete unidades do Grupo en- tre as 100 melhores do País, a Multivix preocupa- -se bastante com o contexto da realidade local e com o desenvolvimento do país. E para isso, pro- cura fazer a sua parte, investindo em projetos so- ciais, ambientais e na promoção de oportunida- des para os que sonham em fazer uma faculdade de qualidade mas que precisam superar alguns obstáculos. Buscamos a cada dia cumprir nossa missão que é: “Formar profissionais com consciência cidadã para o mercado de trabalho, com elevado padrão de quali- dade, sempre mantendo a credibilidade, segurança e modernidade, visando à satisfação dos clientes e colaboradores.” Entendemos que a educação de qualidade sempre foi a melhor resposta para um país crescer. Para a Multivix, educar é mais que ensinar. É transformar o mundo à sua volta. Seja bem-vindo! APRESENTAÇÃO DA DIREÇÃO EXECUTIVA Prof. Tadeu Antônio de Oliveira Penina diretor executivo do grupo multivix 5 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Lista de FigUras > FIGURA 1 - Diagrama de Classes 15 > FIGURA 2 - Diagrama de Casos de Uso 16 > FIGURA 3 - Diagrama de Sequência 17 > FIGURA 4 - Criação de três objetos Casa com suas respectivas características 20 > FIGURA 5 - Exemplo de diagrama de componentes 24 > FIGURA 6 - Interface programada na linguagem C# 33 > FIGURA 7 - Contêiner de conteúdo representando um calendário 40 > FIGURA 8 - Interface do Visual Studio 42 > FIGURA 9 - Exemplo de interação com o usuário durante transferência e cópia de arquivos 43 > FIGURA 10 - Mensagem de aviso de um sistema computacional 44 > FIGURA 11 - Diagrama de casos de uso 46 > FIGURA 12 - Exemplo de diagrama de sequência da UML 47 > FIGURA 13 - Exemplo de diagrama de componentes 47 > FIGURA 14 - Planejamento de etapas do escopo de projeto de componentes 52 > FIGURA 15 - Reunião para definição da documentação do projeto 53 > FIGURA 16 - Pesquisas em interfaces de hardware e software para a inclusão de novos componentes 56 > FIGURA 17 - Windows 57 > FIGURA 18 - Interface do Linux 58 > FIGURA 19 - Máquina atuando na vida das pessoas 62 > FIGURA 20 - Divisão de serviços de software 68 > FIGURA 21 - Serviços de software 69 > FIGURA 22 - Sistemas ERP e sua relevância para a empresa 70 > FIGURA 23 - Exemplo de soluções completas para compras on-line 72 > FIGURA 24 - Repositório de componentes compartilhando serviços de software 75 6 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO > FIGURA 25 - Comunicação de dispositivos localmente separados por meio de requisições e mensagens 76 > FIGURA 26 - Serviços de software 79 > FIGURA 27 - Matriz de avaliação entre reúso e produtividade 85 > FIGURA 28 - Classe Usuario 87 > FIGURA 29 - Principais etapas que devem existir em reúso de componentes 88 > FIGURA 30 - Elementos presentes nas interfaces web 94 > FIGURA 31 - Destaque das responsabilidades em grandes empresas e sistemas 99 7 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO sUmÁrio 1UNIDADE 2UNIDADE 3UNIDADE 1 reVisão de ConCeitos de orientação a objetos e ConCeitos de ComPonentes 13 1.1 1. REVISÃO DE CONCEITOS DE ORIENTAÇÃO A OBJETOS E CONCEITOS DE COMPONENTES 14 1.1.1 INTRODUÇÃO AO DESENVOLVIMENTO DE SOFTWARES ORIENTADOA OBJETOS 14 1.1.2 CLASSES E OBJETOS 18 1.1.3 ATRIBUTOS E MÉTODOS 20 1.1.4 INTRODUÇÃO AOS COMPONENTES DE SOFTWARE 23 1.1.4.1 EXEMPLOS DE UTILIZAÇÃO DE COMPONENTES 28 ConCLUsão 29 2 interFaCes, ContÊineres, interação e Projetos de ComPonentes 31 2.1 INTERFACES, CONTÊINERES, INTERAÇÃO E PROJETOS DE COMPONENTES 32 2.1.1 INTERFACES 32 2.1.1.1 EXEMPLOS DE INTERFACES 35 2.1.2 CONTÊINERES 38 2.1.3 INTERAÇÃO 42 2.1.4 PROJETOS 45 ConCLUsão 48 3 esCoPo, objetiVo e abstração de ComPonentes 50 3.1 CONCEITO DE ESCOPO DE COMPONENTES 50 3.1.1 RECURSOS UTILIZADOS NO ESCOPO DE COMPONENTES 50 3.1.1.1 EXEMPLOS DE PROBLEMAS EM ESCOPO DE COMPONENTES 59 3.2 PRINCIPAIS OBJETIVOS DOS COMPONENTES 59 3.3 ABSTRAÇÃO DE COMPONENTES 61 ConCLUsão 65 8 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO sUmÁrio 4UNIDADE 5UNIDADE 6UNIDADE 4 granULaridade, LoCaLiZação e serViço de ComPonentes 67 4.1 4 GRANULARIDADE, LOCALIZAÇÃO E SERVIÇOS DE COMPONENTES 67 4.1.1 GRANULARIDADE DE COMPONENTES 67 4.1.2 LOCALIZAÇÃO DE COMPONENTES 74 4.1.3 SERVIÇOS DE COMPONENTES 78 ConCLUsão 80 5 reÚso e reFatoração de ComPonentes de soFtWare 82 5.1 REÚSO E REFATORAÇÃO NOS COMPONENTES DE SOFTWARE 83 5.1.1 REÚSO DE COMPONENTES DE SOFTWARE 83 5.1.1.1 PROJETOS DE COMPONENTES COM REÚSO 87 5.2 REFATORAÇÃO DE COMPONENTES DE SOFTWARE 89 ConCLUsão 94 6 PadrÕes de Projeto Para ConstrUção de ComPonentes Com reÚso 96 6.1 PADRÕES DE PROJETO PARA A CONSTRUÇÃO DE COMPONENTES COM REUSO 97 6.1.1 INTRODUÇÃO AOS PADRÕES DE SOFTWARE 97 6.1.2 PRINCÍPIO DE RESPONSABILIDADE ÚNICA 98 6.1.3 PRINCÍPIO DE SEGREGAÇÃO DE INTERFACES 100 6.1.4 PRINCÍPIO DO ABERTO FECHADO 101 6.1.5 PRINCÍPIO DE SUBSTITUIÇÃO DE LISKOV 103 6.1.6 PRINCÍPIO DE INVERSÃO DE DEPENDÊNCIAS 105 ConCLUsão 107 reFerÊnCias 108 9 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO iConograFia ATENÇÃO PARA SABER SAIBA MAIS ONDE PESQUISAR DICAS LEITURA COMPLEMENTAR GLOSSÁRIO ATIVIDADES DE APRENDIZAGEM CURIOSIDADES QUESTÕES ÁUDIOSMÍDIAS INTEGRADAS ANOTAÇÕES EXEMPLOS CITAÇÕES DOWNLOADS 10 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO APRESENTAÇÃO DA DISCIPLINA Olá, alunos! Bem-vindos à disciplina Programação Orientada a Objetos II. O desenvolvimento de software evolui assim como os desejos da sociedade. Por- tanto, os novos profissionais devem estar aptos a atender às principais vontades de seus clientes, fazendo suas atividades com eficiência e economicidade de recursos. Para tal, os desenvolvedores precisam conhecer as principais técnicas de construção de softwares, para que o trabalho seja reconhecido e valorizado. Em um mercado competitivo, uma formação sólida e o conhecimento dos principais fundamentos da orientação a objetos e qualidade de software tornam-se necessários para uma evolu- ção gradual da carreira profissional dos desenvolvedores e da qualidade do desenvol- vimento de softwares no país. Nesse curso, você irá aprimorar seus conhecimentos sobre orientação a objetos, pen- sando de uma forma mais crítica e prática sobre os principais conceitos de qualidade que envolvem esse tipo de disciplina. Aprenderá, também, a importância da orienta- ção a objetos para construir elementos da tecnologia da informação, que atendam a requisitos de qualidade e que possibilitem a satisfação do cliente, bem como criar objetos menos acoplados e mais reutilizáveis. Se você ainda não sabe do que isso se trata, pode ter certeza que, durante o curso, aprenderá esses e inúmeros outros con- ceitos. A abordagem prática e conceitual o auxiliará a entender sobre as principais necessidades do mercado de desenvolvimento de softwares e sobre quais conheci- mentos o desenvolvedor de aplicativos computacionais necessita para se destacar. Os estudos sobre os componentes de software nortearão a sua forma de desenvolvi- mento e o ajudarão a construir softwares mais representativos e com independência. Aproveite o material e faça bons estudos! Objetivos da disciplina Ao final desta disciplina, esperamos que você seja capaz de: • Explicar como funcionam os principais conceitos da orientação a objetos por meio da construção de softwares com qualidade. • Registrar conhecimentos sobre os principais tipos de componentes de soft- wares. 11 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO • Analisar, aplicar e explicar os principais fatores que permitem que os com- ponentes de softwares estejam presentes na rotina de desenvolvedores e de fábricas de software. • Criar elementos de softwares reutilizáveis. • Identificar as principais características e os impactos para a produtividade de um desenvolvimento eficiente de softwares. • Reafirmar a relevância do desenvolvimento de softwares, seguindo padrões de projeto com foco no desenvolvimento eficiente de aplicativos. 12 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que você: > Recordar os principais elementos presentes na orientação a objetos. > Avaliar a produção de softwares reutilizáveis por meio de componentes independentes. > Identificar características fundamentais de programação de alto nível. UNIDADE 1 13 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 1 REVISÃO DE CONCEITOS DE ORIENTAÇÃO A OBJETOS E CONCEITOS DE COMPONENTES A orientação a objetos (OO) gerou uma evolução nas linguagens estruturadas para que o desenvolvimento de softwares fosse mais eficiente, permitindo que soluções que funcionassem bem para um problema pudessem ser aproveitadas por outros softwares. A OO facilita a tradução das necessidades dos clientes (requisitos) em co- dificação, permitindo que o gap semântico seja menor entre o que o cliente deseja e a solução construída. Quando um sistema é desenvolvido orientado a objetos, qualquer alteração nos re- quisitos não gera impactos tão profundos quanto se ele fosse desenvolvido de forma estruturada. A OO fundamenta-se na utilização de componentes individuais que pos- suem representatividade para o contexto. Eles são chamados de objetos e possibili- tam a construção de sistemas complexos, fazendo a análise por meio de situações e contextos vividos no mundo real. Os principais componentes a serem desenvolvidos em um sistema devem permitir que cada uma das partes seja individualizada, eficiente e com entendimento com- pleto. Assim, muitos sistemas originaram-se de partes de outros sistemas mais com- plexos. Os objetos podem se comunicar por troca de mensagens, possibilitando ações que seriam extremamente morosas de acontecer se estivessem implementadas de forma estruturada. Portanto, nesta unidade, serão estudados os principais conceitos que definem a construção de softwares orientada a objetos e como essas técnicas permitem a compreensão e construção de componentes de softwares. 14 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 1.1 1. REVISÃO DE CONCEITOS DE ORIENTAÇÃO A OBJETOS E CONCEITOS DE COMPONENTES 1.1.1 INTRODUÇÃO AO DESENVOLVIMENTO DE SOFTWARES ORIENTADO A OBJETOS Os desenvolvedores passam por diversos processos para coletar todas as informações referentes ao desejo do usuário em uma solução informatizada. O processo de cole- ta,elucidação, desenho dos requisitos e uma representação gráfica ou visual desse processo é chamado design de projetos de software. É preciso conhecer ferramentas que traduzam os desejos do cliente em processos que possibilitem a elaboração de documentos com símbolos padrões, que realizem a conclusão da solução informa- tizada. Esses documentos são chamados de especificação de software e contêm os principais digramas, capazes de apresentar as características a serem desenvolvidas para atender às expectativas dos stakeholders. Esses modelos são elaborados a partir de uma linguagem padrão no mundo da computação, a UML. Ela permite criar os principais diagramas que possibilitam a tradução dos requisitos pelo especialista e a sua compreensão por parte dos desenvolvedores. Esse fator permite a execução das tarefas de acordo com o combinado junto ao cliente. A especificação de software deve ser: 1. Clara; 2. Sem ambiguidades; 3. Composta pelos diagramas que resolvam a solução; 4. Coerente com as necessidades do cliente; 5. Completa, agregando valor. Em geral, a especificação de requisitos de software apresenta os seguintes diagra- mas, que podem auxiliar no desenvolvimento de softwares com qualidade: 1. Diagrama de Caso de uso. 2. Diagrama de Contexto. 3. Diagrama de Classes. 15 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 4. Diagrama de Atividades. 5. Diagrama de Sequências. 6. Diagrama de Objetos. 7. Diagrama de Componentes. Esses diagramas podem ser construídos com ferramentas que dão suporte à UML, por exemplo, o Astah, StarUML, dentre outros. Então, para que um programa seja bem construído, o design deve ser elaborado com qualidade e seguindo os padrões de construção de artefatos. Na figura a seguir, está representado um diagrama de classes, no qual são apresentadas as principais enti- dades presentes no software. Nele, estão listadas as classes importantes, sendo que cada classe tem seus atributos e cada um deles possui um tipo. Essa linguagem facili- ta o desenvolvimento de softwares e a tradução das imagens em codificações. A esse processo de receber um diagrama e transformá-lo em código no C# (ou qualquer outra linguagem), dá-se o nome de engenharia direta. Quando se tem o código e se resolve criar os diagramas baseados na codificação disponível, o processo é chamado de engenharia reversa (DEITEL, 2007). FIGURA 1 - DIAGRAMA DE CLASSES Fonte: SHUTTERSTOCK, 2018. 16 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Na figura a seguir, está presente um diagrama de casos de uso que contém as princi- pais funcionalidades do sistema. Em geral, esse diagrama apresenta também os ato- res que podem interagir com cada caso de uso. Essa fase do design auxilia os desen- volvedores na criação dos principais menus de funcionalidade de uma solução, além de determinar perfis de acesso de usuário de acordo com o papel que ele exerce no sistema. Acompanhado dos casos de uso e dos atores, têm-se os relacionamentos entre os atores e os casos de uso, que permitem melhor detalhamento e construção do sistema. FIGURA 2 - DIAGRAMA DE CASOS DE USO Fonte: SHUTTERSTOCK, 2018. Já na figura seguinte, apresenta-se um diagrama que dá noções de como as princi- pais funções do sistema vão funcionar, baseando-se principalmente em identificar as etapas, possíveis respostas e impactos nos sistemas e os atores responsáveis pela interação de uma atividade. Nessa figura, estão listados os principais envolvidos e as principais atividades para a locação de um filme. A diferença desse diagrama para um diagrama de atividades é que este contém a sequência correta de como as ativi- dades devem acontecer. 17 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO FIGURA 3 - DIAGRAMA DE SEQUÊNCIA Fonte: SHUTTERSTOCK, 2018. Para saber mais sobre os principais diagramas que com- põem a UML e como eles podem auxiliar no design de projetos de software, procure na internet por “Resumo de alguns diagramas UML”, do professor Eduardo Figueiredo. Esses diagramas auxiliam na compreensão do mundo real e das necessidades do usuário para a programação em linhas de código, permitindo que seja realizada a construção de um software que atenda às principais necessidades levantadas pelo cliente. Gap Semântico - Diferença entre o problema levantado no mundo real e a abstração do modelo construído. Sua rela- ção se dá de modo inversamente proporcional quando se avalia o gap semântico e o tempo da construção da solução. 18 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 1.1.2 CLASSES E OBJETOS Conforme definido por Sharp (2008) , classes representam um tipo de dado comple- xo. Elas são uma especificação para os objetos, descrevendo os dados que os com- põem (o que podem armazenar) e o que eles podem executar (o que podem fazer). Diante desse contexto, é relevante entender que as classes surgem baseadas nos principais elementos que fazem parte do sistema. Por exemplo, se você está desenvolvendo um sistema de livrarias, existem classes que são fundamentais para um sistema que atenderá a essa demanda, como Livro, Clien- te, Funcionário, Autor e qualquer outra representação que permita a todos os envolvi- dos na construção desse sistema a criação de elementos que tenham razão de existir para essa livraria. A vantagem da orientação a objetos é que a criação dessas classes é genérica, atendendo à maioria dos contextos que envolvem, nesse caso, a livraria. Isso facilita a disseminação e a construção de elementos que possam ser reutilizados ou adaptados a outras linguagens ou sistemas. As classes são representadas na UML (Unified Modeling Language) pelo diagrama de classes e no desenvolvimento de softwares. Esse modelo gráfico apresenta todos os elementos que permitem a definição da livraria dentro do sistema informatizado. O trabalho de coleta de requisitos e a transformação em classes são realizados por profissionais de engenharia de software, que criam a especificação de requisitos de software com todas as classes e seus devidos elementos. Em um diagrama de classes, é possível identificar elementos que se fazem presentes na modelagem. Entre as classes, existem as ligações, a cardinalidade e a forma como os desenvolvedores devem construir essas classes, conforme a linguagem escolhida para o projeto. Dentro das caixas de classes, existem padronizações que devem ser seguidas, por exemplo, o nome da classe com a primeira letra maiúscula, os atributos (elementos que representam a classe), os métodos (operações realizadas pelas clas- ses) e a forma como eles existem dentro desse contexto (se são numéricos, flutuantes, lógicos ou textuais). Para o desenvolvedor, um diagrama de classes bem elaborado permite a criação de classes de forma a atender aos requisitos. 19 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Quando o desenvolvedor recebe um diagrama de classes da UML, ele faz a conversão dos elementos gráficos para os elementos de programação. Suponha que você rece- beu um diagrama de classes que possui uma representa- ção de uma classe Livro. Essa classe Livro tem 4 atributos privados, sendo o nome do tipo que permite textos, dois atributos inteiros que recebem o número de páginas e o código do livro, além de também referenciar uma chave estrangeira para um objeto Autor, permitindo que o livro seja ligado a um autor. A programaçãoda classe pode ser feita da seguinte maneira. public class Livro { private String nome; private int numeroPaginas; private int codigo; private Autor autor; //gets e sets } Ao se criarem as classes, pode-se construir suas instâncias por meio de atributos es- pecíficos. Imagine que você deseja criar um livro de nome “Estudando Programa- ção” com um número de páginas igual a 60, no qual seu código é o 001 e seu au- tor chama-se “Paulo Souza”. Assim, atribuem-se características específicas às classes, transformando essas instâncias criadas nos chamados objetos. Na UML, podem ser criados diagramas de objetos para facilitar o entendimento sobre o contexto que se deseja transmitir para o sistema. Representação do objeto da classe Livro: Livro livro = new Livro(); Autor autor = new Autor(); autor.setNome(“Paulo Souza”); livro.setNome(“Estudando Programação”); livro.setNumeroPaginas(60); livro.setCodigo(001); livro.setAutor(Autor); 20 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Objetos são as representações lógicas de elementos do mundo real. No contexto sis- têmico, eles são instâncias das classes. As classes especificam dados e ações que os objetos devem seguir, mas são os objetos que armazenam informações e executam tais ações, diferenciando-se uns dos outros. Por meio da figura a seguir, você entenderá melhor. Têm-se três objetos: c1, c2 e c3, estes são instâncias da classe Casa, ou seja, possuem número, cor, nome do arquite- to e capacidade de executar a ação de abrir a porta, conforme definido pela classe. Entretanto, bem como no mundo real, cada casa possui características diferentes. A primeira casa (o objeto c1) possui o número 12 e a cor azul. Já a segunda casa (o objeto c2) possui o número 43 e a cor vermelha. A terceira casa (o objeto c3), por sua vez, possui o número 72, a cor branca e está com a porta aberta, indicando que o método abrePorta foi executado (GREENE et al., 2008 ). FIGURA 4 - CRIAÇÃO DE TRÊS OBJETOS CASA COM SUAS RESPECTIVAS CARACTERÍSTICAS Casa c1 = new Casa(); c1.numero = 12; c1.cor = Color.blue;12 Casa c2 = new Casa(); c2.numero = 56; c2.cor = Color.red;56 Casa c3 = new Casa(); c3.numero = 72; c3.abreporta();72 Fonte: Adaptado de ROCHA, 2003 . 1.1.3 ATRIBUTOS E MÉTODOS Os atributos e métodos de uma classe são os elementos que representam o contexto pretendido para ilustrar um contexto do mundo real dentro do sistema. No diagrama de classes, os atributos aparecem primeiro e os métodos são listados na parte inferior 21 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO da classe, identificando quais funções e quais atributos aquela classe deve ter na sua representação. O diagrama de classes da livraria, por exemplo, pode apresentar de uma maneira genérica seus atributos e métodos. Na UML, existem símbolos que fa- cilitam o desenvolvimento do software mediante a tradução dos sinais empregados para a codificação necessária. O engenheiro de software ou o analista de sistemas deve planejar os diagramas de forma precisa e eficiente, principalmente se a empresa adotar as metodologias ati- vas, pois quaisquer mudanças dentro desse contexto podem ser catastróficas para a operação dos desenvolvedores e testers. Portanto, deve-se trabalhar sempre com um escopo de projeto e de classes bem definido, buscando atuar de maneira mais dinâ- mica e eficiente. O arquiteto deve pensar em lógicas e recursos que sejam capazes de atender às especificidades desse diagrama, e os desenvolvedores devem implemen- tá-lo de forma integral. Os quatro principais pilares da orientação a objetos são: abstração: O desenvolvedor deve ser capaz de representar em classes e objetos os fatores de maior relevância a um contexto. A abstração deve partir desde a modela- gem até o desenvolvimento orientado a objetos, permitindo que as classes possuam somente atributos presentes nos indivíduos modelados e que tenham relevância ao contexto apresentado (uma classe “aluno” pode ter como características relevantes, modeladas e programadas: o seu nome, a sua idade, a data de matrícula do curso, o curso que ele estuda. Veja que um apelido não seria viável para esse contexto de desenvolvimento, pois não acrescentaria nada nas funcionalidades do sistema saber o apelido do aluno). encapsulamento: É o conceito que determina que o desenvolvedor deve programar as classes por meio de um isolamento aos elementos mais importantes de uma clas- se. Essa proteção é dada aos atributos e/ou métodos de uma classe, que podem ser visíveis a todos os envolvidos no contexto proposto (public), privados a somente ele- mentos internos da classe (private), ou então visíveis a todos dentro de um mesmo pacote (protected). Assim como na vida, a Orientação a Objetos (OO) permite que 22 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO informações sejam compartilhadas a quem é de direito. Todos podem saber o seu nome (public), porém o seu local de trabalho é algo que você só compartilha com a família (protected) e ninguém, além de você ou de quem você desejar, precisa saber quanto você recebe de salário (private). Herança: Para Barners (2009), dentro da Orientação a Objetos, o conceito de herança também remete a características dos seres humanos. Esse conceito permite ao de- senvolvedor entender e diminuir a quantidade de linhas de código para resolver pro- blemas que tenham o mesmo comportamento ou compartilham de mesmas fun- cionalidades. A utilização de herança permite que o comportamento de uma classe seja herdado por outra classe, fazendo com que classes que tenham comportamen- tos parecidos na maioria de suas funcionalidades possam compartilhar atributos, métodos ou contextos. Por exemplo: uma conta bancária possui diversos elementos em comum com uma conta corrente e uma conta poupança, porém essas contas se diferenciam entre suas principais funcionalidades. Ao invés de ter de desenvolver os mesmos métodos para cada uma das três classes, o ideal é desenvolver uma clas- se com todos os atributos em comum para as demais envolvidas e fazer com que elas herdem esse comportamento (extends). Exemplo: public class ContaCorrente extends ContaBancaria. Nesse contexto, todos os atributos e métodos públicos pode- rão ser utilizados também na classe ContaCorrente. Polimorfismo: O polimorfismo remete a muitas formas. Isso significa que o desenvol- vedor pode construir classes que remetam ao princípio de que duas ou mais classes derivadas de uma mesma superclasse podem utilizar funções ou métodos que pos- suam a mesma assinatura, mas comportamentos diferentes em cada uma das clas- ses, utilizando como referência um objeto de sua classe “Pai”. Essa técnica deve ser utilizada pelos desenvolvedores por meio da redefinição de métodos (sobrescrita ou overriding), quando um método já escrito ganha novas funcionalidades que sobres- crevem o que havia sido previamente desenvolvido (SILVA FILHO, 2010). A utilização de recursos como herança, polimorfismo e encapsulamento permite que as tarefas para a construção do sistema sejam realizadas de forma mais rápida, pois você economiza funcionalidades que já foram desenvolvidas. Treinar esses conceitos é fundamental para se manter atualizado sobre as principais técnicas e metodolo- gias de desenvolvimento de software. 23 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Caso você não se lembre da contextualização de orientação a objetos, realize estudos auxiliares, pois esse é um tema necessáriopara que você entenda os próximos passos da disciplina. Existem artigos e livros que podem facilitar sua concepção sobre os principais conceitos da orientação a objetos, principalmente os indicados na ementa da disci- plina. Não deixe de procurá-los, caso você tenha muitas dú- vidas, e tente resolver os exercícios propostos. 1.1.4 INTRODUÇÃO AOS COMPONENTES DE SOFTWARE Os conceitos que envolvem os componentes de software estão intimamente ligados à orientação a objetos. Quando se programa orientado a objetos, busca-se uma re- presentação do mundo real, permitindo que coisas sejam independentes e tenham funcionalidades representadas em sistemas computadorizados. Quando um recurso de software agrupa e encapsula diversas atividades e tarefas de um sistema comple- xo, ele é considerado um componente. Para entender melhor: você utiliza um sistema operacional que é considerado um software robusto e completo, porém, ele não desempenha sozinho todas as ativida- des. Por exemplo, você utiliza um editor de PDF ou editor de texto para estudar. Ele é um componente de software que permite a visualização de textos em um compu- tador. Os editores são componentes que possuem características sólidas, atômicas e independentes para atuar na resolução de problemas complexos, principalmente ligados à edição e visualização de textos. Na UML, os componentes presentes em um software dão a dimensão de composição dos itens que fazem parte da estrutura de um software. Eles são representados em um diagrama de componentes. 24 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 5 - EXEMPLO DE DIAGRAMA DE COMPONENTES Aplicación Alamacén Deportes Identificacion.frm Control y Análisis Acceso a Base de Datos Rutinas de Conexión (Librerias.bas) Identificacion.frm BD Aplicación Ventas Deportes Fonte: WIKIMEDIA COMMONS, 2018. No entanto, apesar de hoje se ter uma decisão mais aceita pela comunidade, a defi- nição de componente se misturou com outros contextos e, durante muitos anos, foi alvo de diversas discussões acadêmicas, nas quais algumas frentes enxergavam os componentes como qualquer parte do software, e outros entendiam que os compo- nentes deveriam ter vida própria se não estivessem trabalhando acoplados a outros sistemas. Apesar da confusão nas definições, é possível enxergar algo em comum. Sobre o componente, Greene (2008) aponta que: • é visto como um pacote coerente de artefatos de software; • pode ser desenvolvido independentemente; • pode ser entregue como unidade; • pode ser composto, sem mudança com outros componentes, para construir algo maior. Se você analisar esse contexto, ele representa tudo que pode ser estudado e apren- dido com a orientação a objetos: entender o problema, separá-lo por meio de suas funcionalidades, programá-lo para que as execute com eficiência e permitir que ele tenha funcionalidades distintas daquelas ligadas a um software geral. 25 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Baseando-se nessa definição, de acordo com Sharp (2008), tudo que se segue pode ser considerado componente: • Utilizar uma plataforma de desenvolvimento web que utiliza frameworks com- pletos para a construção de suas interfaces, como o jsp. • Usar métodos de uma classe java ou em C# para realizar manipulações com textos. • Utilizar em um computador soluções como o gestor de planilhas, controle de datas e eventos do calendário e outros softwares, que podem ter sua indepen- dência e funcionalidades distintas. Nesse conceito de componente, existem os chamados frameworks, como o Ne- tbeans, Eclipse e o Visual Studio, que condensam diversas ferramentas para auxiliar o seu trabalho no desenvolvimento de softwares. Eles possuem pacotes previamente instalados e permitem a instalação ou incorporação de outros pacotes de funciona- lidades para que o desenvolvedor tenha um vasto conjunto de componentes para utilizar como for necessário. Essa definição de componentes pode ser vista como uma ramificação dos conceitos fabris de produção. Nos dias atuais, é muito difícil uma empresa multinacional geren- ciar todas as etapas do processo. Uma montadora de carros, por exemplo, só recebe os produtos acabados para efetuar a montagem de um carro. Fábricas distintas são responsáveis por fabricar bancos, volantes e outras peças necessárias. A fábrica, ana- logicamente, funciona como um desenvolvedor de software, que é capaz de utilizar um recurso pronto para melhorar as funcionalidades ou a composição da página web que está sendo construída. Já para o campo de linguagens de programação, utilizar soluções que já estão construí- das facilitam a rotina. Se um desenvolvedor tivesse de criar um visual studio toda vez que fosse desenvolver um site, não se teria nem um terço dos atuais sites ou soluções informatizadas. Essa forma de utilizar componentes que já foram testados e validados facilita a rotina de execução das atividades de construção de sistemas. Como os com- ponentes são considerados elementos que auxiliam no desenvolvimento dos softwa- res, de acordo com Barners (2009), eles podem ser incluídos e classificados como: 26 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO • especificações: Existem ferramentas que facilitam a criação e consulta de dia- gramas que representam os sistemas. • Código executável: Podem representar um programa, plug-in ou recurso pronto a ser incorporado em um site. Um exemplo bem simples é o plug-in de segurança do home banking que é instalado em seu navegador. • Código fonte: A utilização de códigos prontos de outros sistemas ou de outras linguagens permite que, por exemplo, uma página html se comunique com códigos em C# por meio de componentes ligados ao desenvolvimento mútuo dessa solução. Outro exemplo é o componente de CSS que torna uma página responsiva. • Projetos (designs): Um projeto pode servir como componente se ele for uma parte integrante de um projeto maior. Essa situação ocorre com frequência quando sistemas passam a ser incluídos em outras soluções, por exemplo, os sistemas de validação de compras online que são incorporados em sites de outras instituições. São projetos robustos, completos e que permitem a valida- ção de segurança da transação. • testes: Ferramentas de testes podem servir como componentes quando são incorporadas por meio de plug-ins, os quais permitem que testes unitários sejam executados em todo momento de mudanças de atributos ou regras de negócio envolvidas em uma classe. • documentação: Pode-se destacar como exemplo a documentação responsá- vel por apresentar os principais diagramas, fluxos e requisitos necessários para a construção de um sistema. Ela tem sua linguagem própria e permite o apoio e a utilização de outras ferramentas na construção de sistemas. No entanto, há de se destacar que, para uma disciplina de programação, os princi- pais componentes estão ligados ao desenvolvimento e implementação de soluções informatizadas. Destacam-se como principais momentos ligados aos componentes de implementação: 1 Quando um pacote de classes construídas de forma independente é entregue como unidades de um produto; 2 Quando os componentes possuem interfaces definidas de forma explícita, permi- tindo a visualização não ambígua dos serviços fornecidos por ela. 27 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Por fim, as interfaces também devem deixar claro de quais serviços necessitam para funcionar e também se podem ser compostas por um ou mais componentes.Portan- to, um componente de desenvolvimento deve ter como característica base a cons- trução de aplicações por montagem, isto é, que esse componente realize todo ou a maioria do trabalho por meio da composição de pedaços existentes para compor uma solução robusta. Isso quer dizer que um desenvolvedor pode pegar o calendário de uma aplicação e a tela de outra para criar um registro de agendamento de salas em uma instituição de nível superior. Veja que as soluções viviam em sistemas diferentes, como componen- tes de outras soluções, e, juntas, buscam atender a uma outra demanda. Esse tipo de abordagem permitiu estudos sobre padrões de projeto que facilitassem a junção de componentes de soluções distintas para atender a um mesmo fim (BARNERS, 2009). Padrões como facade e bridge podem permitir que esses componentes conversem, mesmo que sejam implementados em linguagens distintas. Um componente de software deve deixar claro e explícito quais interfaces ele utiliza para realizar suas transações. Uma interface é um contrato que especifica a fun- cionalidade do componente. Nos componentes, elas são representadas por inter- faces de serviços e por conectar outras tarefas necessárias para seu funcionamento. O componente não pode depender do contexto no qual ele vai atuar, a não ser atra- vés dessa interface. Muitos desenvolvedores confundem os conceitos de in- terface de software e os elementos programáveis, que são do tipo interface. Quando se diz interface de software, trata-se da maneira como um software se comunica com um recurso (cabos, outros sistemas, outras tecnologias). As interfaces programáveis são aquelas nas quais são de- finidas as chamadas dos principais métodos a serem exe- cutados em um conjunto de classes que as implementa (BORATTI, 2007). 28 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 1.1.4.1 EXEMPLOS DE UTILIZAÇÃO DE COMPONENTES As linguagens de programação têm se concentrado apenas em especificar as inter- faces de serviços oferecidos, e não as de serviços usados pelos componentes. Isso prejudica o desenvolvimento com qualidade, pois acabam sendo geradas soluções excelentes para a resolução de problemas locais, mas que não permitem ser expan- didas para outros sistemas. Fatores como programação incorreta e má-utilização dos conceitos de orientação a objetos podem gerar essas complicações. Imagine que você está em uma fábrica de desenvolvimento de software e que, ao atender a uma requisição do usuário, recebeu o pedido para incorporar a assinatu- ra digital nos documentos que são gerados pelo site de compras online do cliente. A boa programação de recursos e componentes pode gerar um menor trabalho den- tro dessa empresa. Se outra solução (site institucional de uma faculdade) já utilizar a assinatura digital e esteja confirmado que esse componente funciona, o desenvol- vedor pode economizar tempo e linhas de código, utilizando o código pronto para adaptá-lo ao site de seu cliente. Se a assinatura digital não estiver desenvolvida na programação de suas classes e organização de seus pacotes, pensando em coesão, coerência, acoplamento e boas práticas de programação, dificilmente o desenvol- vedor conseguirá aproveitar a assinatura digital no site de compras sem levar outros problemas ou classes desnecessárias presentes no site institucional para o software de seu cliente. Portanto, desenvolver qualquer software ou componente com quali- dade pode gerar menor retrabalho e maior eficiência na produção de softwares. 29 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO CONCLUSÃO Nesta unidade, foram abordados aspectos relativos aos conceitos de programação orientada a objetos e seus principais recursos. A importância das classes, métodos e atributos não pode ser desconsiderada quando um desenvolvedor de software atua de maneira a prezar pela qualidade de seu produto. O desenvolvimento de software a partir de padrões passa por uma documentação adequada, representativa e de fácil compreensão, utilizando termos técnicos que são padronizados pela UML. A mo- delagem de problemas computacionais auxilia os envolvidos a trazerem o mundo real para o mundo computacional. Se ela for incorreta, todo o processo de desenvol- vimento orientado a objetos será prejudicado. Para construir softwares com qualidade, deve-se respeitar as principais formatações, normas e padrões da orientação a objetos, permitindo que classes sejam represen- tativas, coesas, coerentes e que especifiquem de forma completa todos os elemen- tos necessários para modelar os problemas. Na orientação a objetos, destacam-se também os conceitos de herança, polimorfismo, encapsulamento, classes e atributos, que formam o conjunto de representatividade do desenvolvimento de software. Nesse contexto, é possível visualizar os principais conceitos envolvidos na construção, utilização e funcionalidades dos componentes. Eles estão presentes na fabricação de soluções informatizadas para melhorar a produtividade e aproveitar de maneira mais racional os recursos que já foram desenvolvidos e testados. Os componentes representam partes independentes, que utilizam interfaces para se conectar e enviar comandos a outros sistemas. Eles podem ser vistos como partes autônomas e inde- pendentes na formação de um software robusto e completo. 30 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que você: > Analisar os principais elementos de interfaces dos componentes. > Avaliar as principais interações entre componentes e outros sistemas. > Diferenciar projetos de software e projetos de componentes. > Discutir as principais características de interfaces, contêiner, projetos e interações de componentes. UNIDADE 2 31 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 2 INTERFACES, CONTÊINERES, INTERAÇÃO E PROJETOS DE COMPONENTES O desenvolvimento de componentes de software envolve contextos importantes para a construção de partes relevantes e independentes do sistema. Essa construção ne- cessita de fatores para facilitar a organização e a comunicação com outros sistemas. Um dos principais pilares da orientação a objetos é a comunicação entre sistemas e objetos, e, para isso, é necessário pensar no desenvolvimento de componentes por meio de interfaces que sejam bem claras e permitam a comunicação entre as neces- sidades de funcionamento de um componente e os serviços que ele pode utilizar. Para armazenar diversos componentes, existe o conceito de contêiner, que segue a ideia principal de ser um repositório de componentes disponíveis assim que for ne- cessária a sua utilização. Como os componentes possuem diversos contextos, proces- sos e características peculiares, você verá formas de gerenciar sua construção e sua comunicação mediante projetos de componentes. As principais etapas, processos e procedimentos serão elucidados por meio de sua relevância e importância para a construção de sistemas eficientes. Essa é uma etapa do curso na qual são visualiza- dos muitos recursos gráficos para facilitar a vida dos desenvolvedores na produção de softwares, em especial desktop. Por fim, serão abordados conceitos sobre as formas de interação dos componentes com os demais elementos que vão requerer seus serviços. Você aprenderá elementos que podem ser incorporados aos projetos de componentes e garantir o sucesso de sua aplicabilidade em outros conceitos de software. 32 Programação orientada a objetosii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 2.1 INTERFACES, CONTÊINERES, INTERAÇÃO E PROJETOS DE COMPONENTES 2.1.1 INTERFACES Os principais conceitos de orientação a objetos estão ligados a sistemas que repre- sentam as características humanas. Essas características devem ser replicadas na sua essência para que não existam problemas na criação e utilização dos sistemas. Um fator que facilita a forma como os sistemas podem se comunicar são as interfaces. Elas são responsáveis por fornecer os serviços dos componentes para os demais en- volvidos no contexto do software no qual ele está inserido. As interfaces devem ser bem claras sobre a sua forma de comunicação, isto é, devem ter características que as diferenciem sobre como e quando permitem a comunicação do componente. Na interface do componente, são descritos os fatores a seguir: • Propriedades: as características configuráveis dos componentes, que serão le- vadas em conta durante a sua execução. • métodos: rotinas chamadas por métodos são aquelas executadas por terceiros para solicitar os serviços fornecidos pelo componente. Exemplo: quando uma máquina de cartão solicita a comunicação com o banco do cliente após ele digitar a senha em uma máquina de cartão de crédito. Outros elementos fundamentais em uma interface de componente são o seu núme- ro de versão e série, que permite o rastreio sobre a data e o lote de sua produção, a sua linguagem de programação, pois, dependendo de como ela foi desenvolvida, são necessários elementos que permitam a comunicação entre itens programados em linguagens diferentes. Você sabia que o plug de tomada, o famoso “T”, é uma interface, e pode ser analo- gicamente um exemplo para prover serviços entre linguagens diferentes? No Brasil, existe um padrão de tomadas e pinos de energia em dispositivos eletrônicos único no 33 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO mundo. Esse fator prejudica brasileiros que levam seus dispositivos para o exterior e não levam adaptadores de energia para carregá-los. Da mesma forma acontece com os softwares e seus componentes. Por mais que um sistema necessite de um serviço provido por um componente, ele deve conhecer as características de sua interface, assim como acontece quando um turista brasileiro precisa conhecer os padrões de tomada de energia no país para o qual ele está se dirigindo. O dispositivo “T” faz o papel da interface, permitindo uma comunicação entre dois dispositivos diferentes, padronizando e intermediando a sua comunicação. Com o software não é diferente. Uma interface entende as requisições vindas de um sistema e as transmite na forma que o componente consiga entender. O mesmo processo acontece quando as res- postas do componente são levadas ao sistema que fez a requisição. Assim, as interfa- ces têm papel fundamental nas linguagens de programação. As interfaces são responsáveis por definir as dependências de outros componentes/ serviços através de chamada de contratos definidos por funções. Essas funções nas interfaces devem ser feitas de forma a permitir que os serviços providos por ela sejam implementados em todas as classes que estão dentro desse contexto. Ela funciona muito bem como um mecanismo de comunicação e invocação de métodos entre classes distintas, pois determina premissas mínimas necessárias para o contexto no qual ela está trabalhando. A figura a seguir apresenta um exemplo de programação de interface no C#. FIGURA 6 - INTERFACE PROGRAMADA NA LINGUAGEM C# Fonte: SHUTTERSTOCK, 2018. 34 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Conhecendo a interface de um componente, é possível utilizá-la para compor aplica- ções. Portanto, a definição de uma interface deve preconizar: a linguagem desenvol- vida, o propósito da interface, o contexto de classes que ela pretende atender, e quais serviços ela deseja disponibilizar. As interfaces de componentes podem ser descritas de diversas formas, pois em cada linguagem de programação ela pode ter características únicas de construção, porém seu propósito é sempre o mesmo: prover a comunicação e os serviços entre classes e elementos distintos. Em uma linguagem de descrição de interface (IDL) e nos mode- los multilinguagem (permitem várias linguagens distintas trabalhando em um mes- mo propósito, como linguagens de marcação e linguagens de script, por exemplo), pode-se destacar como funcionalidades relevantes das interfaces de componentes: 1. Utilização dos mecanismos de comunicação. 2. Interação com serviços. 3. Interação com suporte de execução. Várias interfaces podem ser suportadas por um mesmo componente, permitindo que um método deva ser implementado em todas as classes envolvidas naquela solicita- ção. Um exemplo prático é o seguinte: imagine que, em um sistema, todas as classes, ao receber o nome de um atributo, devem verificar se esse nome contém somente letras e se tem até o máximo de 250 caracteres. Por se tratar de uma obrigação do sis- tema, várias classes presentes nele devem implementar a sua forma de contabilizar as letras e verificar se somente existem caracteres esperados pelo problema. Interfaces diferentes também podem ser fornecidas para cada tipo de usuário. Esse princípio norteia que uma interface deve atender a um componente ou classe específica. O princípio de segregação de interfaces facilita aspectos de reuso e acopla- mento de códigos, garantindo que uma classe ou componente terá somente acesso aos dispositivos autorizados para ele e que sejam necessários a seu funcionamento. Isso acontece muito na rotina dos seres humanos, quando se contrata um serviço sem saber sobre todas as cláusulas contratuais. Se a leitura do contrato que está sendo assinado não for feita previamente, corre-se o risco de se ter que fazer funções, contextos ou atitudes indesejadas em condições normais. Nas classes, isso ocorre da mesma forma; portanto, programar uma interface e permitir que ela tenha acesso somente a métodos razoáveis para seu contexto é uma boa prática de programação. 35 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Dentro do desenvolvimento de software, o conceito de interfaces também traz faci- lidades para a relação entre classes. Elas podem definir formas e chamadas obriga- tórias a serem cumpridas para que um conjunto de componentes ou classes possa atuar de forma conjunta para a resolução de um problema. As interfaces são respon- sáveis por otimizar comandos de softwares e prover um conjunto de instruções que, obrigatoriamente, deve ser implementado àqueles que pertencem a seu contexto. Boas práticas de programação determinam que as interfaces devem seguir conceitos de qualidade, como, por exemplo, atender a contextos comuns, evitando a super- posição de métodos que não pertençam a um contexto. De forma análoga, pode-se entender a interface como um contrato. Quando uma classe se liga a uma interface de software, deve seguir suas regras e suas definições, assim como os seres humanos quando assinando um contrato de prestação de serviços. Nesse contrato, existem as cláusulas que devem ser cumpridas e os requisitos mínimos necessários para realizar as atividades de forma coesa e eficiente. Com a interface de software não é diferente. Todos os métodos em uma interface são apresentados de forma simples, apresen- tando um contrato sobre quais tipos de variáveis e respostas os principais métodos devem ter, deixando a cargo das classes a forma como vão implementá-los. 2.1.1.1 EXEMPLOS DE INTERFACESO conceito de interfaces se faz presente na vida do desenvolvedor de software, prin- cipalmente quando ele pretende criar maneiras de separar e definir quais são as for- mas de comunicação prioritárias entre classes e componentes. As interfaces também podem ser usadas para definir contratos padronizados entre os componentes. Nela podem ser descritos os métodos que permitirão a comunicação e o fornecimento de serviços fundamentais para suas requisições. Ferramentas como o Visual Studio têm recursos que facilitam a criação de interfaces dentro do contexto de seu projeto. Para desenvolver uma interface, existem botões que já permitem ao desenvolvedor criá-las com maior facilidade. A seguir, um exemplo de uma interface. Geralmente, elas seguem padrões de come- çar seus nomes com a letra I. Não é obrigatório, porém, quanto mais você criar hábi- tos desses conceitos, mais fácil entenderá os códigos de outros desenvolvedores. Para construir uma interface, a palavra reservada interface deve ser utilizada. 36 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Interface ICliente{ void logar(); void imprimir(); void deslogar(); } Nessa interface produzida, o desenvolvedor definiu que as funções obrigatórias para o contexto de um cliente na solução devem ser a de logar, imprimir e deslogar den- tro do sistema. Esse tipo de chamada, colocando os nomes dos métodos e finalizan- do com ponto-e-vírgula, cria um contrato entre todos que utilizam essa interface. Toda classe que implementá-la terá como obrigatório utilizar os métodos logar, im- primir e deslogar. Se uma classe Cliente implementar a interface, ela deve seguir as premissas de seguir no cabeçalho de sua função, colocando o nome da classe, acom- panhada pelo símbolo ‘:’ e o nome da interface que vai implementar. Nesse caso, se uma classe Cliente fosse implementar a interface ICliente, a sua chamada ficaria da seguinte forma: class Cliente :ICliente Quando esse comando fosse executado, obrigatoriamente a classe Cliente deve criar um corpo para os três métodos da interface ICliente, conforme o exemplo a seguir: class Cliente :ICliente{ void logar(){ Console.WriteLine(“Seja bem-vindo!”); } void imprimir(){ Console.WriteLine(“Você pode imprimir!”); } void deslogar(){ Console.WriteLine(“Obrigado por utilizar o sistema!”); } } 37 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO A vantagem de se utilizar uma interface é que se outra classe, por exemplo, a classe Aluno, implementar a interface, ela pode escrever o corpo dos métodos de forma di- ferente, para atender ao seu contexto. Veja a seguir: class Aluno :ICliente{ void logar(){ Console.WriteLine(“Seja bem-vindo, aluno, bons estudos!”); } void imprimir(){ Console.WriteLine(“Você pode imprimir a apostila neste semestre!”); } void deslogar(){ Console.WriteLine(“Obrigado por utilizar o sistema. Bons estudos!”); } } Outro fator relevante é que uma classe pode implementar quantas interfaces desejar. Supondo que exista uma interface chamada IAluno, que tem o método matricular, se a classe Aluno precisar dos métodos de um cliente e do método de matrícula, deverá fazer o seguinte comando: class Aluno :ICliente, IAluno{ void logar(){ Console.WriteLine(“Seja bem-vindo aluno, bons estudos!”); } void imprimir(){ Console.WriteLine(“Você pode imprimir a apostila neste semestre!”); } void deslogar(){ Console.WriteLine(“Obrigado por utilizar o sistema. Bons estudos!”); } void matricular(){ Console.WriteLine(“Você está matriculado!”); } } 38 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Portanto, construir uma interface de maneira adequada pode permitir a construção de classes e métodos que sigam o padrão eficiente na construção de componentes. A Microsoft auxilia desenvolvedores apresentado exemplos de interfaces para que a comunidade saiba a maneira correta de programá-la e como ela pode interferir na comunicação entre componentes. Procure no site de documentos da Microsoft as palavras chave “IContainer Interface” e amplie seus conhecimentos com exemplos aplicados a sua rotina de desenvolvedor. 2.1.2 CONTÊINERES Um contêiner é um ambiente de execução para componentes que foram disponibi- lizados para outros sistemas. Eles agrupam conjuntos de componentes úteis para a execução das principais tarefas de um software, sendo os responsáveis pela ligação entre os componentes e o mundo exterior. De forma a comparar essa parte da pro- gramação com o mundo real, imagine um contêiner em um cais no porto. Ele é uma caixa fechada que agrupa vários elementos para serem transportados de navio a ou- tros países ou cidades. Esse contexto também vale no desenvolvimento de softwares, pois, dentro dos contêineres, existem elementos que facilitam o fornecimento de serviços e estão agrupados em unidades menores, que permitem que um software tenha funcionalidades relevantes por meio de um grupo de itens presentes na inter- face de comunicação com o usuário (BORATTI, 2007). O contêiner tem como principal responsabilidade processar os pedidos de execução de serviços e os repassar ao componente, que tem como principal função processá- -los. Ele evita que o componente tenha que interagir com o sistema operacional, pois ele é o suporte de comunicação com os serviços de aplicação. Ele atua permitindo que o componente seja independente do ambiente de execução, tornando-o mais portável e mais fácil de reutilizar. As interfaces do contêiner são: 39 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO • Definidas pelo modelo de componentes. • Vistas como uma API completa para execução de componentes. • Recursos para tornar o código do componente mais portável. • Reconhecidas como os primeiros passos para ser construída a comunicação do sistema com o usuário. Pode haver diferentes tipos de contêiner: componentes sem estado, com estado tran- siente (volátil) e com estado persistente. Eles utilizam recursos de software, hardware e serviços da plataforma de execução para executar o componente. Os contêineres possuem serviço de nomes que os permite localizar instâncias de componentes. Eles têm um serviço de comunicação responsável pela troca de in- formações, além de um serviço de persistência e transação responsáveis, respectiva- mente, por armazenar os estados dos componentes e manter a sua consistência nas operações. Por fim, seu serviço de segurança é capaz de autenticar componentes e verificar a autorização para executar os serviços requisitados. O contêiner efetua callbacks quando necessita indicar falhas na obtenção ou na utili- zação de recursos do suporte de execução. O contêiner pode: • Entregar mensagens do serviço de comunicação. • Salvar o estado do componente. • Restaurar-se em caso de reinicialização. • Relatar a violação de regras de funcionamento ou de segurança. • Apresentar uma interface simples, na qual outros elementos gráficos podem ser adicionados. Os principais contêineres do Visual Studio podem ser visualizados na aba de ferra- mentas, e destacam-se os painéis, os pointers e os Tab Controls. Em uma interface gráfica no C#, vários elementos podem ser adicionados a ele e, ao mesmo tempo, permitirem a comunicação e a interação com o usuário. Na figura a seguir, é possível visualizar um exemplo de contêiner que teve seu espaço preenchido com elementos de um calendário. 40 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada noD.O.U em 23/06/2017SUMÁRIO FIGURA 7 - CONTÊINER DE CONTEÚDO REPRESENTANDO UM CALENDÁRIO Fonte: SHUTTERSTOCK, 2018. O código a seguir demonstra um exemplo de Tab Controls. // Create a TabControl and set its properties 1. 2.TabControl dynamicTabControl = new TabControl(); 3.dynamicTabControl.Name = “ExemploCapitulo2”; 4.dynamicTabControl.BackColor = Color.Blue; 5.dynamicTabControl.ForeColor = Color.Black; 6.dynamicTabControl.Font = new Font(“Times”, 16); 7.dynamicTabControl.Width = 400; 8.dynamicTabControl.Height = 300; Nele podem ser identificados o tamanho da altura e largura do Tab Control, a cor de fundo e outras cores auxiliares. Com essa estrutura, o Tab Control pode receber abas, conforme o código a seguir: 41 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO // Add TabelaPagina1 1. 2.TabPage tabelaPagina1 = new TabPage(); 3.tabPage1.Name = “pagina1”; 4.tabPage1.Text = “Aluno”; 5.tabPage1.BackColor = Color.White; 6.tabPage1.ForeColor = Color.Black; 7.tabPage1.Font = new Font(“Verdana”, 12); 8.tabPage1.Width = 200; 9.tabPage1.Height = 200; 10.dynamicTabControl.TabPages.Add(tabelaPagina1 ); 11. 12.// Add TabelaPagina2 13. 14.TabPage tabelaPagina2 = new TabPage(); 15.tabPage2.Name = “pagina2”; 16.tabPage2.Text = “Disciplinas”; 17.tabPage2.BackColor = Color.Pink; 18.tabPage2.ForeColor = Color.White; 19.tabPage2.Font = new Font(“Verdana”, 12); 20.tabPage2.Width = 100; 21.tabPage2.Height = 100; 22.dynamicTabControl.TabPages.Add(tabelaPagina2); Esse código permite a criação de uma aba para alunos e outra aba para disciplinas. Conhecer os recursos das ferramentas é de extrema relevância para seus estudos. Explore sempre os recursos de interface visual do desenvolvedor e aproveite todas as facilidades que ele propicia ao desenvolvimento de softwares. O Visual Studio, assim como o Netbeans e o Eclipse (IDEs para desenvolvimento Java) possuem abas com as principais funções, métodos e classes prontos para o desenvol- vimento de sistemas. Veja quais recursos estão disponíveis na sua ferramenta e apro- veite as maneiras de otimizar sua rotina de trabalho. A figura a seguir mostra uma das interfaces de comunicação do Visual Studio com os desenvolvedores. 42 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 8 - INTERFACE DO VISUAL STUDIO Fonte: SHUTTERSTOCK, 2018. 2.1.3 INTERAÇÃO Um sistema eficiente deve ser construído para se comunicar de maneira clara com o usuário. Esses elementos estão agrupados em conjunto de conceitos que envolvem as interações. Sua principal responsabilidade junto aos componentes é prover as téc- nicas e recursos de interação para a troca de dados e solicitação da execução de ser- viços. Quando um usuário realiza um clique em um botão e recebe uma mensagem como resposta, pode-se dizer que um evento realizou uma interação com o usuário. A interação facilita a comunicação de componentes em um mesmo servidor local ou em servidores localizados em contextos distintos, também chamado de comu- nicação remota. O ideal é que o desenvolvedor abstraia a localização e o comporta- mento dos componentes, permitindo que as interações sejam adequadas ao tempo de resposta esperado pelo usuário. As interações foram programadas para atender a características específicas, como o clique de um mouse ou a digitação de uma tecla do teclado. Esses fatores permitiram a evolução de elementos gráficos em softwares, dando a eles características dinâmicas e maior experiência no uso das interfaces de softwares (SHARP, 2008). 43 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO O desenvolvedor pode utilizar esses recursos para facilitar o feedback das ações para os usuários. Isso torna o sistema desenvolvido mais amigável. Em geral, as interações podem acontecer por meio de: Chamada remota de procedimento/método: os componentes estão em máquinas diferentes. A chamada tem que ser enviada como uma mensagem pela rede, e a res- posta é recebida pelo mesmo meio. Chamada local de procedimento/método: os componentes estão na mesma máqui- na. Os recursos para a troca de mensagens tornam-se mais simples e intuitivos, per- mitindo que as respostas e interações aconteçam com menor probabilidade de erro. As notificações de eventos ocorridos são difundidas por produtores e entregues a consumidores de eventos. Os consumidores podem ser ou não componentes de in- terface gráfica, e os produtores podem ser servidores de aplicação, outros softwa- res complexos, ou até mesmo outros componentes. A figura a seguir apresenta uma mensagem de interação importante para o usuário durante a utilização de seus re- cursos computacionais. Quando o operador do sistema está fazendo alguma tarefa que demanda mais tempo, como, por exemplo, o download de uma música ou de arquivos internos de seu computador, o sistema mostra uma mensagem, que é sem- pre atualizada, mostrando o progresso da ação. FIGURA 9 - EXEMPLO DE INTERAÇÃO COM O USUÁRIO DURANTE TRANSFERÊNCIA E CÓPIA DE ARQUIVOS Fonte: SHUTTERSTOCK, 2018. 44 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO O desenvolvedor de software deve escolher as melhores maneiras de interagir com o usuário. Um evento definido de forma incorreta pode gerar expectativas, sensações e frustrações nos usuários. Um desenvolvedor que pensa na qualidade de softwares escolhe os recursos de eventos, mensagens e formas de interação mais adequados ao contexto que está atendendo dentro das ações no software. A figura a seguir apre- senta uma interação na qual o usuário deve tomar uma decisão. As cores e ícones foram utilizados para melhor conduzir as suas escolhas (SHARP, 2008). FIGURA 10 - MENSAGEM DE AVISO DE UM SISTEMA COMPUTACIONAL Fonte: SHUTTERSTOCK, 2018. Para saber mais e explorar suas capacidades de construir eventos com qua- lidade, acesse o site Macoratti e procure os tópicos em C#. Ele apresenta di- versos recursos e tutoriais para explorar as principais formas de programação de eventos e interações com o usuário. 45 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 2.1.4 PROJETOS Os projetos de componentes favorecem as principais etapas de pensamento e organi- zação para estruturar as principais funcionalidades a que um componente deve aten- der, além de permitir um pensamento organizado e lógico para escolher formas de interações, comunicações e interfaces presentes na construção de um componente eficiente. Geralmente, em projetos de componentes, definem-se (GREENE et al., 2008): 1. O mecanismo de comunicação entre componentes. 2. As questões não resolvidas pelo TCP/IP. 3. O formato comum dos dados envolvidos na troca de serviços dos componentes. 4. A localização de componentes. 5. A segurança dos componentes. 6. Os protocolos usados pelos suportes de execução de componentes O desenvolvimento de software é estudado em disciplinas de Engenharia de Softwa- re e auxilia no levantamento de passos e etapas fundamentais para a construção de um projeto de componentes eficiente. Com base nas funcionalidades requeridas do sistema, definem-se quais componentes são necessários para sua construção, como eles devem se comunicar, a linguagem de programação utilizada, formas de comu- nicação e quais serviços serão trocados entre os componentes envolvidos, bem como as respostas e requisições efetuadas. Nesses projetos, a reutilização de componentes que já foramdesenvolvidos pode sintetizar as atividades de um novo projeto. Os desenvolvedores e analistas de sistemas devem pensar em soluções que possam ser adaptadas em vários tipos de projetos. Imagine que sua empresa está elaborando um plug-in inteligente de reconhecimento de voz. Esse tipo de tecnologia pode ser adapta- do a vários sistemas informatizados, desktop, WEB e mobile. Um projeto deve levar em conta que: o componente deve fornecer serviços a outros componentes que os utilizarão por meio das interfaces do componente. Pensar as formas de comunicação, interação e interface pode ser o requisito fundamental para o sucesso do projeto. Deve ser possível ajustar a forma como os serviços são executados, alterando valores de propriedades, pa- rametrizando-os conforme as necessidades de comunicação. O componente deve ser sujeito à composição, além de ser independente de outros componentes. 46 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Um bom projeto de componentes realiza suas atividades de modelagem do do- mínio definindo as necessidades, os envolvidos, as entradas e saídas do problema. Nessa etapa, a viabilidade do projeto é discutida, sendo realizados estudos sobre os principais elementos que devem ser alvo de desenvolvimento para atender aos requi- sitos da solução. O documento construído nessa etapa é a Especificação do Software, considerado um dos principais artefatos para consulta sobre o componente a ser de- senvolvido. Para facilitar a construção desse documento, o modelo conceitual ajuda no gap semântico, modelando as principais entidades do mundo real que farão parte da resolução do problema por meio do componente produzido. A UML (Unified Mo- deling Language) auxilia na construção dos principais artefatos da especificação de software dos projetos. A figura a seguir apresenta um esboço do diagrama de casos de uso, que auxilia os projetistas na etapa de modelagem conceitual das funcionali- dades principais de um componente, evidenciando seus atores e como eles se comu- nicam com as formas de entregar serviços que o sistema possui. FIGURA 11 - DIAGRAMA DE CASOS DE USO Fonte: SHUTTERSTOCK, 2018. Outra modelagem importante no projeto de componentes é a forma dinâmica com que o software vai interagir com o meio. A UML volta a ser protagonista nesse mo- mento por meio de diagramas de estado, atividades, sequência, entre outros. A figura a seguir apresenta um exemplo de diagrama de sequência. 47 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO FIGURA 12 - EXEMPLO DE DIAGRAMA DE SEQUÊNCIA DA UML Fonte: SHUTTERSTOCK, 2018. Por fim, a UML pode auxiliar na organização e no projeto de componentes mediante um diagrama, com foco nos principais elementos e interações dos componentes. O diagrama de componentes apresenta os elementos, as nomenclaturas e os paco- tes onde tais componentes podem estar agrupados. A figura a seguir demonstra um exemplo de diagrama de componentes e pacotes. FIGURA 13 - EXEMPLO DE DIAGRAMA DE COMPONENTES Database Server MySQL database Web Server Database interface Presentation layer (web interface) Log file Workstation Web browser HTTP/HTTPS connection TCP/IP or local socket Keyboard/monitor User Fonte: WIKIMEDIA COMMONS. UML Deployment Diagram. Disponível em: <https://commons.wikimedia.org/wiki/File:UML_Deploy- ment_Diagram.svg>. Acesso em: 19 dez. 2018. 48 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Os componentes podem ter as principais interações modeladas, definindo requisi- ções, regras de negócio e comportamento. Essas características podem ser visuali- zadas na especificação dos componentes, a qual cria uma especificação detalhada das interfaces dos componentes, definindo as assinaturas de suas operações e suas propriedades. CONCLUSÃO A construção de componentes reutilizáveis passa por conhecer elementos como interações, contêiner e interfaces para a construção de projetos de componen- tes eficientes. As interfaces construídas nos softwares devem fomentar a organiza- ção por meio de funcionalidades simples e que permitam a divisão de atividades e responsabilidades, de acordo com a natureza dos problemas a serem resolvidos. Fatores importantes na construção de componentes de software são as maneiras distintas que um usuário ou sistema pode receber uma resposta. A interação deve ser bem pensada e organizada para não prejudicar a aceitação do software no mer- cado de consumidores a que atenderá. Portanto, planejar um componente, desde a sua concepção até a sua construção, não é uma tarefa complicada, mas deve se- guir padrões bem definidos de qualidades em projetos, para que as modelagens e diagramas sejam feitos de forma correta e clara. Após a definição dos principais ele- mentos que vão compor a interface do software, contêineres podem recebê-los de forma organizada para apresentar uma interface correta e esperada do componente. Seguindo passos definidos pela Engenharia de Software e aprofundando os recursos de IDEs de desenvolvimento e linguagens de programação, a construção de compo- nentes pode se tornar uma tarefa mais simples e pertencente a seu cotidiano. 49 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Recordar as principais etapas do escopo de componentes. > Avaliar os objetivos de um componente para a empresa. > Descrever características presentes nas etapas de planejamento e construção de componentes. > Avaliar os conceitos de abstração que podem existir nos componentes. UNIDADE 3 50 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 3 ESCOPO, OBJETIVO E ABSTRAÇÃO DE COMPONENTES Os componentes de software possuem muitos recursos que podem auxiliar outros sistemas na execução de tarefas menores. Eles são, muitas vezes, chamados de plu- g-ins, que têm funções robustas e expressivas. Dentro desse contexto, é notório que podem existir problemas nas fases iniciais do projeto, permitindo que o componente não seja entregue de maneira adequada ao contratante do serviço. Nesta unidade, serão abordados aspectos teóricos e exemplificações dos impactos na organização de projetos de desenvolvimento de componentes, com ênfase principal nas etapas envolvidas no escopo dos componentes, a delimitação dos principais objetivos que o componente deverá atender e, por fim, serão apresentados aspectos que facilitam características de abstração desses elementos para as pessoas envolvidas no desen- volvimento e na utilização dos dispositivos. Também serão evidenciados aspectos importantes da construção de documentação adequada para o desenvolvimento do software e como devem ser organizados os passos fundamentais para a construção ou a reutilização de componentes proveitosos e com qualidade. 3.1 CONCEITO DE ESCOPO DE COMPONENTES 3.1.1 RECURSOS UTILIZADOS NO ESCOPO DE COMPONENTES Qualquer projeto organizado precisa de um ponto de partida para que suas ativida- des sejam feitas de forma ordenada e eficiente. No contexto de dispositivos informa- tizados, isso não foge à regra, sendo um fator preponderante para a organização e a explanação de ideias dentro da rotina do desenvolvimento. Sabe-se que existem re- cursos gráficos para organizar elementos, permitir interações e a comunicação efetiva do usuário com o sistema desenvolvido, porém, eles devem seguir critérios que sejam51 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO possíveis de se resolver em tempo hábil, que atendam ao conhecimento da equipe de desenvolvimento de software e que sejam entregues produtos que o cliente irá utilizar. Portanto, planejar os principais passos e recursos que serão empregados nas etapas de construção dos componentes torna-se fundamental para entregas com qualidade. Nesse caso, refere-se ao escopo dos componentes. Eles podem ser auxilia- dos por meio da construção de diagramas de caso de uso, caso de teste e diagrama de atividades, que permitem a compreensão do software de maneira efetiva por par- te da equipe de desenvolvedores. Nessa etapa, são definidos os principais elementos que irão participar e contextualizar o componente: a quem ele se destina, como será utilizado, qual seu público-alvo, qual a escalabilidade e nível de utilização do compo- nente. Um grande número de gestores ainda não se preocupa com as etapas de do- cumentação de software, como diagramas, especificações de desenvolvimento de software e muitos desenvolvedores não a mantêm atualizada. Lembre-se de que esses documentos são fundamentais para a manutenção dos softwares. Algumas correntes da programação e de metodologias ágeis não são adeptas a tanta documentação em um projeto, mas deixar de documentar não é incenti- vado por nenhum tipo de metodologia de desenvolvimento de software. Na etapa de escopo, os gestores desenvolvem recursos para facilitar o trabalho de de- senvolvedores e projetistas, para que a construção de componentes não tenha maio- res prejuízos. Imagine se a posição, as cores ou os recursos de contêiner não forem do gosto do cliente no produto final? Isso pode gerar um retrabalho muito elevado para adequar as soluções. Além de gerar uma insatisfação na equipe de desenvolvedores, os custos do projeto aumentarão com a grande quantidade de retrabalho. Em pro- gramação orientada a objetos, a escolha inadequada de elementos do projeto pode interferir diretamente no acoplamento de classes, no desenvolvimento de interfaces de softwares e interfaces visuais. Isso torna o desenvolvimento moroso e pode torná- -lo inviável no que concerne ao aspecto financeiro (Greene, 2008) . A etapa de planejamento e definição de escopo de componentes pode utilizar recur- sos para facilitar a organização e a determinação de passos a serem executados para 52 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO o êxito do projeto. Como é nessa etapa que ocorre a definição de serviços, técnicas e metodologias empregadas para a construção do componente, devem compor a equipe de escopo de projeto pessoas que compreendam as etapas principais de seu desenvolvimento, além de conhecer fortemente os recursos humanos e técnicos da empresa. Em reuniões com o cliente para a captação de requisitos, suas necessida- des devem ser limitadas ao conhecimento dos desenvolvedores, permitindo, assim, que um componente atenda, de forma mais coerente, as necessidades do contra- tante. Porém, sabe-se que esse mundo ideal está longe de existir dentro da rotina de empresas de software: os clientes solicitam muitas demandas fora da realidade da empresa e do orçamento contratado, os desenvolvedores acabam trabalhando sobrecarregados, sem controle, qualidade e com uma eficiência bem limitada. Acre- dita-se que esse seja um dos fatores principais para comprovar a chamada “teoria do caos” no desenvolvimento de softwares. É muito incomum que um projeto de desen- volvimento de componentes e softwares aconteça sem maiores transtornos. A figura a seguir apresenta o ciclo de alguns processos que são envolvidos no planejamento de escopo do desenvolvimento de componentes. 1 Os autores do livro são responsáveis por uma experiência completa de apren- dizado para programação orientada a objetos através de um dos livros mais usados em C#. Os autores também são autores de artigos internacionais em computação. FIGURA 14 - PLANEJAMENTO DE ETAPAS DO ESCOPO DE PROJETO DE COMPONENTES Fonte: SHUTTERSTOCK, 2018. 53 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Já que a criação de componentes envolve etapas de documentação, sua criação, elu- cidação e construção devem ser os primeiros artefatos a servir como base de escopo para os projetos, pois neles estarão presentes elementos fundamentais, como as prin- cipais classes, como elas devem se correlacionar no projeto e, por fim, de que manei- ra se dará a comunicação entre sistemas e usuários. Elaborar uma boa documentação auxilia na diminuição do retrabalho, na programa- ção de classes orientadas a objetos que sejam mais representativas ao problema, na utilização de recursos adequados para a construção de dispositivos e componentes necessários para a disseminação de serviços informatizados. A especificação de re- quisitos de software torna-se um artefato fundamental para a rotina dos desenvolve- dores, pois neles estão identificados os principais diagramas, as análises realizadas, podendo auxiliar na atualização de componentes existentes ou até mesmo na sua utilização em outros sistemas mais complexos, evidenciando, assim, a relevância da documentação adequada para as etapas iniciais do projeto. Sem esses fatores, difi- cilmente a reutilização dos componentes acontecerá, pois a cada nova implementa- ção, sem uma documentação adequada, elementos essenciais podem ser alterados e prejudicar o funcionamento geral do componente. Na figura a seguir, é apresenta- da a importância do planejamento de uma documentação eficiente para o sucesso do projeto. FIGURA 15 - REUNIÃO PARA DEFINIÇÃO DA DOCUMENTAÇÃO DO PROJETO Fonte: SHUTTERSTOCK, 2018. 54 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Existem etapas, de acordo com estudiosos da área, que devem ser seguidas para uma boa formação de escopo de projetos de componentes, das quais se destacam (Barners , 2009): Seleção de componentes: No escopo dos componentes, é fundamental escolher os elementos necessários para trabalhar na construção ou na utilização de componen- tes. Nesse caso, deve-se escolher, dentre os recursos necessários, os desenvolvedores que conheçam mais sobre as tecnologias definidas, os recursos gráficos e visuais que atendam corretamente às expectativas do cliente, além de identificar, na empresa em que trabalha, se não existe solução similar já desenvolvida. Nesse contexto, as alterações podem ser menores que construir um sistema integralmente do zero. As horas definidas para esse contexto de desenvolvimento, caso exista um componente similar, podem ser deslocadas para um atendimento necessário dentro do projeto, permitindo, assim, que o sistema seja desenvolvido de forma racional. Isso é valido se e somente se o componente existente foi desenvolvido mediante os critérios de qualidade de desenvolvimento de softwares. Qualificação de componentes: Essa etapa é fundamental para um desenvolvimento confiável de componentes, pois nela são averiguados aspectos de performance, con- fiabilidade e usabilidade dos componentes. Sem esses três fatores, o software estará fadado ao insucesso. Esses fatores verificarão se o componente a ser reutilizado ou desenvolvido é adequado ao contexto que ele pretende atender, identificando se existem interfaces de comunicações compatíveis, se as funcionalidades serão úteis ao novo contexto e, por fim, se ele tem aderência aos requisitos arquiteturais do sistema. Adaptação de componentes: Os componentes construídos ou reutilizados precisamser alvo do escopo do projeto sobre os principais elementos de viabilidade em rela- ção à sua adequação ao novo sistema do qual fará parte. Em grande parte dos casos, a comunicação entre sistemas ou componentes não funcionará em um primeiro mo- mento. Para tal, é necessário levantar as necessidades e os recursos fundamentais, para que os componentes tenham um funcionamento adequado e integrado. 2 David Barnes leciona nas áreas de Ciências da Informação e Tecnologia e Segurança e Análise de Risco. Seus interesses de pesquisa incluem sistemas operacionais, segurança de computadores e redes, análise forense e risco. Informações sobre cursos que ele ensina podem ser encontradas em www. personal.psu.edu/drb21. Ele tem um A.B. em economia pela Universidade de Duke e um J.D. da Escola de Direito Dickinson University. 55 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO A etapa de adaptação de componentes é uma das principais dentro do desen- volvimento, pois, se não for possível a comunicação entre os recursos utilizados, o projeto pode se tornar um fracasso. A importância de encontrar elementos adaptáveis é vivenciada, em grande parte, por brasileiros que viajam ao exterior. No Brasil, a tomada de três pinos é o padrão presente na maioria dos disposi- tivos informatizados, como notebooks e computadores, porém esse padrão só existe no Brasil. Um palestrante ou apresentador de trabalhos internacionais pode ter problemas ao utilizar os recursos de energia em outros países se não encontrar uma forma adequada de adaptar suas tomadas aos dispositivos de energia presentes nesses países. Se um palestrante não conseguir conectar seu notebook à energia, sua apresentação pode ficar comprometida. Imagine se o mesmo acontecesse com um software em produção para um cliente exigente. Portanto, jamais deixe de planejar planos contingenciais para a incompatibili- dade de comunicação presente em softwares. As interfaces de software também podem gerar conflitos nessa etapa, pois as funções presentes em uma interface podem não atender a um contexto específico de outro software no qual o componente será utilizado. Portanto, verificar todas as classes e as interfaces é fundamental para que o sistema seja adequado e pertinente ao contexto esperado. Problemas também podem surgir se o desenvolvimento de componentes for realizado por empresa terceirizada, em que a falta de padronização pode se elevar dependendo da complexidade do produto ou do prazo curto para entrega. Os ges- tores, na fase de escopo de componentes, não podem deixar passar despercebidos esses fatores. Seus impactos podem ser catastróficos ao fluxo de desenvolvimento. A figura a seguir apresenta a importância de toda a equipe averiguar os requisitos de interfaces de hardware e software do projeto de componentes. 56 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 16 - PESQUISAS EM INTERFACES DE HARDWARE E SOFTWARE PARA A INCLUSÃO DE NOVOS COMPONENTES Fonte: SHUTTERSTOCK, 2018. Composição de componentes: A composição de componentes determina qual será a infraestrutura necessária para o funcionamento do componente em outro sistema. Pode parecer um fator simples, mas, se não for levado a sério, pode comprometer todo o bom andamento do desenvolvimento e a implantação dos componentes. Nesse momento, a escolha dos elementos é preponderante para uma organização e coerência nas funcionalidades de um componente. Existem desenvolvedores que podem tender a tentar colocar vários recursos dentro de um único componente, mui- ta das vezes de forma desnecessária, transformando-o em um elemento com grande peso para a execução da aplicação. Quando se está adaptando um componente, é fundamental checar se todos os recursos obrigatórios para essa conexão e funciona- mento existem: se a linguagem em que o componente está sendo desenvolvido é adequada para o software que o espera, se existem elementos de hardwares (placas, conectores, hardwares para transmissão e/ou comunicação de dados) e de softwares (sistemas operacionais, operadores, controladores) que delimitam ou restringem o funcionamento do componente. Isso pode acontecer também no nível de código, em que classes precisam ser adaptadas, incorporadas de recursos, para representa- rem de forma adequada o contexto do software. 57 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO O sistema operacional é um software que funciona como interface entre os principais recursos de hardware e os comandos executados pelo usuário. Des- tacam-se os recursos da linha Windows e Linux. Observe nas figuras a seguir elementos presentes nesses dois sistemas operacionais. FIGURA 17 - WINDOWS Fonte: SHUTTERSTOCK, 2018. 58 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 18 - INTERFACE DO LINUX Fonte: SHUTTERSTOCK, 2018. Atualização de componentes: A atualização dos componentes deve ser feita para sanar possíveis conflitos que podem surgir na incorporação de um componente a outro contexto de software. Mudanças em interfaces de comunicação e modo de interação com o usuário são elementos presentes nessa etapa do desenvolvimento. Planejar e delimitar um tempo adequado para essa etapa é uma obrigação dos ges- tores de controle do projeto. Nessa etapa, as versões dos componentes e dos softwa- res podem sofrer alterações, e sua estrutura passa por melhorias substanciais. Etapa de escopo de componentes: Por fim, nessa etapa, deve-se avaliar se os com- ponentes existentes são reusáveis, para evitar que sejam gastas homem-hora desne- cessárias no desenvolvimento de softwares que já existem, e que somente precisa- riam ser adequados. Esse fator também deve ser avaliado pelos gestores de escopo, em que uma criteriosa avaliação sobre o tempo necessário para adequar um com- ponente pré-existente deve existir para aferir se é compensatório ou não modificar o componente ou construí-lo do zero. 59 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 3.1.1.1 EXEMPLOS DE PROBLEMAS EM ESCOPO DE COMPONENTES Quando o escopo de um projeto não é realizado de forma adequada, algumas si- tuações podem acontecer e gerar transtornos para os clientes e os desenvolvedores. Destacam-se: Problemas com retrabalho: esse fator pode gerar insatisfações em desenvolvedores e clientes. Os clientes podem se sentir insatisfeitos devido à falta de entregas no pra- zo e dentro do que eles esperavam. Se na etapa de escopo os diagramas não forem bem modelados, ou não refletirem a realidade do cliente, corre-se o perigo de se ge- rar uma versão sem funcionalidade para um cliente, ou para outro tipo de dispositivo informatizado. Problemas com infraestrutura: o contexto de necessidades de hardware e software pode impactar no funcionamento adequado de componentes. Se um modo físico de conexão não se adequar ao componente, ele não fará a comunicação com os demais dispositivos, permitindo, assim, que ele fique inoperante para o contexto para o qual ele foi desenvolvido. O desenvolvimento de softwares não permite que recursos infor- matizados sejam produzidos e não sejam aproveitados. Problemas de aumento de custos: quando o número de horas planejadas é excedi- do devido a problemas de planejamento e contextualização do software, pode tornar o projeto inviável financeiramente (para o cliente pagar, ou para a empresa manter os custos). 3.2 PRINCIPAIS OBJETIVOS DOS COMPONENTESSobre os componentes, é importante ressaltar que eles podem ser construídos em qualquer linguagem, inclusive naquelas que não são orientadas a objetos. Esse fa- tor deve ser avaliado quando dois componentes passam a se comunicar dentro de um projeto. A forma como os componentes de software podem atender a diversos projetos e, por consequência, podem realizar diversas atividades dentro de um con- junto de recursos informatizados diz muito sobre seus objetivos para os contextos informatizados. Eles tendem a auxiliar os softwares com tarefas menores, atômicas e 60 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO interpretáveis, permitindo que sejam diferenciáveis e se destaquem dentro do fun- cionamento para o usuário. Um exemplo simples são os plug-ins auxiliares, que rea- lizam tarefas fora do contexto original do software e atuam de forma a complemen- tar o funcionamento do sistema. Um plug-in de identificação biométrica tem suas funções, suas classes e suas interfaces bem delimitadas, podendo atuar em sistemas gerenciais de uma empresa realizando a validação de recursos fundamentais para a segurança do sistema. De forma geral, o objetivo de um componente representa a sua única funcionalidade para um sistema complexo, permitindo que a ideia de se- paração de contextos, formas, elementos seja notoriamente visualizada em projetos que utilizam componentes acoplados para realizar tarefas de seu funcionamento. Essa divisão de tarefas diminui a complexidade de um software, facilitando sua ma- nutenção e correção de eventuais problemas. Os componentes seguem as características de pacotes e encomendam, funcionam e provêm serviços de acordo com as requisições efetuadas pelo sistema principal. Eles são considerados sistemas autocontidos, tendo como principal característica estar envolvidos em camadas próprias e funcionarem por meio de requisições e respostas. Isso facilita a dinâmica de desenvolvimento, pois cada pedaço do seu software passa a representar características específicas. Podem se destacar como principais objetivos gerais dos componentes (Sharp, 2008) 3 : 1. Definir as tarefas a serem executadas no sistema; 2. Determinar o momento em que as atividades devem ser executadas; 3. Delimitar o grupo de sistemas, pessoas, usuários a executar um grupo de ativi- dades; 4. Padronizar as requisições de softwares e componentes; 5. Padronizar a comunicação entre dispositivos; 6. Aumentar a comunicação e o reuso em atividades de desenvolvimento de sof- tware. Porém, existem objetivos específicos a um grupo de componentes e funcionalidades. Esses objetivos atuam de forma a representar a principal função do componente para o software como um todo. Um componente de assinatura digital, por exemplo, assim como componentes de reconhecimento de voz, fala, imagem e movimento, auxiliam nas características de segurança dos sistemas. Eles são vistos pelos usuários como componentes indispensáveis para a utilização segura do software. Nesse caso, 61 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO eles também podem ser utilizados como validadores de acesso ou para confirmar uma transação importante no sistema. 3 John Sharp é o principal tecnólogo da Content Master, parte do CM Group Ltd, uma empresa de consultoria e criação técnica. Especialista em desenvol- vimento de aplicativos com o Microsoft .NET Framework e problemas de inte- roperabilidade, John produziu vários tutoriais, white papers e apresentações sobre sistemas distribuídos, serviços da Web e a linguagem C#. Ele é autor de vários livros populares, incluindo o Microsoft Windows Communication Foun- dation, o Step by Step e o Microsoft Visual C# Step by Step. Outros grupos de componentes se responsabilizam por facilitar a comunicação entre serviços de linguagens diferentes, tendo como principal objetivo participar de uma comunicação eficiente e coesa entre elementos de naturezas distintas. São exemplos as atuações ligadas à gerência e ao controle de pacotes dentro de um sistema, componentes temporais que identificam tempo, elementos ligados à audi- toria e à segurança de sistemas. Vale ressaltar também que, em dispositivos móveis, o conceito e os objetivos dos componentes estão mais fáceis de serem visualizados. Quando um dispositivo móvel é visualizado, visualizam-se objetivos e funções dife- rentes para cada um dos componentes instalados no aparelho, que vão de controle do sono até elementos para o entretenimento e a comunicação. 3.3 ABSTRAÇÃO DE COMPONENTES Todo ser humano aprende com suas experiências e vivências durante seu dia a dia. Esse conhecimento não pode ser desconsiderado e muito menos deixado de lado no desenvolvimento de componentes. A abstração é considerada a habilidade psicoló- gica que os seres humanos têm de se concentrar num certo nível de um problema ou contexto, sem levar em consideração outros fatores que não sejam interessantes para o momento. Esses elementos devem estar presentes dentro dos componentes, pois a sua atuação deve ser discreta e eficaz, permitindo que as tarefas para as quais ele foi destinado sejam executadas de maneira coerente. A abstração deve ser utili- zada como técnica de resolução de problemas nas diversas áreas de engenharia e computação, trazendo características esperadas para as soluções desenvolvidas. As linguagens de modelagem e de programação oferecem recursos para que se possa trabalhar a abstração, desde a sua modelagem, até a sua programação. 62 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO A abstração é um dos pilares da orientação a objetos. O gap semântico, que é a capacidade de trazer o mundo real para o mundo computacional, está ligado diretamente a esse contexto. O desenvolvedor deve pensar em componentes que representem ações de seres humanos sendo realizadas por computadores. A figura a seguir apresenta formas como os seres humanos imaginam a resolu- ção de problemas reais. FIGURA 19 - MÁQUINA ATUANDO NA VIDA DAS PESSOAS Fonte: SHUTTERSTOCK, 2018. 63 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Um componente é desenvolvido por meio de linguagens de programação, e suas tarefas são executadas para atender às necessidades de clientes ou de outros sis- temas informatizados. A abstração está na capacidade de o componente não ser notado enquanto um conjunto de linhas de código, mas, sim, para o contexto que ele deseja atender. Em outras palavras, quanto mais próximo do real um dispositivo computadorizado é, maior é seu nível de abstração. Áreas como a robótica utilizam fortemente esses conceitos para trazer características humanoides a robôs. Softwares que possuem um bom conjunto de mensagens, claras, eficientes e que atendam às expectativas dos usuários, permitem por algum momento confundir sua cabeça, sobre se ele está interagindo com uma máquina ou um ser humano. Portanto, qual- quer software desenvolvido em C# deve preconizar uma excelente interação com o contexto que ele pretende desenvolver, inclusive quando essa interação acontece com outro dispositivo informatizado. Existem transações, contextos, comandos em um sistema operacional realizando codificações de máquina e comunicando-se com dispositivos eletrônicos do computador que o ser humano não imagina. Essa capaci- dade torna mais aceitável a utilização de recursos computacionais e mais compreen- sível sua atuação junto a outros sistemas (Deitel, 2007) .4 4 Harvey M. Deitel, CEO da Deitel & Associates, Inc., tem 40 anos de experiênciano campo da computação, incluindo ampla experiência acadêmica e acadê- mica. Ele é um dos principais instrutores de informática e apresentadores de seminários do mundo. Dr. Deitel ganhou B.S. e M.S. graus do Massachusetts Institute of Technology e um Ph.D. da Universidade de Boston. Ele tem 20 anos de experiência em ensino universitário, Harvey M. Deitel, CEO da Deitel & Associates, Inc., tem 40 anos de experiência no campo da computação, in- cluindo ampla experiência acadêmica e acadêmica. Ele é um dos principais instrutores de informática e apresentadores de seminários do mundo. Dr. Dei- tel ganhou B.S. e M.S. graus do Massachusetts Institute of Technology e um Ph.D. da Universidade de Boston. Ele tem 20 anos de experiência em ensino universitário, incluindo a posse e atua como presidente do Departamento de Ciência da Computação da Boston College antes de fundar a Deitel & Asso- ciates, Inc. com seu filho, Paul J. Deitel. Ele é autor ou co-autor de dezenas de livros e pacotes multimídia e atualmente está escrevendo muito mais. Com traduções publicadas em japonês, russo, espanhol, italiano, chinês básico, chinês tradicional, coreano, francês, polonês e português, os textos da Deitel ganharam reconhecimento internacional. O Dr. Deitel ministrou seminários profissionais internacionalmente para grandes corporações, organizações go- vernamentais e vários ramos das forças armadas. A abstração está presente em quase todos os contextos existentes na computação e no desenvolvimento de softwares com qualidade. O conceito de função presente no contexto de orientação a objetos permite abstrair os detalhes de implementação da funcionalidade que será executada pelo código, permitindo que o usuário foque 64 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO somente as funcionalidades propiciadas, e não como ela é implementada. Outra for- ma de aplicar a abstração dos conceitos do mundo real é a utilização correta dos diagramas da UML. O uso de diagramas que descrevem o software oferece uma visão abstrata do funcionamento, independentemente de como ele está implementado. Os diagramas de classe oferecem uma visão abstrata de como estarão presentes no software as principais entidades, como elas irão funcionar e existir dentro desse con- texto. Já o diagrama de atividades permite a visualização de como essas classes, telas e interfaces irão se comunicar para a conclusão dos fatos. Outros diagramas, como os de caso de uso podem dar a ideia dos principais usuários e funcionalidades do sistema, permitindo, assim, que o usuário esqueça que o software é um conjunto de códigos de linguagem de programação e passe a visualizá-lo como um componente capaz de resolver seus problemas. Veja o caso de sistemas que trabalham como repositórios de componentes. Eles são vistos como um conjunto de soluções para facilitar a vida de desenvolvedores que necessitam de componentes prontos. A aba de componentes gráficos para a cons- trução de contêiner do C# segue esse princípio. Essa aba tem tanta importância para os desenvolvedores de software que estão aprendendo a desenvolver que muitos deles não se dão conta que se trata de um conjunto de códigos suportados por uma interface. Esse é o conceito principal de abstração, vivenciado na fase de aprendizado (Boratti, 2007). Existem regras para a construção de componentes para os dispositivos móveis. Pesquise sobre as premissas para publicar componentes e aplicativos para os principais fabricantes de dispositivos móveis. Portanto, a construção de componentes necessita de organização, conceito e que os softwares construídos sejam adequados ao contexto que devem atender. O desenvol- vimento dos softwares deve ser realizado com coerência e seguir passos organizados. 65 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO CONCLUSÃO Os componentes precisam ser planejados e documentados de maneira adequada, para que consigam atuar de forma apropriada, em conjunto com outros recursos informatizados. O planejamento de atividades, controle de especificidades, recursos e compatibilidades formam o sucesso de um componente. Esse planejamento é ne- cessário para que a empresa, os desenvolvedores e os clientes não se sintam frustra- dos com o desenvolvimento de um recurso informatizado. Os clientes desejam com- ponentes que atendam às suas necessidades e que tenham uma interface amigável, coesa, coerente e próxima da realidade. A abstração deve estar presente em compo- nentes para ser aceita pelo mercado que será atendido. Um projeto de componente bem elaborado evita a insatisfação por parte dos desenvolvedores em ter que refazer trabalhos de desenvolvimento. Para que isso não aconteça, os gestores devem pensar no escopo do projeto, definir etapas, conceitos, diagramas e documentações perti- nentes, para evitar a produção de um componente não coerente com as expectativas dos clientes e dos usuários. Quando um componente possui os recursos necessários para funcionar, um controle gerencial do seu escopo, níveis de abstração e aceitação elevados, terá como consequência um nível elevado de sucesso. 66 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que você: > Definir as principais formas de divisão adequada de componentes. > Avaliar as principais formas de comunicação de componentes que estão conectados através de meio físico. > Recordar as formas de comunicação entre dispositivos que estão em locais distintos. > Identificar os principais serviços de componentes informatizados. UNIDADE 4 67 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 4 GRANULARIDADE, LOCALIZAÇÃO E SERVIÇO DE COMPONENTES Na construção de sistemas informatizados, principalmente aqueles orientados a ob- jetos, os desenvolvedores devem “dividir para conquistar”*, porém eles devem saber como dividir e até como separá-los dentro do contexto. Nesse tipo de produção, a divisão de softwares é fundamental para atender a diversos requisitos de outros sis- temas e das necessidades de seus usuários. Aqui, entra o conceito de serviços, que também auxilia na divisão da construção de softwares. O desenvolvedor deve saber dividir os sistemas para que um software possua re- presentatividade e serviços sólidos para o contexto que deseja atender. Elementos e aspectos de comunicação entre componentes que estão separados por grandes distâncias ou estruturas físicas também devem ter atenção total por parte do desen- volvedor de componentes. A forma de localização de serviços de software mudou diversos contextos dentro da informática, como, por exemplo, a ideia de lojas com di- versos serviços de aplicativos, como o que acontece em dispositivos móveis. Portanto, os três principais conceitos apresentados nesta unidade auxiliarão a definir melhor as suas formas de trabalho e como os seus dispositivos informatizados atenderão às necessidades dos clientes ou de outros softwares. * Jargão da área de computação, utilizado no mesmo sentido das guerras. 4.1 4 GRANULARIDADE, LOCALIZAÇÃO E SERVIÇOS DE COMPONENTES 4.1.1 GRANULARIDADE DE COMPONENTES A divisão das etapas dentro de um desenvolvimento de software envolve projetos, determinações de diagramas e a divisão da construção de elementos informatiza- dos. Dentro desta etapa, a construção de pedaços de software pode gerar dúvidas de quanto o desenvolvedor deve dividir um software. A granularidade tornou-se um novo 68 Programação orientada a objetos ii FACULDADECAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO termo utilizado pelos programadores que usam componentes. Essa divisão granular permite uma avaliação mais coerente dentro da importância de um software para a rotina de um componente. A granularidade é a palavra que descreve a função forneci- da por um componente (ou conjunto de componentes) que funcionam juntos. Dentro desse conceito, pode-se descrever que a granularidade pode representar um dispositivo de assinatura digital, ou seja, um grânulo do sistema. Para um exemplo simplificado, um componente de granularidade baixa poderia oferecer a funcionali- dade de soma de dois números para compor um sistema de nota fiscal. Da mesma forma, seria a representação de um grânulo maior, se ele fosse o responsável pela transmissão da nota fiscal para outro sistema informatizado que recebe as transmis- sões de valores para o governo. Essa pequena porção do sistema também pode ser vista como um dispositivo compacto que pode gerar o desenvolvimento de softwa- re com custo baixo e, muito provavelmente, pouco personalizável (BARNERS, 2009). A figura a seguir apresenta características da granularidade de software. FIGURA 20 - DIVISÃO DE SERVIÇOS DE SOFTWARE FONTE: SHUTTERSTOCK, 2018. Sua funcionalidade é muito discreta, mas extremamente relevante para o contexto. Portanto, a criação de componentes deve ser orquestrada para que, independen- temente do tamanho, siga preceitos de serviços necessários para um software. Um componente com a granularidade alta é capaz de gerar uma parcela maior de fun- cionalidades, gerar processos mais demorados, mas também fornecer sistemas mais complexos, e que podem demorar mais tempo. Em geral, a granularidade de softwa- res pode permitir que um repositório com vários elementos úteis para os softwares utilize vários recursos. 69 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO A figura seguir exemplifica essa divisão de tarefas baseadas na arquitetura dos sis- temas. FIGURA 21 - SERVIÇOS DE SOFTWARE FONTE: SHUTTERSTOCK, 2018. A granularidade permite que se crie um conjunto de bibliotecas de softwares me- nores que podem ser solicitados à medida que o software principal necessite. Esse tipo de serviço pode ser visto como uma biblioteca de acesso a arquivos e compo- nentes, um conjunto de banco de dados, ou um sistema quase completo baseado em estruturas ou serviços, como um sistema CRM, ERP, comércio eletrônico ou outro (BORATTI, 2007). Nesse contexto, sistemas mais encorpados podem ser vistos como um arcabouço de aplicativos. Sistemas administrativos em grandes empresas são vistos como partições de pequenos sistemas que se unem para um propósito geral. A figura a seguir exem- plifica a importância de sistemas como o CRM (Customer Relationship Management) e o ERP (Enterprise Resourcing Planning) para a gestão na empresa, e como suas partes são importantes para o software. 70 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 22 - SISTEMAS ERP E SUA RELEVÂNCIA PARA A EMPRESA FONTE: SHUTTERSTOCK, 2018. Veja que na figura são apresentados os fatores de comunicação e utilização dos vá- rios módulos. Assim, espera-se que cada um dos módulos tenha um funcionamento individualizado, porém, conectado com os demais recursos presentes. Cada um dos ícones representa um módulo do sistema (RH, Compras, Financeiro) e as ações indi- viduais de cada um impactam nos demais elementos presentes no sistema. Se faltar dinheiro, não haverá compras. Se o setor de faturamento registrar o envio de valores em espécie para a conta bancária, os demais módulos poderão realizar as atividades que geram impactos financeiros. Veja que o gestor, como é demonstrado na figura, tem acesso a todos os módulos de forma interligada, permitindo assim, acompanhar de forma real e instantânea o esboço dos impactos de uma tomada de decisões em um módulo nos demais elementos. Isso favorece a evolução dos tempos, nos quais as informações são fornecidas de fontes distintas e as decisões precisam ser tomadas em tempo hábil, para que a empresa não perca representatividade dentro do mer- cado de sua atuação. Os sistemas ERP facilitam essa tomada de decisões estratégicas por atuarem com dados relevantes para o contexto, que são agrupados de forma conectada e a análise pode ser mais completa. 71 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Um sistema do tipo Enterprise Resourcing Planning (ERP) possui partes que podem funcionar de forma independente. Como exemplo, pode-se destacar o módulo de recursos humanos, o módulo contábil ou o modo de paga- mento. Para as pessoas que atuam no setor contábil, esse módulo possui diversas funcionalidades que também podem ser vistas como um sistema. Empresas que vendem essa solução podem ativar somente os módulos ne- cessários para o sistema funcionar. Pense que cada módulo ou caso de uso tem a independência de ações dentro do sistema, e podem ser requisitados à medida que a empresa necessita. Muitas empresas de software trabalham na produção de unidades menores e re- presentativas para um contexto, pois, dependendo do tamanho da empresa ou de suas condições financeiras, a contratante não precisará de todos os módulos. Nesse caso, o desenvolvimento orientado a objetos deve permitir que as funcionalida- des tenham independência quando precisarem e, ao mesmo tempo, sejam capazes de se adaptarem a outros contextos, com softwares maiores. Desse modo, esse tipo de abordagem movimenta milhões na indústria de software, pois permite que as soluções sejam feitas de forma específica para um cliente em potencial. Imagine que um sistema complexo, por não trabalhar em partes, deixe de lado muitas empresas que não podem pagar, ou não precisem de todas as funcionalidades disponibilizadas por um sistema mais robusto. Com a evolução das técnicas ágeis de desenvolvimento de software, a programação orientada por granularidade tomou grande espaço, inclusive permitindo que a mo- delagem, organização e projetização de desenvolvimento de componentes fossem mais centradas nas partes menores do sistema. A evolução de interfaces, meios de disponibilização de serviços e a evolução das linguagens de programação permitiram que a utilização de sistemas informatizados seguisse critérios “de dividir um proble- ma para conquistar uma solução, abrangendo maior número de clientes. Os soft- wares mobile também seguem essa linha de granularidade, tanto que o seu celular 72 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO possui aplicativos que seguem as suas necessidades, e os de parentes e amigos têm outra dinâmica de funcionamento. As relações pessoais também passaram a inter- ferir na rotina de produção de softwares. A evolução da orientação a objetos permite que classes, interfaces e conceitos de abstração, reuso e divisão dos problemas pas- sem a incorporar componentes mais sólidos para serem utilizados. Em alguns casos, projetos que eram para ser menores unidades de um sistema ganharam indepen- dência e destaque devido à sua atuação no mercado. Por exemplo, um componente de compras na internet pode ter o maior percentual da funcionalidade de um sistema de comércio eletrônico completo, incluindo regis- tro e login, carrinho de compras, serviços de catálogo, faturamento, correspondência, entre outras ações. A figura a seguir exemplifica a solução de compras on-line. FIGURA 23 - EXEMPLO DESOLUÇÕES COMPLETAS PARA COMPRAS ON-LINE Fonte: SHUTTERSTOCK, 2018. A Netflix também segue essa mesma linha, pois é um serviço que propicia o cadastro, catálogo de vídeos e também pode se conectar a dispositivos como celulares, com- putadores e TVs. Ele pode ser acessado como um componente individual, mas, na realidade, é uma estrutura de componentes integrados para fornecer uma solução de granularidade alta. 73 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Portanto, o desenvolvedor de softwares, em conjunto com a equipe de projetos, deve definir o tamanho da divisão das funcionalidades. Nesse momento, é possível anali- sar as formas de atuação, dispositivos que são fundamentais para o funcionamento correto de outro elemento informatizado. Um projeto dividido deve respeitar as indi- vidualidades das soluções, mas deve pensar de forma coordenada sobre como elas atuarão na resolução de problemas. Ambas têm seus pontos positivos e negativos. A personalização dos componentes, a forma de distribuição e o público-alvo deter- minam o tamanho da granularidade de seu software. Imagine que você irá desenvol- ver um sistema de compra e venda para o maior hipermercado do Brasil e também irá atender um supermercado de bairro. O desenvolvedor precisa entender que um software com alta granularidade pode ser mais adequado à empresa de maior porte, que pode escolher quais módulos, serviços ou interações que o cliente deseja. Inclu- sive, deve ser avaliada a integração do software com outros elementos presentes na empresa. Já para o supermercado de menor porte, o menor grânulo permite que as funcionalidades presentes no software atendam à maioria dos serviços necessários para o seu funcionamento. Nesse contexto, é mais fácil a empresa se adequar às fun- cionalidades e rotinas do componente do que o contrário. Normalmente, esse fator acontece porque os componentes de granularidade baixa são discretos, e você acaba escrevendo mais códigos (maior fidelização a suas características centrais) de ligação, que fazem esses componentes funcionarem juntos, da maneira como o cliente deseja. Esse tipo de componente com granularidade baixa acaba se tornando bem a “cara” do requisitante, com códigos, telas, cores e fontes mais a cargo do cliente que está solicitando. Situação inversa acontece com grandes empresas, pois quando se tra- balha em duas empresas que utilizam o mesmo sistema de gestão, por exemplo, as telas, a aparência e, muitas vezes as funcionalidades são as mesmas. Nesse contexto, o desenvolvedor deve escrever um código mais genérico para atender a pormenores requisitados pelos clientes contratantes. Essas adequações são simples, pois em pro- jetos com grandes granularidades, as funcionalidades são pensadas de forma dinâ- mica, para funcionarem em conjunto e atenderem, de forma genérica, às principais necessidades de um grupo-alvo de clientes. Em um componente de granularidade alta, o código de ligação é escrito no interior do componente; portanto, na maioria das vezes, a padronização ou a adequação a situações específicas são definidas por parâmetros (inclusive com um caso de uso específico para a gestão de parâmetros no sistema). Os parâmetros definem termos e formas de prestação de serviços entre os componentes informatizados para atender as vontades do cliente. 74 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4.1.2 LOCALIZAÇÃO DE COMPONENTES Após a construção de elementos informatizados, eles precisam ser armazenados em locais onde outros dispositivos podem requisitar seus serviços. Esses locais fornecem repositórios de serviços importantes para armazenar componentes e softwares com- pletos. Esses tipos de repositórios facilitam a organização e o fornecimento de técni- cas e serviços importantes para softwares relevantes. Os componentes podem estar localizados em diversos locais lógicos, como um mes- mo servidor de interação local ou servidores diferentes como, por exemplo, o de co- municação remota. O ideal é que o desenvolvedor abstraia e defina a localização dos componentes, facilitando sua consulta e publicando os meios de comunicação com outros aplicativos, podendo agir da mesma forma, independentemente de os componentes estarem na mesma máquina ou em máquinas diferentes. Esse tipo de localização define a forma como os softwares irão fazer as devidas requisições ao sistema de armazenamento de componentes. Também definem a velocidade das requisições e, dependendo do local onde estão instalados, podem ter referências de segurança para as requisições. A figura a seguir explicita um exemplo de serviços que compartilham o mesmo repositório de componentes em locais distintos. Isso acontece, por exemplo, quando em um mesmo servidor de uma loja de compras online estão armazenados os dados de todas as peças do estoque de uma empresa. A solicitação para a compra de um item desse estoque pode partir de computadores que estão totalmente distantes e sem comunicação entre si. Esse recurso de reposi- tório precisa receber as requisições e realizar as demandas de atualização no saldo dos produtos restantes para que não sejam vendidos elementos de forma repetitiva. Outro exemplo bem prático que pode fazer alusão ao que é expresso na figura é que esse repositório explanado pode representar o repositório de arquivos de uma loja virtual de celular. Todos os celulares de uma marca ou um grupo podem ter acesso a esses recursos de lojas virtuais, podendo fazer os downloads dos elementos que se- jam mais interessantes a suas necessidades. Esse repositório controla os downloads efetuados e, ao mesmo tempo, também gere os novos recursos, que são disponibi- lizados para todos os participantes desse repositório. Essa ideia de agrupamento e organização de pequenos elementos pode ser visualizada quando você acessa seu celular e vê vários recursos que podem ser baixados de sua loja virtual. 75 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO FIGURA 24 - REPOSITÓRIO DE COMPONENTES COMPARTILHANDO SERVIÇOS DE SOFTWARE Fonte: SHUTTERSTOCK, 2018. A localização de um componente pode definir regras de requisições de di- versos elementos para a solicitação de serviços de componentes. Redes lo- cais são responsáveis por transmissões mais rápidas. Outros servidores mais distantes podem gerar tráfego de requisições, portanto, o desenvolvedor deve promover recursos com o código para que existam meios de manter as requisições de componentes, mesmo que exista tráfego de requisições demorado ou instável. Para abstrair a localização de componentes, o ideal é que os mecanismos usados para interação dos dispositivos responsáveis pelas requisições sejam usados tam- bém para comunicação remota, isto é, permitam a requisição de elementos local- mente distantes. 76 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Já os mecanismos de interação local permitem que elementos localizados dentro da mesma rede ou do mesmo local lógico possam se comunicar. Isso funciona como, por exemplo, a requisição de serviços instalados na mesma rede ou no mesmo com- putador (DEITEL, 2007). BARNERS (2009) afirma que outros exemplos de localização de componentes po- dem permitir a comunicação por meio de: • chamada de procedimento/método, • notificação de eventos/mensagens, • mecanismos de comunicação remota, • chamada remota de proced./método (RPC), • notificação de eventos/mensagens remotos. A figura a seguir representa um exemplo de formas distintasde comunicação de ser- viços na nuvem. As tecnologias cloud e iot (internet das coisas) funcionam por meio da comunicação de dispositivos informatizados conectados na internet. Eles são co- nectados para realizar solicitações de tarefas mediante comandos de ferramentas existentes para serviços que conectam hardware e software. Os dispositivos estão fisi- camente distantes, se comunicam na internet para abrir portas, acender luzes, dentre outros serviços. FIGURA 25 - COMUNICAÇÃO DE DISPOSITIVOS LOCALMENTE SEPARADOS POR MEIO DE REQUISIÇÕES E MENSAGENS Fonte: SHUTTERSTOCK, 2018. 77 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO A chamada remota de procedimento/método é capaz de identificar uma chamada local por meio das requisições de um software a um repositório de componentes. Os dispositivos que se comunicam, em geral, estão em má- quinas diferentes; portanto, a requisição precisa ser enviada como uma men- sagem pela rede, na qual o suporte de execução se encarrega de enviá-la. Outro fator importante é a localização de componentes prontos. Eles são responsá- veis por buscar serviços fornecidos pelo componente, considerando a semelhança de seus conteúdos. Isso acontece, por exemplo, com as lojas de componentes para download no celular. Cada loja tem os tipos de componentes adequados para os dis- positivos esperados para cada tipo de aparelho. Cada loja virtual possui suas características, suas linguagens de programação e suas premissas, para que os desenvolvedores publiquem seus componen- tes ou aplicativos. O motivo é que cada linguagem precisa de uma comuni- cação esperada para que os dispositivos sejam compatíveis com o tipo de celular que deseja obter os componentes. Isso também pode acontecer com softwares específicos para tipos distintos de computadores ou notebooks. O que muitas vezes facilita essa comunicação é o sistema operacional, que é outro tipo de componente capaz de gerenciar interfaces (GRENNE, 2008). 78 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 4.1.3 SERVIÇOS DE COMPONENTES Os componentes, assim como os softwares, têm por essência fornecer facilidades àqueles que o utilizam. Dentro da principal referência dos componentes está a pres- tação de serviços de software em escalas menores. O componente deve fornecer ser- viços a outros componentes ou softwares, que os utilizarão por meio das interfaces que devem ser desenvolvidas para facilitar a comunicação e a troca de mensagens, que é a principal essência da orientação a objetos. Os serviços de um software são a essência de sua existência, permitindo, assim, delimitar suas ações, formas de comu- nicação e interfaces, para desempenhar suas funções. As principais funções de um componente envolvem troca de requisições para aten- der demandas. Geralmente, o elemento que faz a requisição espera um serviço ou uma mensagem de execução de atividades. Esses elementos funcionam de forma complementar uns aos outros. Espera-se que cada serviço seja representativo e liga- do às principais características dos componentes (SHARP, 2008). Deve ser possível ajustar a forma como os serviços são executados, por meio de mu- danças de parâmetros ou com requisições adequadas, que podem ser facilitadas por interfaces de software. O componente deve se sujeitar à composição de outros componentes para que possam fornecer adequadamente os recursos necessários. Ele deve procurar ser independente de outros componentes, para que possa atuar como serviço (recurso computacional necessário para a execução de uma atividade) a um grande número de softwares. Quando um componente chega nessa situação, significa que o desenvolvedor chegou ao desenvolvimento pleno da orientação a ob- jetos. A figura a seguir exemplifica os diversos serviços que soluções informatizadas podem propiciar. 79 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO FIGURA 26 - SERVIÇOS DE SOFTWARE Fonte: SHUTTERSTOCK, 2018. Os componentes de software, quando utilizam corretamente os conceitos de abstração, possuem características que deixam bem claro quais servi- ços são capazes de fornecer. Um componente de impressão de boletos, por exemplo, deve ser significativo para o sistema para o qual fornece serviços, em que a impressão, a comunicação e o registro de boletos devem ser efe- tuados de maneira síncrona e atômica, realizando a transmissão de boletos de um sistema comercial. Cada um tem sua funcionalidade e seu serviço para um usuário ou outro sistema. Os componentes devem ser utilizados de maneira consciente dentro do contexto dos sistemas informatizados. Sua forma, divisão e serviços só devem ser utilizados se forem necessários a execuções de tarefas do fluxo principal dos sistemas. 80 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO CONCLUSÃO Nesta unidade, foram apresentadas formas de organizar, guardar e permitir a co- municação de serviços importantes de componentes de software. A forma como os serviços são apresentados para os componentes deve dizer muito sobre como eles são produzidos. Os elementos de software devem se comunicar por meio de requi- sições a repositórios de componentes, permitindo que sejam realizadas as principais chamadas aos serviços providos pelos softwares. A quantidade de serviços que será providenciada pelos componentes depende da granularização com que o compo- nente foi desenvolvido. As partes de um componente devem ser independentes, eficientes e prover serviços completos a outros grupos de softwares. Quanto mais complexo for um componente, deve-se pensar na forma como ele deve ser produzido. Serviços mais simples podem ser feitos por grânulos menores, nos quais cada um deles tenha um serviço represen- tativo e, de preferência, uma localização próxima de seu principal requisitor. A forma como os grânulos são guardados facilita a comunicação entre dispositivos dependentes. Quanto mais próximos os dispositivos estiverem, mais fácil fica sua co- municação. Muitas vezes, é necessário um espaço maior para seu armazenamento. Os componentes podem estar salvos em elementos locais, como um computador ou um serviço local. Da mesma forma, existem componentes salvos em dispositivos remotos distantes, permitindo que as requisições de serviços concorram com várias requisições de outros dispositivos requisitados ao mesmo tempo. O desenvolvedor deve prever tais situações para que a troca de mensagens entre os componentes não seja prejudicada. 81 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Apresentar os conceitos de reúso de software. > Avaliar as principais técnicas de refatoração de códigos de componentes. > Apresentar as principais técnicas de reúso. > Apresentar conceitos relevantes sobre a refatoração de software. UNIDADE 5 82 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 5 REÚSO E REFATORAÇÃO DE COMPONENTES DE SOFTWARE Nesta unidade, serão tratados os principais conceitos de qualidade de componentes que já estão construídos e, por algum motivo, apresentam características inconsisten- tes que podem prejudicar o desempenho do componente na execução de suas ati- vidades. Isso pode acontecer por problemas de heranças de classe, atributos ou mé- todos obsoletosque geram tarefas desnecessárias para os componentes. Portanto, as técnicas capazes de organizar e melhorar a qualidade dos componentes são defi- nidas pelas técnicas de refatoração e serão apresentadas de forma teórica e prática. Outros elementos sobre a qualidade de software é a capacidade de permitir que componentes organizados conversem ou interajam com outros softwares. O reú- so permite que outros softwares sejam utilizados pelos componentes e vice-versa, através de adaptações na organização de códigos e melhorias necessárias para que os componentes possam conversar. Nessa seção, esses conceitos serão praticados e exemplificados. Vamos lá? 83 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 5.1 REÚSO E REFATORAÇÃO NOS COMPONENTES DE SOFTWARE 5.1.1 REÚSO DE COMPONENTES DE SOFTWARE O desenvolvimento de software passou por diversas inovações nos últimos tempos devido à necessidade de atender cada vez mais os clientes e que possuíam nível de exigência elevado. Essa mudança gerou diversas ferramentas para facilitar a produti- vidade, a eficiência e as boas práticas nos programas a serem produzidos. Alguns des- ses algoritmos e métodos têm efeitos tão positivos nas aplicações que outros projetos também podem se beneficiar de suas funcionalidades. A esse processo chamamos de reúso de software, que se trata da utilização de programas e métodos consoli- dados em diversas aplicações, às quais inicialmente ela não foi planejada para sua utilização. De uma forma mais simples de ser compreendido, o reúso de software consiste em aplicar um componente a outras funcionalidades que ele não atuava. Imagine que um componente de assinatura digital era utilizado para assinar os do- cumentos que tramitavam em um sistema. Agora, com o reúso de componentes, ele pode atuar em um sistema de registro de pedidos on-line, onde a confirmação de uma compra também pode ser feita por assinatura digital. Esse processo acontece constantemente em fábricas de software, quando em um sistema, são elaborados métodos que resolvem os problemas de todos os sistemas que a empresa desenvolve (métodos de máscara de campos, métodos de validação, envio de e-mail, geração e controle de pagamentos de GRU, DAE ou DARF, entre outros). De acordo com Barners (2009), o reúso de software pode atuar em diversas maneiras para permitir o compartilhamento de métodos e programas: • reúso de métodos e objetos: o tipo de reúso mais utilizado nos dias atuais. Ele permite que objetos, métodos ou funcionalidades de outros sistemas pos- sam atuar de maneira eficiente em um novo software. • reúso de sistemas: consiste na utilização de um sistema dentro de outro sis- tema. Alguns softwares governamentais necessitam de funções dos sistemas de pagamento, orçamento e de patrimônio para que os sistemas adminis- trativos funcionem de forma correta. Quando um sistema faz parte de outro, nesses moldes, é uma definição desse tipo de reúso. 84 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO • reúso de componentes: um tipo de reúso menos usual, mas também impor- tante para utilização de estruturas e sistemas complexos. Estão ligados dire- tamente à utilização de componentes da arquitetura de software, onde cada componente é responsável por uma funcionalidade atômica do sistema. A escolha da técnica de reúso deve seguir as necessidades do cliente e do sistema que os componentes reutilizados vão atender. Uma escolha inade- quada pode gerar muito retrabalho e também inviabilizar o novo software, transformando-o em um dispositivo lento e ineficiente. Segundo Sharp (2008), as vantagens da utilização do reúso estão ligadas a aspectos diversos como: 1. Diminuição no tempo de desenvolvimento, evitando construir um elemento que já funciona corretamente e foi devidamente testado. 2. Diminuição dos custos de produção do software, pois um número menor de ho- ras será utilizado para a adaptação das novas funcionalidades, em comparação com a necessidade de produzi-las. Esses aspectos também estão acompanhados de uma maior produtividade da equi- pe de desenvolvimento, pois os esforços para a produção, pesquisa e desenvolvimen- to de novos componentes serão otimizados. Aliados a isso, a economia dos custos envolvidos na produção de software também diminuirão vertiginosamente. Já as desvantagens do reúso estão ligadas ao controle de versões e compatibilidades entre os softwares envolvidos, prejudicando futuras evoluções do programa e uma maior atenção, por parte dos gestores de projetos. Além disso, a orientação a objetos deve estar presente de forma adequada, senão a utilização do reúso pode trazer mais 85 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO transtornos do que propriamente benefícios, exigindo diversas adaptações e corre- ções no código. Os maiores problemas de insucesso de reúso de um software estão ligados à falta de conhecimento da equipe de desenvolvedores na maneira com que o software está organizado (arquitetura) ou desenvolvido (componentes, camadas, entre outros). A FIG. 27 representa de forma sintética as vantagens e desvantagens do reúso e seus possíveis impactos. FIGURA 27 - MATRIZ DE AVALIAÇÃO ENTRE REÚSO E PRODUTIVIDADE + reuso - produtividade = - clientes prospectados - contratos fechados + reuso + produtividade = + eficiência + valor agregado + fortalecimento portfólio - reuso - produtividade = + manutenção corretiva - eficiência - valor agregado - enfraquecimento do portfólio - reuso + produtividade = + produtos + domínios do conhecimento + colaboradores Fonte: https://engenhariasoftware.wordpress.com/category/gestao-de-projetos/page/4/ Planejar o reúso é fundamental para ele aconteça de forma adequada. A seguir, Boratti (2007) apresenta alguns passos e ações importantes a serem tomadas: • Envolvimento dos gerentes de projetos, gestores e stakeholders. • Foco em um domínio ou atividade a ser reutilizada. 86 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO • Ciclo de vida do software. • Conhecimento e experiência da equipe no software ou solução. • Prazos para o desenvolvimento. As principais técnicas de reúso estão listadas a seguir, de acordo com Sommerville (2011): Utilização de bibliotecas e de aPi: classes implementam métodos que podem ser utilizados por diversos sistemas. São as principais técnicas que representam os com- ponentes. Framework de aplicação: implementam camadas, métodos e padrões de desenvol- vimento que facilitam a vida do desenvolvedor. Atuam como um conjunto de ferra- mentas com um único propósito. Padrões de design e arquitetura: padronizam as aplicações através de metodologias comumente utilizadas pela comunidade de desenvolvedores. Já tem um arcabouço de utilização para atacar e resolver os principais problemas existentes em softwares. Existem formas comumente utilizadas na comunidade de software como os padrões SOLID e GRASP. Componentes: integração de funcionalidades oriundas de subsistemas (um exem- plo típico é um componente que permite que documentos sejam assinados digi- talmente). encapsulamento de sistemas legados: quando o que já foi desenvolvido não pode ser descartado, eles podem fazer parte em sua totalidade de outro sistema. arquitetura orientada a serviços: desenvolvimento de sistemas compartilhando ser- viços de negócio para serem reutilizados, através da composição de novas soluções. desenvolvimento orientado a aspectos: separação de prioridades (modularização). Para o desenvolvimento orientado a objetos,o reúso de aplicações, métodos e fun- ções são importantes para a melhoria da produtividade da equipe de software. Se- guir os padrões adequados e criar classes e objetos, de acordo com as especificações, 87 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO auxilia de forma bem prática a utilização do reúso aplicando a orientação a objetos. Nesse caso, para ilustrar o contexto de utilização de reúso, você pode utilizar uma classe que contém atributos que podem se enquadrar dentro de diversos contextos. Para demonstrar a utilização da OO no contexto de reúso, vamos utilizar uma classe chamada Usuario, que possui atributos específicos desse contexto, como id, login, senha, nome, e a sua data de cadastro. A FIG. 28, a seguir, apresenta o diagrama de classes da UML que permite sua modelagem. FIGURA 28 - CLASSE USUARIO Fonte: Elaborado pelo autor, 2019. A classe Usuario poderá atuar em sistemas de diversos contextos para representar um ator que interaja com o sistema. Quando a classe é desenvolvida em OO, ela con- segue ser facilmente adaptada e alterada; caso necessário, para atender a demandas bem específicas do novo software. Essa classe pode trabalhar em diversos contextos, como um software para um super- mercado, para uma locadora de veículos, pois esses sistemas necessitam de usuários para acessarem o sistema. O reúso consiste em utilizar essa classe em vários contex- tos existentes e que eles sejam adequados. 5.1.1.1 PROJETOS DE COMPONENTES COM REÚSO Para conquistar cada vez mais espaço junto ao mercado, empresas de desenvolvi- mento de software buscam melhorar as soluções já desenvolvidas, permitindo que elas atendam a um público maior, através de maior número de funcionalidades e 88 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO casos de uso. Esses tipos de projetos tendem a evoluir à medida que as necessidades dos usuários estão sendo sanadas. Empresas públicas tendem a ampliar os serviços disponibilizados devido a opiniões do público em geral. Essas evoluções devem ser feitas permitindo que os softwares mantenham seu padrão de utilização e estejam adaptadas às novas demandas. A utilização do reúso deforma consciente, adequada e previne diversos problemas que podem ocorrer. Para que projetos possam ser evo- luídos de forma coesa e sem maiores problemas, alguns fatores devem ser seguidos, conforme Greene (2008): • Atualizar a documentação incluindo as novas funcionalidades. • Definir corretamente as ampliações de funcionalidades da solução. • Verificar os impactos da inclusão de novas funcionalidades nas que já funcio- navam. • Utilizar o reúso nos contextos que sejam permitidos. • Realizar testes de regressão nas atividades que já existiam e avaliar os impactos. Os softwares também necessitam acompanhar as novas tendências para que o usuá- rio final não fique desmotivado a usá-lo. O desenvolvedor deve acompanhar as evo- luções tecnológicas, de versões de API ou bibliotecas utilizadas, buscando manter seu software dentro dos padrões de uso e aceitação do público em geral. A FIG. 29 apresenta a importância das etapas de um projeto de reúso de componentes. FIGURA 29 - PRINCIPAIS ETAPAS QUE DEVEM EXISTIR EM REÚSO DE COMPONENTES Fonte: SHUTTERSTOCK, 2019. 89 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 5.2 REFATORAÇÃO DE COMPONENTES DE SOFTWARE A refatoração é uma técnica empregada na qualidade de desenvolvimento de soft- ware que facilita a manutenção e organização das linhas de código, de modo que esse código seja reutilizado em outras soluções, além de preconizar a organização de contextos dentro das classes, agrupando termos que podem ser organizados dentro de uma classe ou método. Refatoração é uma técnica disciplinada para reestruturar um trecho de códi- go existentes, alterando sua estrutura interna sem alterar seu comportamen- to observável. A seguir, são apresentadas formas de refatoração para auxiliar na qualidade do soft- ware, de acordo com Boratti (2007): extrair método: transforme o fragmento em um código cujo seu nome explique o propósito do método. Essa metodologia funciona quando um método torna-se ex- tremamente complexo, e partes iguais podem virar um novo método. Código Original. void imprimeHistoricoAluno (Aluno aluno) { Double nota=0; // imprime dados aluno Console.writeln (“***************************”); Console.writeln (“*** Dados do Aluno ****”); Console.writeln (“***************************”); 90 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO // calcula dados dos alunos while (aluno.temMaisNotas ()){ Aluno listaAluno = (Aluno) aluno.proximoAluno (); nota += listaAluno.getNota (); } // imprime detalhes Console.writeln (“nome: ” + aluno.getNome()); Console.writeln (“nota total: ” + nota); } Como fica após a refatoração void imprimeDadosHistoricoAluno (Aluno aluno) { Double nota=0; imprimeCabecalhoAluno(aluno); calculaNotasAluno(aluno, notas); imprimeDadosAluno(aluno, notas); } Cada bloco virará uma função interna, facilitando a organização do código. mover método: esta técnica se fundamenta na criação de um novo método com corpo similar na classe que ele mais usa. Transforme o método original em uma de- legação ou, se for o caso, remova-o. Veja a curiosidade a seguir. Ela apresenta mais exemplos dessa técnica. Veja esse exemplo. Se um método faz mais sentido em outra classe, ele deve ser removido para ela. Essa experiência você adquirirá através do funciona- mento do sistema. Link para acesso: http://ramonsilva.net/desenvolvimento/tecnicas-comuns- -de-refatoracao/ http://ramonsilva.net/desenvolvimento/tecnicas-comuns-de-refatoracao/ http://ramonsilva.net/desenvolvimento/tecnicas-comuns-de-refatoracao/ 91 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO renomear método: esta refatoração é utilizada para adequar métodos que não re- presentam àquilo que elas realmente fazem. Isso acontece depois que várias fun- cionalidades são adicionadas a um método, e ele muda sua natureza, podendo ser incrementado ou modificado para que a leitura do método fique mais simples. Outro exemplo que é necessária a refatoração de um nome de método é quando a em- presa muda os padrões de construção de softwares, dando a certos tipos de classes nomes específicos ligados às regras de negócio que eles visam atender. //Código original private String identificacaoRfid; public String setIdentificacaoRfid(String identificacaoRfid){ this. identificacaoRfid = identificacaoRfid; } Public void getIdentificacaoRfid(){ return this. identificacaoRfid; } // Para ficar mais adequado a um contexto private String rfid; public String setRfid(String rfid){ this.rfid=rfid; } Public void getEtiquetaDeVerificacaoEstoque(){ return this.rfid; } Os nomes de alguns métodos ficaram mais curtos, e o de retornar a etiqueta ficou mais representativo ao contexto, permitindo que novos programadores consigam entender do que se trata esse tipo de abordagem em qualquer momento do código. mover atributo: troque todas as referências da variável temporária pela expressão fixa dentro de um software. Isso auxilia a entender e agrupar argumentos em classes corretas. Ao mover os atributos, você poderá criar novas classes. 92 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Atributos podemser removidos para melhorar o contexto. Isso pode partir através de um diagrama de classes ou de banco de dados. Analise o contexto para facilitar a mudança dos elementos. Veja o exemplo no link a seguir. Link: http://ccsl.ime.usp.br/borboleta/bancodedadosevolutivos Encapsular atributo: apesar de ser um requisito obrigatório da orientação a objetos, o encapsulamento das informações auxilia na organização e na proteção da qualidade do código. Avalie quais atributos podem e devem ser protegidos pelo encapsulamen- to, utilizando novas classes para que outras classes ou métodos não a utilizem sem as devidas precauções. //Classe Pessoa Public Class Pessoa { private String nome; private int idade; private String cidadeNascimento; private Date dataNascimento; private String nomeMedico; private String tipoSanguineo; private String pais; } //Classe pessoa com o encapsulamento em endereço. public Class Pessoa { private String nome; private int idade; private Certidao certidao; } Link: http://ccsl.ime.usp.br/borboleta/bancodedadosevolutivos 93 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO Public Class Certidao{ private String cidadeNascimento; private Date dataNascimento; private String nomeMedico; private String tipoSanguineo; private String pais; } // A classe Certidao encapsulou todos os dados de nascimento da pessoa den- tro de um único contexto. Existem diversas técnicas de refatoração de código que podem ser aplicadas. Elas devem ser pensadas com os conceitos de orientação a objetos, sem perder a sua efi- ciência no reúso. Quer saber mais sobre a refatoração? Veja o link que tratam do tema em: <https://www.slideshare.net/ivanricarte/introducao-a-refatoracao>. Este livro apresenta boas técnicas de refatoração. Para ler, acesse: https://goo.gl/iXnCYS. Formas de refatoração podem e devem ser aplicadas em todas as partes do softwa- re. Na chamada camada de visão, onde estão localizadas as páginas html ou xhtml, técnicas de refatoração podem incluir ou atualizar componentes. A FIG. 30 apresenta elementos que podem ser utilizados na refatoração de códigos nas páginas web. <https://www.slideshare.net/ivanricarte/introducao-a-refatoracao> https://goo.gl/iXnCYS 94 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO FIGURA 30 - ELEMENTOS PRESENTES NAS INTERFACES WEB Fonte: SHUTTERSTOCK, 2019. CONCLUSÃO Uma excelente forma de disseminar cada vez mais os componentes de software é utilizar elementos de qualidade no projeto de linhas de código. Esses elementos per- mitem que mais componentes sejam utilizados em diversos sistemas, diminuindo custos, tarefas e o desenvolvimento de soluções que já estão prontas, evitando assim a possibilidade de erros presentes em códigos para soluções que já estavam em ple- no funcionamento. Aprendemos também que existem abordagens de qualidade em linhas de código que permitem que o código seja organizado, seguindo critérios mais lógicos, possibilitando que sua organização gere melhor rendimento, visibilida- de e maturidade nos códigos desenvolvidos. As técnicas de refatoração podem ser excelentes para organizar sistemas que apresentam problemas diversos, como o de- sempenho inadequado, registros de lixo digital em banco de dados, entre outros. A união das técnicas de refatoração permite que o reúso seja aplicado de forma mais simples e intuitiva, de modo que os sistemas legados, componentes e softwares de- senvolvidos tenham qualidade em toda a sua estrutura, desde o planejamento até a sua execução. Assim os custos de empresas e de microempresários do ramo de soft- wares diminuem, e os recursos podem ser alocados em outras áreas. Para que elas sejam usadas com qualidade os conceitos de orientação a objetos devem ser sólidos e bem coerentes. 95 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO OBJETIVO Ao final desta unidade, esperamos que possa: > Apresentar os principais elementos presentes nos padrões de projeto orientado a objetos. > Apresentar as principais técnicas do padrão SOLID. > Auxiliar a compreensão sobre os conceitos de qualidade do aluno por meio de técnicas e padrões de programação orientada a objetos. UNIDADE 6 96 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO 6 PADRÕES DE PROJETO PARA CONSTRUÇÃO DE COMPONENTES COM REÚSO Para a determinação de classes e componentes com codificações corretas, foram fei- tos durante a História diversos estudos que facilitaram a obtenção da qualidade nas linhas de código de sistemas informatizados. Dentre os estudos realizados, foi criado um conjunto de premissas que facilitaram a vida de desenvolvedores e projetistas de componentes. Estamos falando dos padrões de projetos que reúnem boas práticas e definições de grandes pesquisadores na área de computação, para definir elementos que são fundamentais para que os componentes construídos sejam reutilizados por outros softwares ou empresas. A práticas foram definidas como cinco etapas que de- vem ser executadas para que classes, objetos e interfaces tenham seu papel estrutu- rado dentro do conjunto dos softwares. Portanto, a orientação a objetos vai utilizar os critérios definidos por padrões de desenvolvimento de softwares para trazer eficiên- cia e coerência aos elementos produzidos. Vamos juntos nos estudos? 97 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 6.1 PADRÕES DE PROJETO PARA A CONSTRUÇÃO DE COMPONENTES COM REUSO Neste capítulo vamos abordar elementos fundamentais para padronizar os seus pro- jetos de componentes. 6.1.1 INTRODUÇÃO AOS PADRÕES DE SOFTWARE A engenharia de software e a construção de sistemas são áreas da informática que trabalham na construção de sistemas com qualidade, possibilitando aos desenvol- vedores elaborarem seus softwares utilizando técnicas mais apuradas e eficientes. Dessa forma, evita-se que aspectos de má qualidade de softwares sejam utilizados na produção de sistemas importantes para as empresas, elevando, assim, os custos de produção e a insatisfação de clientes. Após vários estudos e avaliações da qualidade dos códigos entregues, constatou-se que alguns elementos não deveriam ficar de fora do desenvolvimento de software, principalmente aqueles ligados à construção de códigos por parte dos desenvolvedores, porque estavam gerando cada vez mais atrasos nos cronogramas e insatisfação nos clientes. O livro Agile, principles, patterns, and practices (MARTIN, 2006), produzido pelo fa- moso Tio Bob, traz características relevantes sobre a qualidade no código de desen- volvedores. Além de informar sobre aspectos de desenvolvimento ágil e de técnicas para melhorar o reúso do código, ele apresenta cinco boas práticas de organização e construção de código que foram comumente conhecidas pelo padrão SOLID, que representa as cinco primeiras siglas de cada uma dessas características importantes para a qualidade do software, e são listadas a seguir (MARTIN, 2000): Single Responsability Principle, Open/Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle. Quando esses princípios são executados de forma correta dentro do contexto do de- senvolvimento do software, a quantidade de erros tende a diminuir, o código pode ser utilizado de uma forma dinâmica e a manutenção evolutiva/corretiva torna-se mais fácil de ser executada. 98 Programação orientada a objetosii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Deseja conhecer mais sobre a história e alguns princípios de qualidade em codificação e como eles se tornaram referência mundial em qualidade de projetos orientado a objetos? Acesse o link https://goo.gl/pmXyZ5 e veja a tradução do livro que originou os padrões de software. 6.1.2 PRINCÍPIO DE RESPONSABILIDADE ÚNICA O princípio de responsabilidade única (SRP) auxilia na compreensão de um dos prin- cipais pilares da orientação a objetos: a coesão. Quando se analisa a coesão, tende-se a pensar sobre a capacidade de um contexto ser bem explicado através somente de suas partes. Da mesma forma, uma classe coesa na orientação a objetos é aquela que deve ter somente um motivo para mudar, pois só uma responsabilidade é ligada a ela. Imagine que você trabalha em uma classe Veiculo que possui os seguintes métodos: public void cadastrarVeiculo(Veiculo veiculo).... public int calcularMultasVeiculo(Veiculo, Multa multa).. public void listarVeiculosNaoLicenciados()... Veja que, no contexto analisado, existem duas funções que são pertinentes ao con- texto de uma classe Veiculo, mas é notório que um dos métodos não apresenta ca- racterísticas em comum com a classe Veiculo. Porém, você pode pensar que uma multa faz parte de um veículo, contudo, nesse contexto de software, a classe que deveria ter o método de calcular multas deveria ser uma classe Multa. 99 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO O princípio de responsabilidade única auxilia o desenvolvedor a entender que uma classe deve tratar única e exclusivamente do contexto ao qual ela pertence, pois em situações que serão necessárias correções é mais fácil trabalhar com contextos iguais. Quando se tem uma classe com mais de uma função contextual (classe de Veicu- lo atuando com cálculo de multas), você perde a capacidade de rastreamento de problemas, dificulta a manutenção do código e aumenta a análise de impacto de mudanças em uma classe, pois a cada nova mudança deve-se verificar se as funcio- nalidades em outra classe que estão ligadas ao contexto analisado também não so- freram alterações. Tais fatores são prejudiciais para a utilização do reúso de software, pois essa classe deverá ser utilizada com outras que podem não pertencer ao novo contexto que ela está sendo utilizada (BARNERS, 2009). A figura 31 apresenta o conceito de única responsabilidade para não sobrecarregar as funções do sistema. FIGURA 31 - DESTAQUE DAS RESPONSABILIDADES EM GRANDES EMPRESAS E SISTEMAS Fonte: SHUTTERSTOCK, 2019. 100 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO A classe a seguir permite a conexão e a busca de dados diretamente em um banco de dados. Veja que o programador programou a classe de forma a não respeitar o SRP. A classe trata de pesquisas no banco de dados relativo a disciplinas, porém o foco do método implementado é uma lista que retorna professores. O programador utilizou juntamente com o C# uma linguagem chamada hql (Hibernate Query Language). Por mais que exista um objeto disciplina que compõe a query, não é correto esse método ficar nessa classe, pois a resposta obtida será uma lista de professores. public class DisciplinaDAO extends AppDAO { @PlcQuery(“querySel”) public native List<ProfessorEntity> findList( PlcBaseContextVO context, @PlcQueryOrderBy String dynamicOrderByPlc, @PlcQueryFirstLine Integer primeiraLinhaPlc, @PlcQueryLineAmount Integer numeroLinhasPlc, @PlcQueryParameter(name=”id”, expression=”obj.id = :id”) Long id, @PlcQueryParameter(name=”nome”, expression=”obj.nome like :nome || ‘%’ “) String nome, @PlcQueryParameter(name=”cargaHoraria”, expression=”obj.caragaHora- ria = :cargahoraria”) int cargaHoraria, @PlcQueryParameter(name=”disciplina”, expression=”obj1 = :disci- plina”) Disciplina ); } 6.1.3 PRINCÍPIO DE SEGREGAÇÃO DE INTERFACES Esse princípio é voltado para o cuidado na construção de interfaces, permitindo que os métodos de uma estrutura de interface sejam coerentes dentro do ambiente apli- cado. Como se sabe, ao implementar uma interface, o usuário deve implementar to- dos os métodos abstratos da interface, pois ela cria . Quando se tem métodos em de- 101 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO masia, pode ser necessário fazer implantações em classes que podem não aproveitar de forma nenhuma o novo método. Por isso, as interfaces devem ser enxutas e per- mitir que somente os métodos pertinentes ao seu contexto sejam implementados. O Princípio de Segregação de Interface (ISP) nos diz que os clientes (classes) não de- vem ser forçados a implementar interfaces que eles não usam, portanto não seja ge- nérico nas interfaces, para que, por exemplo, uma classe Industria não tenha que im- plementar métodos ligados a classes de Funcionarios ou Produtos. O ideal é construir uma interface para cada um dos seus contextos, permitindo, assim, que cada classe só implemente o que ela deve fazer e que tenha uma razoabilidade lógica dentro de seu contexto. Dessa maneira, quando alterações acontecerem em somente uma das classes, elas não refletirão em outras classes e gerarão grande quantidade de códigos. Veja exemplos de Segregação de Interfaces no link: https://robsoncastilho. com.br/2013/04/14/principios-solid-principio-da-segregacao-de-interface- -isp/ 6.1.4 PRINCÍPIO DO ABERTO FECHADO O Princípio do Aberto Fechado (OCP) envolve a seguinte definição: os elementos de software devem ser abertos para a extensão e fechados para modificações. Apesar de ser uma definição simples, envolve muitos aspectos da qualidade de desenvolvimen- to de software. Os programas e seus principais componentes devem estar aptos a implementarem o conceito de abstração de códigos, permitindo, assim, criar códigos novos ao invés de utilizar os existentes quando desejo implementar um comporta- mento de um código existente para novas funcionalidades solicitadas. https://robsoncastilho.com.br/2013/04/14/principios-solid-principio-da-segregacao-de-interface-isp/ https://robsoncastilho.com.br/2013/04/14/principios-solid-principio-da-segregacao-de-interface-isp/ https://robsoncastilho.com.br/2013/04/14/principios-solid-principio-da-segregacao-de-interface-isp/ 102 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO Apesar de esse princípio parecer ir contra os preceitos de reúso de software, ele é extremamente importante para a qualidade do desenvolvimento de aplicativos. Um software orientado a objetos deve permitir a extensibilidade, sendo que um compor- tamento é implementado e transmitido as demais classes, evitando maior codifica- ção de linhas de código. Quando uma funcionalidade já está funcionando, o ideal é permitir que outras classes usem ou adaptem suas funções, sem alterar a codificação original (BORATTI, 2007). Os comportamentos que possibilitam ao OCP estar presente no código são a heran- ça, as interfaces e a composição. Quando a modelagem prevê que uma herança ou uma interface possa difundir métodos de maneiras e funcionamentos distintos, o ideal é alterar as necessidades pontuais nas classes, evitando maior propagação de erros de código. class Matricula { void efetuarMatricula(String tipo, Integer codigo, Double valor) { if (“POS”.equals(tipo)) { new IntegracaoFaculdade().matricularPos(codigo, valor); } else if (“GRADUACAO”.equals(tipo)) { new IntegracaoFaculdade().matricularGraduacao(codigo, valor); } else if (“ENSINOMEDIO”.equals(tipo)) { new IntegracaoFaculdade ().matricularEnsinoMedio(valor); } } } Essa classe precisará de mudanças sempre que um novo tipo de matrícula surgir. Podemos adequar: class Matricula { void efetuarPagamento(IntegracaoFaculdade integracaoFaculdade, DadosPa- gamento dadosPagamento) { integracaoFaculdade.matricular(dadosPagamento); } } Considere que IntegracaoFaculdade e DadosPagamento são interfaces e po- dem ter várias implementações. 103 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO 6.1.5 PRINCÍPIO DE SUBSTITUIÇÃO DE LISKOV A Substituição de Liskov (LSP) é um princípio que nos informa sobre o melhor fun- cionamento da herança entre classes, cuja definição é: classes derivadas devem po- der ser substituídas por suas classes base. Isso significa que uma classe derivada deve ser estendida de sua classe base, sem alterar o seu comportamento. A utili- zação do polimorfismo é essencial nesse contexto. Em classes em que a hierarquia de heranças é bem estabelecida e cada classe consegue realizar normalmente seu comportamento, dizemos que o LSP está dentro da conformidade esperada. Porém, quando existem problemas complexos de comportamento de classes que deviam agir com um comportamento A e realizam um comportamento B, o princípio não foi seguido corretamente. Com a substituição de Liskov, podemos dizer que sempre que uma classe aguarda uma instância de A, podendo ser substituída por uma instância de A ou de B, pode- mos constatar que nesse princípio toda classe base pode ser substituída por uma subclasse na sua cadeia de herança (SOMMERVILLE, 2001). Na LSP, uma subclasse deve reescrever os métodos de sua classe pai, onde não seja possível a quebra de comportamento da classe base para o contexto em que ela já funcionava. Em outras palavras, se você usar uma herança e no momento que sobres- crever um método da classe pai fazer com que ele tenha comportamento totalmen- te distinto do esperado pela classe base, você estará violando o referido princípio. Veja mais sobre essa situação no exemplo clássico do quadrado e do retângulo. Pela geometria tradicional, podemos identificar o quadrado como sendo um retângulo em que a base e a altura são iguais. Ao implementar uma herança de quadrado (sub- classe) para o retângulo (base), a alteração de implementação da base e da altura a ser feita em métodos sobrescritos na classe do quadrado pode violar o comporta- mento nativo do retângulo, permitindo que objetos sofram alterações não espera- das em suas respostas. No exemplo a seguir verificamos a classe eletrodoméstico, que será a base, e os filhos serão as classes Ventilador e Climatizador. Elas têm um comportamento muito parecido, porém um climatizador pode operar no modo de aquecimento, devido aos diferentes modos de ligar o eletrodoméstico. Para resolver tal problema, deve-se utilizar uma classe abstrata na classe base chamada ligar, e ela deve ser implementada em cada um dos métodos dos filhos. 104 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO class Eletrodomestico{ private float tensao; private String marca; private String tipo; private String nome; } class Ventilador extends Eletrodomestico { private boolean ligar; public boolean geLigarVentilador(){ return ligar=true; } } class Climatizador extends Eletrodomestico { private boolean ligar; private boolean aquecer; private boolean modoAquecer=false; public float geLigarClimatizador (){ if(aquecer) this.modoaquecer=true; return ligar=true } } class Empresa{ private Date data; public void ligarEletrodomesticos(List eletrodomesticos){ for(Eletrodomesticos e : eletrodomestico){ if(eletrodomestico.getTipo().equals(“Ventilador”)){ System.io.println(eletrodomestico.getNome() + “ Ligado----- “ + eletrodomestico. geLigarVentilador()); } 105 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO if(eletrodomestico.getTipo().equals(“Climatizador”)){ System.io.println(eletrodomestico.getNome() + “ Ligado----- “ + eletrodomestico.geLigarClmatizador (true)); } } } } Resolução: class Eletrodomestico{ private float tensao; private String marca; private String tipo; private String nome; abstract void ligar( ); } 6.1.6 PRINCÍPIO DE INVERSÃO DE DEPENDÊNCIAS O princípio da inversão de dependência (DIP) preconiza que módulos de alto nível não devem depender de módulos de baixo nível, permitindo, assim, que ambos de- pendam de abstrações. Já as abstrações não devem depender de detalhes, mas sim os detalhes dependerem das abstrações. Com isso, classes não ficam tão vulneráveis a pequenas mudanças relacionadas a detalhes de implementações. Para construir classes que sigam esses princípios, os seguintes passos devem ser se- guidos: • Todas as variáveis membro da classe devem ser interfaces ou classes abstratas. • Todos os pacotes contendo classes concretas devem se comunicar somente através de interfaces ou classes abstratas. 106 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO • Nenhuma classe deve derivar de uma outra classe concreta. • Nenhum método deve sobrescrever um método já implementado. • Todas as instâncias de objetos devem ser criadas através de Padrões de Proje- tos de criação como Factory. De forma geral, não devemos depender de implementações, e sim de abs- trações. Vamos observar o seguinte bloco de código: public class Motor { public void Ligar() { } } public class Carro { private Motor motor; public void DarPartida() { motor.Ligar(); } } Agora observe que a implementação da classe Carro depende diretamente da classe Motor, ou seja, qualquer manutenção ou nova implementação deve obrigatoriamente ocorrer na classe Motor. Agora observe o seguinte código: public interface IMotor { public void Ligar(); } public class Motor implements IMotor { public void Ligar() { } } 107 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO public class Carro { private IMotor motor; public void DarPartida () { motor.Ligar(); } } Perceba que não temos mais dependência da implementação da classe, e sim da sua interface. CONCLUSÃO O Padrão SOLID é fundamental para a qualidade de linhas de código, pois com ele o desenvolvedor pode melhorar qualidade da interação com outros componentes e, ao mesmo tempo, diminuir a quantidade de códigos desnecessários. Para tanto, delegue somente uma responsabilidade ao contexto da classe e utilize interfaces de forma organizada, buscando diminuir a complexidade do sistema. Outra característica relevante é que a herança deve ser bem organizada, pois ela po- derá gerar quebras de paradigmas do padrão SOLID. Não se esqueça de preconizar a dependência de interfaces, e não das classes. E por fim, a aplicação do padrão SOLID facilita o reúso e diminui a complexidade do software. 108 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO REFERÊNCIAS BARNERS, David.Programação orientada a objetos com java. 4. ed. Prentice hall, 2009. BORATTI, Isaías Camilo. Programação orientada a objetos em java. Visual Books, 2007. DAMAS, Luis Manuel Dias. Linguagem “C”. 10. ed. Rio de Janeiro: LTC, 2007. 410p. DEITEL, Harvey M. C#: como programar. São Paulo: Pearson Makron Books, 2007. 1153p. GREENE, Jhennifer; STEELMAN, Andrew. Use a cabeça: C#. Rio de Janeiro: Alta Books, 2008. 618p. ROCHA, H. Programação Orientada a Objetos com Java2SE, 2003. Disponível em <http:// argonavis.com.br/download/java2.html>. Acesso em: 09 dez. 2018. SCHILDT, Herbert. C completo e total. São Paulo: Pearson Makron Books, 1997. 827p. SHARP, John. microsoft visual C# 2008: passo a passo. Porto Alegre: Bookman, 2008. 624p. SILVA FILHO, Antonio Mendes da. introdução à programação orientada a objetos. Rio de Janeiro: Campus, 2010. BARNERS, Davi. Programação orientada a objetos com java. 4. ed. Prentice Hall, 2009. BORATTI, Isaías Camilo. Programação orientada a objetos em java. Visual Books, 2007. DAMAS, Luis Manuel Dias. Linguagem “C”. 10. ed. Rio de Janeiro: LTC, 2007. DEITEL, Harvey M. C#: como programar. São Paulo: Pearson Makron Books, 2007. GREENE, Jhennifer; STEELMAN, Andrew. Use a cabeça: C#. Rio de Janeiro: Alta Books, 2008. SCHILDT, Herbert. C completo e total. São Paulo: Pearson Makron Books, 1997. http://argonavis.com.br/download/java2.html http://argonavis.com.br/download/java2.html 109 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO SHARP, John. microsoft visual C# 2008: passo a passo. Porto Alegre: Bookman, 2008. BAR- NERS, Davi. Programação orientada a objetos com java. 4. ed. Cidade: Prentice Hall, 2009. BORATTI, Isaías Camilo. Programação orientada a objetos em java. Cidade: Visual Books, 2007. DAMAS, Luis Manuel Dias. Linguagem “C”. 10. ed. Rio de Janeiro: LTC, 2007. 410 p. DEITEL, Harvey M. C#: como programar. São Paulo: Pearson Makron Books, 2007. 1153 p. GREENE, Jhennifer; STEELMAN, Andrew. Use a cabeça: C#. Rio de Janeiro: Alta Books, 2008. 618 p. SHARP, John. microsoft visual C# 2008: passo a passo. Porto Alegre: Bookman, 2008. 624 p. BARNERS, Davi. Programação orientada a objetos com java. 4. ed. Prentice hall, 2009. BORATTI, Isaías Camilo. Programação orientada a objetos em java. Visual Books, 2007. DAMAS, Luís Manuel Dias. Linguagem “C” “C”. 10. ed. Rio de Janeiro: LTC, 2007. 410p. DEITEL, Harvey M. C#: como programar. São Paulo: Pearson Makron Books, 2007. 1153p. GREENE, Jhennifer; STEELMAN, Andrew. Use a cabeça: C#. Rio de Janeiro: Alta Books, 2008. 618p. SHARP, John. microsoft visual C# 2008: passo a passo. Porto Alegre: Bookman, 2008. 624p. BARNERS, Davi. Programação orientada a objetos com java. 4. ed. Belo Horizonte: Pear- son, 2009. BORATTI, Isaías Camilo. Programação orientada a objetos em java. Florianópolis: Visual- Books, 2007. DAMAS, Luís Manuel Dias. Linguagem C.10. ed. Rio de Janeiro: LTC, 2007. 410 p. 110 Programação orientada a objetos ii FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017SUMÁRIO DEITEL, Harvey M. C#: como programar. São Paulo: Pearson Makron Books, 2007. 1.153 p. GREENE, Jhennifer; STEELMAN, Andrew. Use a cabeça: C#. Rio de Janeiro: Alta Books, 2008. 618 p. MARTIN, Robert C.; MARTIN, Micah. agile principles, patterns, and practices in C. EUA: Pearson Education, 2006. MARTIN, Robert C. design principles and design patterns. Object Mentor, n. 34, v. 1, p. 597, 2000. SHARP, John. Microsoft visual C# 2008: passo a passo. Porto Alegre: Bookman, 2008. 624 p. SOMMERVILLE, Ian et al. software engineering. 9th ed. EUA: Pearson Education, 2011. EAD.MULTIVIX.EDU.BR CONHEÇA TAMBÉM NOSSOS CURSOS DE PÓS-GRADUAÇÃO A DISTÂNCIA NAS ÁREAS DE: SAÚDE • EDUCAÇÃO • DIREITO • GESTÃO E NEGÓCIOS 111 FACULDADE CAPIXABA DA SERRA/EAD Credenciada pela portaria MEC nº 767, de 22/06/2017, Publicada no D.O.U em 23/06/2017 Programação orientada a objetos ii SUMÁRIO EAD.MULTIVIX.EDU.BR CONHEÇA TAMBÉM NOSSOS CURSOS DE PÓS-GRADUAÇÃO A DISTÂNCIA NAS ÁREAS DE: SAÚDE • EDUCAÇÃO • DIREITO • GESTÃO E NEGÓCIOS FIGURA 1 - Diagrama de Classes FIGURA 2 - Diagrama de Casos de Uso FIGURA 3 - Diagrama de Sequência FIGURA 4 - Criação de três objetos Casa com suas respectivas características FIGURA 5 - Exemplo de diagrama de componentes FIGURA 6 - Interface programada na linguagem C# FIGURA 7 - Contêiner de conteúdo representando um calendário FIGURA 8 - Interface do Visual Studio FIGURA 9 - Exemplo de interação com o usuário durante transferência e cópia de arquivos FIGURA 10 - Mensagem de aviso de um sistema computacional FIGURA 11 - Diagrama de casos de uso FIGURA 12 - Exemplo de diagrama de sequência da UML FIGURA 13 - Exemplo de diagrama de componentes FIGURA 14 - Planejamento de etapas do escopo de projeto de componentes FIGURA 15 - Reunião para definição da documentação do projeto FIGURA 16 - Pesquisas em interfaces de hardware e software para a inclusão de novos componentes FIGURA 17 - Windows FIGURA 18 - Interface do Linux FIGURA 19 - Máquina atuando na vida das pessoas FIGURA 20 - Divisão de serviços de software FIGURA 21 - Serviços de software FIGURA 22 - Sistemas ERP e sua relevância para a empresa FIGURA 23 - Exemplo de soluções completas para compras on-line FIGURA 24 - Repositório de componentes compartilhando serviços de software FIGURA 25 - Comunicação de dispositivos localmente separados por meio de requisições e mensagens FIGURA 26 - Serviços de software FIGURA 27 - Matriz de avaliação entre reúso e produtividade FIGURA 28 - Classe Usuario FIGURA 29 - Principais etapas que devem existir em reúso de componentes FIGURA 30 - Elementos presentes nas interfaces web FIGURA 31 - Destaque das responsabilidades em grandes empresas e sistemas 1 Revisão de conceitos de orientação a objetos e Conceitos de componentes 1.1 1. Revisão de Conceitos de Orientação a Objetos e Conceitos de Componentes 1.1.1 Introdução ao desenvolvimento de softwares orientado a objetos 1.1.2 Classes e Objetos 1.1.3 Atributos e Métodos 1.1.4 Introdução aos componentes de software 1.1.4.1 Exemplos de utilização de componentes Conclusão 2 Interfaces, contêineres, interação e projetos de componentes 2.1 INTERFACES, CONTÊINERES, INTERAÇÃO E PROJETOS DE COMPONENTES 2.1.1 Interfaces 2.1.1.1 Exemplos de interfaces 2.1.2 Contêineres 2.1.3 Interação 2.1.4 Projetos CONCLUSÃO 3 Escopo, objetivo e abstração de componentes 3.1 Conceito de escopo de componentes 3.1.1 Recursos utilizados no escopo de componentes 3.1.1.1 Exemplos de problemas em escopo de componentes 3.2 Principais objetivos dos componentes 3.3 Abstração de componentes Conclusão 4 Granularidade, Localização e Serviço de Componentes 4.1 4 GRANULARIDADE, LOCALIZAÇÃO E SERVIÇOS DE COMPONENTES 4.1.1 Granularidade de componentes 4.1.2 Localização de componentes 4.1.3 Serviços de componentes Conclusão 5 Reúso e Refatoração de Componentes de software 5.1 REÚSO E REFATORAÇÃO NOS COMPONENTES DE SOFTWARE 5.1.1 Reúso de componentes de software 5.1.1.1 Projetos de componentes com reúso 5.2 Refatoração de componentes de software Conclusão 6 Padrões de projeto para construção de componentes com reúso 6.1 Padrões de projeto para a construção de componentes com reuso 6.1.1 Introdução aos padrões de software 6.1.2 Princípio de responsabilidade única 6.1.3 Princípio de segregação de interfaces 6.1.4 Princípio do aberto fechado 6.1.5 Princípio de substituição de Liskov 6.1.6 Princípio de Inversão de dependências Conclusão REFERÊNCIAS