Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

}

 

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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):

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.