Jump to content
targa

PHP Uso dos métodos __get e do __set

Recommended Posts

Boa tarde!

 

Desculpe, caso seja um tema básico, pois estou entrando no mundo do PHP OO agora.

Criei uma classe que teria umas quantidade grande de atributos e com os gets e sets, o netbeans começou alertar que a classe deveria ter no máximo 200 linha.

Em uma consulta com o objetivo de diminuir, encontrei os métodos __get e __set e surgiu algumas dúvidas:

  • Apesar de ter toda a estrutura, isto seria mesmo Orientação a Objeto? Não seria o mesmo que tornar os atributos publico, uma vez que você chama "$classe->atributo"?
  • O melhor caminho não seria, refatorar a classe em classes menores ou esta é um boa pratica de programação?
  • O que acontece com os recursos de autocompletar, tem com ativá-los?

 

Obrigado.

Share this post


Link to post
Share on other sites

 

Citar

 netbeans começou alertar que a classe deveria ter no máximo 200 linha.

Oush.

Tem sentido isso?

Já vi alguns argumento a respeito de JavaScript por deixar no cache do navegador, mas linguagem php desconheço.

Será q tem a ver com esse padrão?!

https://www.youtube.com/watch?v=gB5Gej0O400&t=121s

(Recomendo fortemente esse canal)

 

 

 

Citar

O melhor caminho não seria, refatorar a classe em classes menores ou esta é um boa pratica de programação?

O tamanho da classe não interefere em boa ou má pratica e sim como está estruturado o seu projeto.

 

Alguns principios pro exemplo SOLID:

http://forum.imasters.com.br/topic/510435-solid-principio-da-responsabilidade-unica/

 

https://pt.wikipedia.org/wiki/Injeção_de_dependência

 

Da uma lida tmb nesse post, parece bastante com seu contexto.

https://forum.imasters.com.br/topic/545070-como-implementar-solid-sem-violar-seus-principios/

 

 

Se quiser posta seu código, a galera com mais tempo de vivência em O.O. pode dar um help

 

 

Hoje quando alguém cita qualidade de código lembro dos Design Patterns, 


 - Factory Method
 - Abstract Factory
 - Simple Factory
 - Bridge
 - Builder
 - Composite
 - Adapter
 - Chain Of Responsability
 - Strategy
 - Proxy
 - Dependency Injection
 - Singleton

Share this post


Link to post
Share on other sites

Nossa, quanta informação boa!

Repensei bastante nas varias possibilidades de refatorar o código.

Algumas coisas, não conhecia e tive estudar outras ainda estou abstraindo?

 

Estou postando parte do Código para caso queiram olhar ou dar algumas sugestões.

Este código foi gerado com base no livro PHP - Programando com Orientação a Objeto.

Se tiverem algumas dicas de outros livros, agradeço.

<?php
class Maquinas extends Classe {
    private $id;
    // equipamento
    private $nome;
    private $dataCadastro;
    private $dataInstalacao;
    private $responsavel;
    private $destinacao;
    // hardware 0/5
    private $especificacao;
    private $marca;
    private $modelo;
    private $serialNumber;
    private $patrimonio;
    // software 0/2
    private $so;
    private $software;
    private $softwarePrincipal;
    private $softwareAdicionais;
    // Rede 0/5
    private $ip;
    private $nomeServidor;
    private $localLogico;
    private $alias;
    private $monitoramentoWhatsup;
    // Infra 
    private $tensao;
    private $amper;
    // Aquisição/Lotação/Convenio
    private $especificacao;
    // Assistencia Técnica 0/7
    private $processo;
    private $empresa;
    private $telefone;
    private $situacao;
    private $inicioVigencia;
    private $fimVigencia;
    private $valor;
    // informações adicionais 0/1
    private $infoAdicionais;
    // não agrupados
    private $switch;
    private $contrato;
    private $assinatura;
    private $observacao;

