{"id":295,"date":"2020-09-19T20:44:12","date_gmt":"2020-09-19T23:44:12","guid":{"rendered":"http:\/\/treinamentolivre.com\/?p=295"},"modified":"2020-11-18T13:03:03","modified_gmt":"2020-11-18T16:03:03","slug":"conceitos-de-oop","status":"publish","type":"post","link":"https:\/\/treinamentolivre.com\/?p=295","title":{"rendered":"CONCEITOS DE OOP (Programa\u00e7\u00e3o Orientada a Objeto)"},"content":{"rendered":"\n<p>Dois conceitos importantes a dominar em Programa\u00e7\u00e3o Orientada a Objeto s\u00e3o <strong>classe<\/strong> e <strong>objeto<\/strong>. A programa\u00e7\u00e3o orientada a objetos (seu acr\u00f4nimo em ingl\u00eas \u00e9 OOP) tornou-se popular no final dos anos 1990, quando a linguagem C++, de Bjarne Stroolstrup, passou a ser \u201ca linguagem\u201d de programa\u00e7\u00e3o dos profissionais de computa\u00e7\u00e3o. Outras linguagens orientadas a objetos como Delphi, Eiffel e Python foram usadas, mas C++ foi uma febre entre programadores. At\u00e9 hoje ela \u00e9 importante na programa\u00e7\u00e3o do produto Windows.<\/p>\n\n\n\n<p>Bertrand Meyer [Meyer, 1997] definiu o que \u00e9 \u201cqualidade de programa\u201d ou seja, as caracter\u00edsticas que fazem com que um programa seja bom. Dentre elas est\u00e1 alterabilidade (ou \u201cManutenibilidade\u201d). \u00c9 a capacidade de alterar facilmente um programa quando os requisitos s\u00e3o alterados, por exemplo. A OOP vem de encontro a esse item de qualidade.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Fatores Externos de Qualidade de Software (Bertrand Meyer)<\/strong><br><br><strong>Corre\u00e7\u00e3o<\/strong>: caracter\u00edstica do software que realiza as tarefas como foram definidas em sua especifica\u00e7\u00e3o de requisitos. <br><strong>Robustez<\/strong>: um software \u00e9 robusto se realiza as suas tarefas de forma correta mesmo quando submetido a condi\u00e7\u00f5es anormais. <br><strong>Extensibilidade<\/strong>: caracter\u00edstica de um software poder ser facilmente adaptado a inclus\u00f5es e altera\u00e7\u00f5es de requisitos. <br><strong>Reusabilidade<\/strong>: caracter\u00edstica de um software que pode ser reutilizado ao todo ou em parte por outros softwares. <br><strong>Compatibilidade<\/strong>: facilidade de se combinar o software com outros softwares. Essa caracter\u00edstica \u00e9 importante porque raramente um software \u00e9 constru\u00eddo sem intera\u00e7\u00e3o com outros softwares. <br><strong>Efici\u00eancia<\/strong>: refere-se ao bom uso que o software faz dos recursos de hardware, tais como mem\u00f3ria e processadores. <br><strong>Portabilidade<\/strong>: \u00e9 a facilidade de se utilizar o software em diferentes ambientes de hardware e software. <br><strong>Verificabilidade<\/strong>: \u00e9 a facilidade de se preparar rotinas para se verificar a conformidade do software com os seus requisitos. <br><strong>Integridade<\/strong>: \u00e9 uma caracter\u00edstica relacionada \u00e0 seguran\u00e7a de dados, programas e documentos. Integridade \u00e9 a habilidade de proteger tais componentes contra acessos n\u00e3o autorizados. <br><strong>Facilidade de uso<\/strong>: tamb\u00e9m denominada usabilidade, \u00e9 a facilidade com que o software pode ser aprendido e utilizado, inclusive por pessoas com defici\u00eancia.<br><br><strong>Fatores de Internos de Qualidade de Software<\/strong><br><br><strong>Modularidade<\/strong>: caracter\u00edstica de um software que \u00e9 constitu\u00eddo por unidades denominadas m\u00f3dulos. <br><strong>Legibilidade <\/strong>: deve ser poss\u00edvel para um programador qualquer ler e entender o programa. <br><strong>Manutenibilidade<\/strong>: facilidade de realizar manuten\u00e7\u00e3o em um software.<br><br>\u201c<em>A forma com um software \u00e9 constru\u00eddo permite atingir os fatores internos de qualidade.<\/em> <em>Os fatores internos de qualidade permitem atingir os fatores externos de qualidade.<\/em> <em>A Orienta\u00e7\u00e3o por Objetos \u00e9 um paradigma cujas caracter\u00edsticas permitem a obten\u00e7\u00e3o de software modular, leg\u00edvel e de f\u00e1cil manuten\u00e7\u00e3o.\u201d<\/em><a href=\"#sdfootnote1sym\"><sup>1<\/sup><\/a><br><br>Costuma-se usar ferramentas nos pr\u00f3prios programas\u2019, que permitem obter um <em>feedback<\/em> do usu\u00e1rio a cada momento (geralmente no fim de uma sess\u00e3o). Assim ele ou ela podem informar automaticamente sobre seu grau de satisfa\u00e7\u00e3o com o produto. Consulte a metodologia NPS (net promoter score<a href=\"#sdfootnote2sym\"><sup>2<\/sup><\/a>) e a ferramenta wootric<a href=\"#sdfootnote3sym\"><sup>3<\/sup><\/a>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><a href=\"#sdfootnote1anc\">1<\/a>&#8211; Veja [ <a href=\"http:\/\/portal6.pbh.gov.br\/dom\/Files\/unidade.pdf\">http:\/\/portal6.pbh.gov.br\/dom\/Files\/unidade.pdf<\/a> ]<\/p>\n\n\n\n<p><a href=\"#sdfootnote2anc\">2<\/a>&#8211; <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Net_Promoter_Score\">https:\/\/pt.wikipedia.org\/wiki\/Net_Promoter_Score<\/a><\/p>\n\n\n\n<p><a href=\"#sdfootnote3anc\">3<\/a>&#8211; <a href=\"https:\/\/www.wootric.com\/\">https:\/\/www.wootric.com\/<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>A programa\u00e7\u00e3o orientada a objetos (OOP) foi criada no in\u00edcio da d\u00e9cada de 1970 no Xerox Corporation&#8217;s Palo Alto Research Center<a href=\"#sdfootnote1sym\"><sup>1<\/sup><\/a>. A OOP nasceu para atender aos crit\u00e9rios de qualidade de software, para torn\u00e1-los poss\u00edveis dentro do desenvolvimento e de uma etapa at\u00e9 ent\u00e3o desprezada: a manuten\u00e7\u00e3o . <strong>[MEYER, 1997], <\/strong>citando Lientz e Swanson, observa os custos de manuten\u00e7\u00e3o de software (portanto quando j\u00e1 est\u00e1 te\u00f3ricamente pronto) por assunto:<\/p>\n\n\n\n<p><a href=\"#sdfootnote1anc\">1<\/a>&#8211; <a href=\"http:\/\/www.dba-oracle.com\/t_object_database_model.htm\">http:\/\/www.dba-oracle.com\/t_object_database_model.htm<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Assunto<\/strong><\/td><td><strong>Custo %<\/strong><\/td><\/tr><tr><td>Modifica\u00e7\u00e3o de requisitos de usu\u00e1rios<\/td><td>41,8<\/td><\/tr><tr><td>Mudan\u00e7as no formato dos dados<\/td><td>17,6<\/td><\/tr><tr><td>Corre\u00e7\u00f5es de emerg\u00eancia<\/td><td>12,4<\/td><\/tr><tr><td>Corre\u00e7\u00f5es de rotina<\/td><td>9,0<\/td><\/tr><tr><td>Mudan\u00e7as de hardware<\/td><td>6,2<\/td><\/tr><tr><td>Documenta\u00e7\u00e3o<\/td><td>5,5<\/td><\/tr><tr><td>Melhoria de efici\u00eancia<\/td><td>4,0<\/td><\/tr><tr><td>Outros<\/td><td>3,4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Estimou-se que os custos do processo de manuten\u00e7\u00e3o, chegavam a 70% do custo do software. A OOP nasceu, portanto, para baratear a manuten\u00e7\u00e3o. Vamos tomar o exemplo da mudan\u00e7a no formato de dados. Antes da OOP, quando um conjunto de dados se alterava, era preciso modificar v\u00e1rias partes do sistema: A impress\u00e3o de relat\u00f3rios, a exibi\u00e7\u00e3o dos dados na tela, a grava\u00e7\u00e3o em meio f\u00edsico, a recupera\u00e7\u00e3o, a cr\u00edtica. Com a OOP, os dados sabem como realizar essas opera\u00e7\u00f5es. Idealmente, uma modifica\u00e7\u00e3o nos dados leva \u00e0 altera\u00e7\u00e3o autom\u00e1tica das opera\u00e7\u00f5es em todo o sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Classes e objetos<\/strong><\/h2>\n\n\n\n<p>Para come\u00e7ar, OOP trabalha com classes. Uma classe define a estrutura, os tipos de dados que a estrutura cont\u00e9m e os m\u00e9todos e comportamentos usados para manipular os dados. Quando definimos uma vari\u00e1vel que faz parte de uma classe, temos um \u201cobjeto\u201d<a href=\"#sdfootnote1sym\"><sup>1<\/sup><\/a>. Muitas linguagens de programa\u00e7\u00e3o lidam de forma natural com isso JavaScript, por exemplo,  adapta o conceito de fun\u00e7\u00e3o para criar classes e seus objetos.<\/p>\n\n\n\n<p><a href=\"#sdfootnote1anc\">1<\/a> &#8211; [MEYER, 1997]\u00e9 uma excelente refer\u00eancia sobre o assunto. Veja os itens 1.3 a 2.6 da obra.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Imagine que voc\u00ea precisa fazer um programa para cadastrar armas port\u00e1teis. Em nossa defini\u00e7\u00e3o, arma port\u00e1til \u00e9 toda aquela que pode ser carregada por uma pessoa apenas. Vamos melhorar a defini\u00e7\u00e3o: arma port\u00e1til \u00e9 toda aquela que pode ser carregada por uma pessoa apenas, sem chamar a aten\u00e7\u00e3o de outras pessoas. Assim, um rev\u00f3lver, uma pistola, uma faca, um machado curto s\u00e3o armas port\u00e1teis. Suponha uma hierarquia entre essas armas:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Armas port\u00e1teis<ol><li>Armas de fogo<ol><li>pistola<\/li><li>revolver<\/li><\/ol><\/li><li>Armas de eletrochoque<ol><li>taser<\/li><li>stunt gun<\/li><\/ol><\/li><li>Armas brancas<ol><li>faca<\/li><li>punhal<\/li><li>machado<\/li><\/ol><\/li><\/ol><\/li><\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p>A lista n\u00e3o \u00e9 extensa e nem pretende ser. \u00c9 apenas um exemplo bem simples. Suponha ent\u00e3o que eu queira definir uma classe de \u201carmas port\u00e1teis\u201d, de acordo com a lista acima. Se eu definir a classe \u201cArma\u201d tenho de incluir uma informa\u00e7\u00e3o sobre o que \u00e9 essa arma: Arma de fogo, eletrochoque ou branca. Assim, parece razo\u00e1vel que eu tenha um descritor \u201cTipo\u201d, dando essa informa\u00e7\u00e3o.<\/p>\n\n\n\n<p><strong><u>Regra#1 das classes<\/u>: Toda classe precisa de um construtor, um m\u00e9todo para criar seus objetos na mem\u00f3ria.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>class Arma {<br>  constructor(Tipo, SubTipo) {<br>    this.Tipo = Tipo;<br>    this.SubTipo = SubTipo;<br>  }<br>}<\/td><\/tr><\/tbody><\/table><figcaption>Exemplo em JavaScript<\/figcaption><\/figure>\n\n\n\n<p>O trecho acima quer dizer que, na hora de criar um objeto da classe Arma, tenho de informar o tipo e o subtipo. O operador \u201cthis\u201d serve para definir uma vari\u00e1vel interna \u00e0 classe. Ele quer dizer que estou falando do Tipo que \u00e9 usado internamente ao objeto, e n\u00e3o o que \u00e9 passado por par\u00e2metro. Quer dizer tamb\u00e9m que a vari\u00e1vel Tipo informada no par\u00eantesis n\u00e3o ser\u00e1 usada l\u00e1 dentro da classe. Ser\u00e1 usada outra vari\u00e1vel de mesmo nome mas que n\u00e3o altera a primeira. O mesmo podemos dizer em rela\u00e7\u00e3o a subtipo. Confuso ? Redundante ? Vou esclarecer. O construtor \u00e9 chamado de m\u00e9todo e d\u00e1 as ordens para a cria\u00e7\u00e3o adequada do objeto na mem\u00f3ria. O segredo \u00e9 usar o comando \u201cnew\u201d. Vamos ver no console JavaScxript:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"229\" src=\"http:\/\/treinamentolivre.com\/wp-content\/uploads\/2020\/09\/image.png\" alt=\"\" class=\"wp-image-298\" srcset=\"https:\/\/treinamentolivre.com\/wp-content\/uploads\/2020\/09\/image.png 416w, https:\/\/treinamentolivre.com\/wp-content\/uploads\/2020\/09\/image-300x165.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><figcaption>Criando a classe Arma() em JavaScript.<\/figcaption><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>fogo<br>console.log(p.SubTipo)<br>revolver<br>var a=p.Tipo<br>undefined<br>a<br>\u201cfogo\u201d<\/td><\/tr><\/tbody><\/table><figcaption>Sa\u00edda do programa JavaScript.<\/figcaption><\/figure>\n\n\n\n<p>Note que todas as vari\u00e1veis (ou objetos) criados \u00e0 semelhan\u00e7a daquela classe s\u00e3o iguais em estrutura e m\u00e9todos. Se eu mudar a defini\u00e7\u00e3o da classe num programa, todos os objetos pertencentes a ela ser\u00e3o automaticamente alterados. \u00c9 isso que Bertrand Meyer quer dizer em seu estudo. Assim, l\u00e1 vem a regra#2:<\/p>\n\n\n\n<p><strong>Regra#2 das classes: Toda classe precisa ser modific\u00e1vel, sem alterar o resto do programa.<\/strong><\/p>\n\n\n\n<p>Essa regra \u00e9 desafiadora. Imagine que voc\u00ea criou o seu cadastro de armas, com suas telas, com grava\u00e7\u00e3o de informa\u00e7\u00e3o num banco de dados, com relat\u00f3rios. Se o seu cliente muda de ideia sobre as informa\u00e7\u00f5es que ir\u00e3o no cadastro, voc\u00ea precisar\u00e1 alterar o programa aquelas partes todas. Mas se voc\u00ea usar corretamente as caracter\u00edsticas da OOP, s\u00f3 precisar\u00e1 alterar um trecho: a classe <strong>Armas<\/strong>. Isso porque a classe Armas tem seus m\u00e9todos. Ela ter\u00e1, por exemplo, um m\u00e9todo para fazer relat\u00f3rio, um m\u00e9todo para gravar dados no banco de dados (no caso de Java, por exemplo), um m\u00e9todo para mostrar o cadastro numa tela de computador ou num celular etc. Assim, alterando a classe, n\u00e3o \u00e9 preciso alterar mais nada. J\u00e1 adianto que na teoria \u00e9 f\u00e1cil. Mas na pr\u00e1tica \u00e9 preciso muita disciplina.<\/p>\n\n\n\n<p>Vamos supor que, no caso de armas de fogo, s\u00f3 possam existir pistolas e rev\u00f3lveres. E vamos supor tamb\u00e9m que pistolas s\u00f3 possam ser aquelas homologadas para uso das pol\u00edcias com muni\u00e7\u00e3o .40, enquanto rev\u00f3lveres sejam apenas de uso particular, com muni\u00e7\u00e3o .38. Sabemos que essa n\u00e3o \u00e9 a realidade, mas estamos fazendo uma simplifica\u00e7\u00e3o. Nossa classe ficaria assim:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>class Arma {<br>  constructor(Tipo, SubTipo, Municao) {<br>    this.Tipo = Tipo;<br>    this.SubTipo = SubTipo;<br>    this.Municao = function(SubTipo) {<br>      var Municao = &#8220;&#8221;;<br>      if (SubTipo == \u201dpistola\u201d) { Municao = \u201c.40\u201d }<br>      else if (SubTipo == \u201drevolver\u201d) { Municao = \u201c.38\u201d }<br>      else<br>        { Municao = \u201c\u201d }<br>      return(Municao);<br>    }; \/\/ function<br>  }; \/\/ constructor<br>}; \/\/ class Arma<\/td><\/tr><\/tbody><\/table><figcaption>Altera\u00e7\u00e3o da classe em JavaScript.<\/figcaption><\/figure>\n\n\n\n<p>Eu defini uma fun\u00e7\u00e3o que vai colaborar com a inicializa\u00e7\u00e3o de todos os objetos daquela classe. Essa fun\u00e7\u00e3o \u00e9 defMunicao() e cria dados automaticamente para qualquer objeto da classe.<\/p>\n\n\n\n<p>Note que JavaScript n\u00e3o trabalha com classes do mesmo modo que C++, Smalltalk, ou Java. Ela usa uma adapta\u00e7\u00e3o atrav\u00e9s de fun\u00e7\u00f5es que lhe d\u00e3o o \u201cestilo\u201d de linguagem OOP.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Existe banco de dados orientado a objeto ? <\/strong><br><br>Primeiro precisamos refinar a pergunta. Um banco de dados orientado a objeto OODBMS \u00e9 aquele que n\u00e3o segue o modelo de linhas e colunas (ou t-uplas). ou seja, n\u00e3o segue o modelo relacional. Tal sistema torna bem f\u00e1cil traduzir as especifica\u00e7\u00f5es de modelos orientados a objetos (classes) para os m\u00e9todos de armazenamento. Considerando que os modelos baseados em classe s\u00e3o criados numa ferramenta CASE (como o Sparx Systems \/ Enterprise Architect) e que n\u00e3o tenho visto modo de traduzir automaticamente isso para om OODBMS, a resposta \u00e0 pergunta acima tem de ser: <strong>n\u00e3o<\/strong>. Apesar de tais bancos existirem em teste no \u00e2mbito das universidades, os bancos de dados mais usados s\u00e3o os relacionas Oracle, MySql, MariaDB e PostgreSQL Nenhum deles orientado a objeto. O ideal seria que o armazenamento e recupera\u00e7\u00e3o de dados do banco (ou persist\u00eancia de dados, como dizem) fosse feito com as caracter\u00edsticas da pr\u00f3pria linguagem OOP, de modo transparente. A Oracle tem feito pesquisas nesse sentido com a linguagem Java e a tecnologia DAO (Data Access Object) desde 2001. Em 2016, a Oracle publicou artigo<a href=\"#sdfootnote1sym\"><sup>1<\/sup><\/a> relacionado a OOP e a linguagem, PL\/SQL.<br><br>\u201c<em>Tr\u00eas dos fundamentos da tecnologia OO s\u00e3o classes, objetos e mensagens. Uma classe descreve um grupo de objetos que t\u00eam relacionamentos, comportamentos e tamb\u00e9m possuem propriedades semelhantes. Um objeto abrange dados e fun\u00e7\u00f5es relacionados em um pacote completamente independente. Como os objetos s\u00e3o &#8220;moldados&#8221; a partir de uma defini\u00e7\u00e3o de classe comum, cada inst\u00e2ncia de um objeto dentro de uma classe herda todos os mesmos comportamentos e defini\u00e7\u00f5es de dados. O cora\u00e7\u00e3o de um banco de dados orientado a objetos \u00e9 a persist\u00eancia de objetos, e \u00e9 o processo de armazenamento e recupera\u00e7\u00e3o de objetos que compreende o cora\u00e7\u00e3o do gerenciamento de dados do objeto.\u201d<a href=\"#sdfootnote2sym\"><sup>2<\/sup><\/a><\/em> Outro aspecto crucial \u00e9 a compatibilidade de solu\u00e7\u00f5es OOP de persist\u00eancia com aplica\u00e7\u00f5es antigas, baseadas puramente em DBMS. Uma promessa interessante que ir\u00e1 alterar o modo como os novos programas s\u00e3o feitos \u00e9 o banco de dados n\u00e3o-relacional MongoDB. Em breve estar\u00e1 dispon\u00edvel mais uma obra desta s\u00e9rie: \u201cMONGODB DE ZERO A CEM POR CENTO\u201d, falando desse not\u00e1vel produto.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><a href=\"#sdfootnote1anc\">1<\/a>&#8211; Ver [Burleson, 2020]<\/p>\n\n\n\n<p><a href=\"#sdfootnote2anc\">2<\/a>&#8211; Ibdem<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Caracter\u00edsticas das linguagens OOP<\/h2>\n\n\n\n<p>Segundo Meyer, uma linguagem orientada a classes (i.e. a objetos) precisa apresentar as seguintes caracter\u00edsticas:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>No\u00e7\u00e3o de classe<\/strong>: A no\u00e7\u00e3o de classe deve ser o conceito central da linguagem. A no\u00e7\u00e3o de classe \u00e9 introduzida em JavaScript na especifica\u00e7\u00e3o ECMA Script 2015. Na verdade, n\u00fameros s\u00e3o classes; strings tamb\u00e9m. Tanto \u00e9 verdade, que existem propriedades e m\u00e9todos para n\u00fameros, por exemplo. <br><strong>Afirma\u00e7\u00f5es<\/strong>: A linguagem deve tornar poss\u00edvel equipar uma classe com afirma\u00e7\u00f5es (pr\u00e9-condi\u00e7\u00f5es, p\u00f3s-condi\u00e7\u00f5es, e invariantes), baseadas em ferramentas para produzir documenta\u00e7\u00e3o a partir dessas afirma\u00e7\u00f5es e, opcionalmente, monitor\u00e1-las em tempo de execu\u00e7\u00e3o. <br><strong>M\u00f3dulos<\/strong>: As classes devem ser os \u00fanicos m\u00f3dulos dispon\u00edveis. <br><strong>Classes como tipos<\/strong>: Todo tipo deve ser baseado em uma classe. Em JavaScript, os tipos de dados (inteiro, ponto flutuante, booleano, indefinido, null, string, array etc), apesar de tamb\u00e9m terem m\u00e9todos de declara\u00e7\u00e3o que se assemelham aos das linguagens antigas, na verdade s\u00e3o definidos colo classes, havendo uma equival\u00eancia do m\u00e9todo comum de declarar com o m\u00e9todo de classe. No caso da linguagem, os tipos s\u00e3o classes pr\u00e9-definidas. Mesmo os operadores aritm\u00e9ticos, s\u00e3o na verdade propriedades de classes, podendo ser representados tamb\u00e9m pelos s\u00edmbolos mais tradicionais (*, \/, +. &#8211; etc). <br><strong>Computa\u00e7\u00e3o baseada em caracter\u00edsticas<\/strong>: A chamada de uma caracter\u00edstica deve ser o mecanismo prim\u00e1ria da computa\u00e7\u00e3o. <br><strong>Ocultamento da informa\u00e7\u00e3o<\/strong>: Deve ser poss\u00edvel para o criador de uma classe especificar que uma caracter\u00edstica est\u00e1 dispon\u00edvel para todos os clientes, para nenhum cliente ou para clientes espec\u00edficos. <br><strong>Tratamento de exce\u00e7\u00f5es<\/strong>: A linguagem precisa prover um mecanismo para recuperar-se de uma situa\u00e7\u00e3o anormal n\u00e3o esperada. Parra atender a essa caracter\u00edstica, o JavaScript usa as declara\u00e7\u00f5es throw, try, catch e finally. Iremos conhec\u00ea-las mais tarde. <br><strong>Tipagem est\u00e1tica<\/strong>: Um sistema de tipos bem definido deve, impondo um n\u00famero de tipos regras de declara\u00e7\u00e3o e compatibilidade, garantir a seguran\u00e7a do tipo em tempo de execu\u00e7\u00e3o nos sistemas que aceita. <br><strong>Genericidade<\/strong>: Deve ser poss\u00edvel escrever classes com par\u00e2metros gen\u00e9ricos formais representando tipos arbitr\u00e1rios. <br><strong>Heran\u00e7a simples<\/strong>: Deve ser poss\u00edvel definir uma classe como herdada de outra. <br><strong>Heran\u00e7a m\u00faltipla<\/strong>: Deve ser poss\u00edvel para uma classe herdar quantas outras forem necess\u00e1rias, com um mecanismo adequado para desambiguar conflitos de nomes. <br><strong>Heran\u00e7a repetida<\/strong>: Regras precisas devem governar o destino dos recursos sob heran\u00e7a repetida, permitindo que os desenvolvedores escolham, separadamente para cada heran\u00e7a herdada repetidamente recurso, entre compartilhamento e replica\u00e7\u00e3o. <br><strong>Genericidade restrita<\/strong>: O mecanismo de genericidade deve suportar a forma restrita. <br><strong>Redefini\u00e7\u00e3o<\/strong>: Deve ser poss\u00edvel redefinir a especifica\u00e7\u00e3o, assinatura e implementa\u00e7\u00e3o de um recurso herdado. <br><strong>Polimorfismo<\/strong>: Deve ser poss\u00edvel anexar entidades (nomes nos textos do software representando objetos de tempo de execu\u00e7\u00e3o) para objetos de tempo de execu\u00e7\u00e3o de v\u00e1rios tipos poss\u00edveis, sob o controle do sistema de tipos baseados em heran\u00e7a. <br><strong>Dynamic binding<\/strong>: Chamar um recurso em uma entidade sempre deve acionar o recurso correspondente ao tipo do objeto de tempo de execu\u00e7\u00e3o anexado, que n\u00e3o \u00e9 necessariamente o mesmo em diferentes execu\u00e7\u00f5es da chamada. <br>I<strong>nterroga\u00e7\u00e3o de tipo em tempo de execu\u00e7\u00e3o<\/strong>: Deve ser poss\u00edvel determinar em tempo de execu\u00e7\u00e3o se o tipo de um objeto est\u00e1 em conformidade com um tipo estaticamente determinado.<br><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dois conceitos importantes a dominar em Programa\u00e7\u00e3o Orientada a Objeto s\u00e3o classe e objeto. A programa\u00e7\u00e3o orientada a objetos (seu acr\u00f4nimo em ingl\u00eas \u00e9 OOP) tornou-se popular no final dos anos 1990, quando a linguagem C++, de Bjarne Stroolstrup, passou a ser \u201ca linguagem\u201d de programa\u00e7\u00e3o dos profissionais de computa\u00e7\u00e3o. Outras linguagens orientadas a objetos &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/treinamentolivre.com\/?p=295\" class=\"more-link\">Continue lendo<span class=\"screen-reader-text\"> &#8220;CONCEITOS DE OOP (Programa\u00e7\u00e3o Orientada a Objeto)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-295","post","type-post","status-publish","format-standard","hentry","category-programacao"],"_links":{"self":[{"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/posts\/295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=295"}],"version-history":[{"count":9,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/posts\/295\/revisions"}],"predecessor-version":[{"id":336,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=\/wp\/v2\/posts\/295\/revisions\/336"}],"wp:attachment":[{"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/treinamentolivre.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}