    public function __construct() {
        parent::__construct();
    }
	
	// método que faz o mapeamento para auxiliar na geração de SQL baseado no livro
  	// foram feitas alterações para auxiliar na geração de formulários
  	// e para que consiga obter os atributos do objetos com nome diferente da coluna da tabela.
  	// cada chamada de método aqui, penso em criar um objeto para criar uma agregação/composição não sei ainda.
    protected function defineCampos() {
        $this->getCampos()->addCampo("id", "codigo", true, "cod");
        $this->addCamposEquipamentos();
        $this->addCamposHardware();
        $this->addCamposSoftware();
        $this->addCamposRedes();
        $this->addCamposInfra();
        $this->addCamposAssistencia();
        $this->getCampos()->addCampo("infoAdicionais", "Informações Adicionais", true, "outrasi");
        $this->addCamposNaoAgrupados();
    }

    private function addCamposEquipamentos() {
        $this->getCampos()->addCampo("id", "Grupo", true, "grupo");
        $this->getCampos()->addCampo("nome", "id", true, "nome");
        $this->getCampos()->addCampo("dataCadastro", "Data de Recebimento", true, "datac");
        $this->getCampos()->addCampo("dataInstalacao", "Data de Instalação", true, "datai ");
        $this->getCampos()->addCampo("responsavel", "Responsável", true, "resp");
        $this->getCampos()->addCampo("destinacao", "Destinação", true, "destina");
    }

    private function addCamposHardware() {
        // ...
    }

    private function addCamposSoftware() {
        // ..
    }

    private function addCamposRedes() {
        // ..
    }

    private function addCamposInfra() {
        // ..
    }

    private function addCamposAssistencia() {
        // ..
    }

    private function addCamposNaoAgrupados() {
        // ..
    }

    // gets and sets

}

 

Share this post


Link to post
Share on other sites

A classe acima de cara já viola o 1º principio do S.O.L.I.D. que é a SRP " Single responsibility principle", divida sua classe em domínios.

É melhor ter varias classes desacoplando seu objetos, do que uma tentando fazer tudo.

SOLID – Teoria e Prática – Demo + Vídeo
http://www.eduardopires.net.br/2015/01/solid-teoria-e-pratica/

 

18 horas atrás, targa disse:

Classe deveria ter no máximo 200 linha.

Meus código não passa disso, porem não utilizo Getters And Setters

De uma olhada aqui no post

PHP “deep in”: visibilidade, relevância de atributos e meta programação

Share this post


Link to post
Share on other sites
Em 22/03/2017 at 18:03, targa disse:
  • Apesar de ter toda a estrutura, isto seria mesmo Orientação a Objeto? Não seria o mesmo que tornar os atributos publico, uma vez que você chama "$classe->atributo"?
 

Continua sendo Orientaçao a Objetos (considerado, por alguns, obscurecimento da POO) . Entretanto, isso faz parte da meta programação.

http://pt.stackoverflow.com/questions/22398/o-que-é-metaprogramação

 

Em 22/03/2017 at 18:03, targa disse:
  • O melhor caminho não seria, refatorar a classe em classes menores ou esta é um boa pratica de programação?
 

Sempre deve ser refatorado em classes menores. O S.O.L.I.D., que já foi mencionado, define várias regras para isso. Outro, que gosto de lembrar, são sobre Object Calisthenics. O conceito é vindouro do Java (do livro The ThoughtWorks Anthology) e foi migrado para o PHP pelo Guilher Branco e Rafael Dohms:

https://pt.slideshare.net/guilhermeblanco/php-para-adultos-clean-code-e-object-calisthenics

 

Em 22/03/2017 at 18:03, targa disse:
  • O que acontece com os recursos de autocompletar, tem com ativá-los?
 

Não há como ativar, pois, do ponto de vista da meta programação, são irrelevantes.

 

Entretanto, apenas dizer que um classe não pode ter setters e getters é muito abrangente. A regra que, na minha opnião, melhor define quando uma classe deve ou não possuir tais métodos é a Tell, don't ask. A qual você pode ler na regra número 9 de Object Calisthenics  ou nos links abaixo:

http://wiki.c2.com/?TellDontAsk

https://pragprog.com/articles/tell-dont-ask

 

Outro ponto, sobre o limite de linhas, acaba sendo uma irrelevante, pois uma vez que tenha em mente como deve-se abstrair uma classe, raramente ela irá ficar "inchada". Com exceções para classes de regras de negócio, que essas podem sim ignorar certas regras devido a alta complexidade.

 

Assim como a meta programação, você irá encontrar N paradigmas com seus prós e contras. Ao meu ver, a meta programação gera agilidade e redução de repetição de código. Entretanto, é obscura quanto ao que um participante pode ou não fazer. Como, por exemplo, documentação a nível de código (PHPDocumentor, IDEs, etc...), correspondência de modelagem (a modelagem é apenas "similar" ao que é implementado).

 

Outro pronto, é sobre como o desenvolvedor espera que o código se comporte e como o sistema pode se comportar. Isso você pode verificar no exemplo abaixo (básico, mas ainda válido):

 

 

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Giovanird
      Olá a todos!

      Abaixo lista minha estrutura em Json. Há grupos que faltam um objeto (TIPO) e ao listar recebo o erro  por não encontrá-lo.
      Existe alguma maneira de verificar se este objeto existe e caso não, ignorar?

      Desde já agradeço a atenção.

       
      ESTUTURA JSON: [ { “titulo”: “JSON”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: novo }, { “titulo”: “HTML”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: usado }, { “titulo”: “PHP”, “data”: “20/10/2020”, “ano”: 2020 } ] CAPTURANDO OS DADOS: $titulo = $decode->titulo; $data = $decode->data; $ano = $decode->ano; $tipo = $decode->tipo;  
       
    • By maurohpg
      Estou fazendo uma gravação dos dados no banco e ao mesmo tempo eu faço upload de um arquivo pdf. 

      Acontece que a gravação do dados está ok, grava o nome do arquivo pdf no banco, mas não grava o arquivo pdf na pasta, e não me retorna nenhum erro, segue no script ou no log.
       
      Alguém pode dar uma luz no que estou fazendo errado? É bem simples, nas não encontro o erro.
       
      <?php include("../config.php"); include("verifica.php"); include("../tags.php"); $acao = strip_tags( $_GET['acao'] ); /* Informa o nível dos erros que serao exibidos */ error_reporting(E_ALL); /* Habilita a exibiçao de erros */ ini_set("display_errors", 1); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <?php echo "<?xml version=\"1.0\" encoding=\"iso-8859-2\"?".">"; ?> <title><?php echo $nomeL ?></title> <link href="css/css.css" rel="stylesheet" type="text/css" /> <!-- desenvolvido por Mauro Garcia --> <script type="text/javascript" src="../js/funcoes.js"></script> <script src="ckeditor/ckeditor.js"></script> </head> <body> <?php include("topo.php"); ?> <div id="content_interno"> <?php include("menu.php"); ?> <div id="admin"> <table width="774" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="82%"><p>INSERIR REGISTRO</p></td> <td width="18%"><a href="privacidade_add.php"><br /> </a></td> </tr> </table> <br /> <br /> <?php if( empty( $acao ) ) { ?> <form name="add" action="privacidade_add.php?acao=add" method="post" enctype="multipart/form-data"> <div class="form_add"> <table width="650" border="0" align="left" cellpadding="5" cellspacing="5"> <tr> <td colspan="4"><strong>Mostrar no site</strong></td> </tr> <tr> <td colspan="4"><select name="ativo"> <option value="1">Sim</option> <option value="0">N&atilde;o</option> </select></td> </tr> <tr> <td height="5" colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>C&oacute;digo, se n&atilde;o houver deixe em branco</strong></td> </tr> <tr> <td colspan="4"><input name="codigo" type="text" id="codigo" onfocus="dentro(this, 'Código')" onblur="fora(this, 'Código')" value="Código" size="20" maxlength="10"/></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><input name="hora" type="text" id="hora" onfocus="dentro(this, 'Data')" onblur="fora(this, 'Data')" value="Data" size="20" maxlength="10"/> dd/mm/aaaa</td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>T&iacute;tulo (At&eacute; 200 caracteres): </strong></td> </tr> <tr> <td colspan="4"><input name="nome_imovel" type="text" id="nome_imovel" onfocus="dentro(this, 'Título')" onblur="fora(this, 'Título')" value="T&iacute;tulo" size="80" maxlength="200"/></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong><font color="#FF0000">N</font><font color="#FF0000">&atilde;o esquecer de selecionar</font></strong></td> </tr> <tr> <td width="174"><select name="id_negocio_tipo"> <option value="">Categoria</option> <?php $sql = mysql_query("SELECT id, tipo FROM negocio_tipo ORDER BY tipo ASC"); while( $linha = mysql_fetch_array( $sql ) ){ echo '<option value="' . $linha['id'] . '"> ' . $linha['tipo'] . '</option>'; } ?> </select></td> <td width="192">&nbsp;</td> <td width="184">&nbsp;</td> <td width="184">&nbsp;</td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>Resumo</strong></td> </tr> <tr> <td colspan="4"><textarea name="msg" id="msg" cols="60" rows="5" onfocus="dentro(this, 'Texto')" onblur="fora(this, 'Texto')"></textarea></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>PDF</strong></td> </tr> <tr> <td colspan="4"><input id="fakeupload" name="fakeupload" class="fakeupload" type="text" /> <input id="arquivo" name="arquivo" class="foto" type="file" onchange="this.form.fakeupload.value = this.value;" /></td> </tr> <tr> <td><a href="javascript:document.add.submit();"><img src="img/bt_gravar.png" width="74" height="26" /></a></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> </div> </form> <?php } // fim da açao EMPTY if( $acao == 'add') { extract( $_POST, EXTR_OVERWRITE); // extrai os dados do POST, transformando os indices em nomes. Sobrescreve as variaveis existentes, se houver $sql1 = mysql_query("SELECT id FROM privacidade WHERE codigo='$codigo'"); $ttlCodigo = mysql_num_rows($sql1); if( !empty( $codigo ) && $ttlCodigo > 0){ echo "<script language='JavaScript'> alert('Código duplicado, informe outro código'); window.location.href='javascript:history.go(-1)' </script>"; exit; } ///////////////// TRATA if( !empty( $arquivo['name'] ) ) { if(preg_match( '/\.(pdf)+$/', $arquivo["type"])){ echo "<script language='JavaScript'> alert('Arquivo em formato inválido! Formato aceito: PDF'); window.location.href='javascript:history.go(-1)' </script>"; exit; } // Verifica tamanho do arquivo if($arquivo["size"] > 200000000) { echo "<script language='JavaScript'> alert('A imagem deve ser de no máximo 2020680 bytes'); window.location.href='javascript:history.go(-1)' </script>"; exit; } preg_match("/\.(pdf)+$/", $arquivo["name"], $ext); $imagem_nome = md5(uniqid(time())) . "." . $ext[1]; $imagem_dir = "../uploads/pdf/" . $imagem_nome; }else{ // se nao for informado nenhum arquivo echo "<script language='JavaScript'> alert('A imagem da notícia esta faltando'); window.location.href='javascript:history.go(-1)' </script>"; exit; // Repassa a variável do upload $arquivo = isset($_FILES["arquivo"]) ? $_FILES["arquivo"] : FALSE; // Caso a variável $arquivo contenha o valor FALSE, esse script foi acessado // diretamente, então mostra um alerta para o usuário if(!$arquivo) { echo "Não acesse esse arquivo diretamente!"; } // Imagem foi enviada, então a move para o diretório desejado else { // Diretório para onde o arquivo será movido $imagem_dir = "../uploads/pdf/"; // Move o arquivo // Lembrando que se $arquivo não fosse declarado no começo do script, // você estaria usando $_FILES["arquivo"]["tmp_name"] e $_FILES["arquivo"]["name"] if (move_uploaded_file($arquivo["tmp_name"], $imagem_dir . $arquivo["name"])) { echo "Arquivo Enviado com sucesso!"; } else { echo "Erro ao enviar seu arquivo!"; } } } $sql = mysql_query("INSERT INTO privacidade (id_negocio_tipo, codigo, foto_exibicao, msg, ativo, nome_imovel, hora) VALUES ('$id_negocio_tipo','$codigo','$imagem_nome','$msg','$ativo','$nome_imovel','$hora')") or print(mysql_error()); $ultimo_id = mysql_insert_id(); echo '<div id="sucesso"><font color="#5a5a5a" size="3" face="Arial, Helvetica, sans-serif"><font color="#009900" size="4"><b>Registro inserido com sucesso</b></font><br /><br /> <a href="privacidade_add.php">CADASTRAR OUTRO</a><br><br> <a href=privacidade.php>clique aqui para voltar</a> </font></div>'; } ?> </div> </div> <script> // This call can be placed at any point after the // <textarea>, or inside a <head><script> in a // window.onload event handler. // Replace the <textarea id="editor"> with an CKEditor // instance, using default configurations. CKEDITOR.replace( 'msg' ); </script> <?php include("rodape.php"); ?> </body> </html>  
    • By anabeatrizzz
      2. Por que PHP é a mais utilizada em projetos? Explique.
       
      3. São 24 anos de desenvolvimento em PHP, o que faz ele durar tanto na área da programação? Explique.
       
      4. Você acredita que o PHP vai morrer ou não? Explique.
       
      5. Explique o que seria esta HHVM que as empresas utilizam.
       
      6. PHP tem a facilidade de criar APIs, quais seriam as vantagens na hora de desenvolver aplicativos para celular? Explique.
       
      7. Explique um pouco sobre o Laravel, Zend Framework, Sympony, lumen, codelgniter que foram surgindo ao decorrer dos anos.
       
      8. “O PHP veio da WEB e da WEB ele permanecerá”. O que essa frase significaria para você? Explique.
       
      9. Como funcionariam as comunidades em PHP? Por que existem tantas pessoas ainda usando a linguagem? Explique.
       
      10. O PHP vem se modernizando durante anos, quais seriam estas evoluções dele? Explique.
    • By fideles
      Mais uma vez venho aqui pedir ajuda a vocês.
       
      Tenho um formulario que criei aqui na empresa algo bem simples, somente para sair das planilhas de excel, que seria cadastro de funcionarios.
       
      Tem os campos, matricula, nome completo, unidade de trabalho, endereço e telefone de emergencia.
       
      A parte do formulario funciona, a gravação no BD tbm, listar as informações também, ai me perguntaram se era possível um auto preenchimento dos campos colocando somente a matricula do funcionario e respondi que eu não sei porque realmente não sei.
       
      A ajuda que eu preciso de vocês seria, é possível fazer isso ? Colocar a matricula e vir do banco e preencher os outros inputs? Se sim, é possível me derem um exemplo de como funciona e eu estudar o codigo e colocar nos outros inputs.
       
      Obrigado antecipadamente. 
       
    • By tetsuo
      Boas galera?
      Às vezes subo um projeto que, despercebidamente passa um arquivo com letra maiúscula/minúscula
      E dá trabalho pra descobrir que era somente e apenas isso.
       
      Como posso resolver isso?
      Uso rWindows 10.
      Mas a hospedagem é em linux.
       
      O Docker serviria pra me ajudar com essa questão?
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.