Ir para conteúdo

Arquivado

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

claudiojuniorfabiao

Abstração de classes

Recommended Posts

Oi, galera!

 

Bem, acredito estar postando na área certa, apesar de isso também estar relacionado com a estrutura da aplicação e não necessariamente PHP.

 

É o seguinte, estou criando uma aplicação orientada a objetos; nela preciso de algumas funções comuns como cadastro de clientes, cadastro de funcionários, alguns produtos cadastrados, é básico, nada difícil de fazer do ponto de vista de um programador: conheço a sintaxe e sei trabalhar legal com a linguagem, mas minha dúvida é sobre a divisão das responsabilidades entre os tipos de objetos.

 

Por exemplo, no cadastro de um novo cliente, quem está executando esta ação é um funcionário no sistema, mas quem deve ser o responsável pelo método? Ele deve ser parte da classe do funcionário, ou do cliente? Se for na classe "funcionário", seria algo como "cadastrarCliente", mas se for na classe do cliente (o que eu jugo mais correto, pelo princípio de responsabilidade única), seria como?

 

Desde já agradeço qualquer luz que possam me dar sobre o assunto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode criar em sua tabela uma coluna com o nível desse funcionário/usuário, e antes de cadastrar você coloca a mensagem "você não pode cadastrar usuários".

 

id | nome | email | senha | nivel | data

1  | Rick   | c@c.c |  pass  |    0    | 2017-07-06

2  |  Alli   | a@a.a |  pass  |    1    | 2017-07-05

3  | John | j@j.j     |  pass  |    2    | 2017-07-04

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, quimera, obrigado pelo seu post!

 

Bem, então, implementar níveis de permissões eu consigo fazer bem, vou introduzir um conceito de papéis e capacidades parecidas com o do WordPress, é bem flexível para mim.

 

Minha dúvida é mais sobre a questão organizacional e metódica do desenvolvimento mesmo, tenho lido sobre OOP, UML, padrões de projeto, enfim, quero uma aplicação mais padronizada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

O funcionário é uma entidade/classe, o cliente é outra entidade/classe.

 

Geralmente é feito outra classe para inserção do banco de dados tipo ClienteDAO para criar um novo usuário, tipo assim talvez:

class ClienteDAO {
    public function inserirCliente(Cliente cliente, Funcionario funcionario) {}
}

DAO é um padrão de projeto mais ou menos antigo e que muita gente ainda usa e existe muita coisa na internet sobre ele. Geralmente você quer que as classes Funcionario e Cliente sejam bem simples somente para representar elas mesmas, e não tomar ações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, Kononome, tudo bem?

 

Rapaz, nesse tempo que estava esperando algumas respostas no tópico acabei me atentando para o DAO, e que ele supria essa minha necessidade, mas estava esperando alguém mais experiente no assunto para me dar um parecer aqui.

 

Nesse caso, acho que vou separar assim (que é o que me parece o certo à se fazer): ações em tempo de execução sobre uma entidade serão executadas através de suas respectivas classes (Cliente, Funcionario), já a parte de persistência dos dados vou deixar com as classes DAO (ClienteDAO, FuncionarioDAO).

 

Como eu disse, programo em PHP há um tempo, mas minhas noções de OOP e padrões de projeto de software só começaram a fluir agora, acho que é uma transição natural.

 

Enfim, se alguém tiver algo a acrescentar à esta discussão, como exemplos ou links, serei grato. Obrigado, Kononome!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem muitos patterns a serem seguidos, só recomendei o mais prático para PHP puro. Geralmente adotamos algum framework para evitarmos o trabalho muito pesado de Padrões de Projeto, pois estes frameworks adotam patterns como MVC, Repositories, ORM, Facades, Dependency Injection e por aí vai.

 

No Laravel, ele já vem com Models incríveis para você criar um Cliente e Funcionário já conectado ao banco. Após você colocar a configuração do banco de dados em um config do Laravel, você simplesmente faz isso para adicionar ao banco:

// App/Model/Cliente.php
class Cliente extends Eloquent {}

// App/Controller/Cliente.php
class ClienteController extends Controller {
    public function inserir() {
         $c = new Cliente();
         $c->nome = 'Fulano';
         $c->save();
    }
}

E fazer as ligações entre clientes e funcionários também é coisa de uma função com uma linha dentro. Se você já tem toda a prática de desenvolvimento PHP, recomendo você ter certeza disso lendo isso: http://br.phptherightway.com/.

 

Após isso, você deveria aprender utilizar um framework.

 

Voltando o assunto de OOP, se você já tem um MVC, o padrão Repositories seria o próximo a ser implementado. É um DAO mais inteligente eu diria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, agradeço suas sugestões!

 

Bem, conheço e já usei alguns destes frameworks em alguns sistemas aos quais prestei manutenção, ou implementei novas funcionalidades, mas como tenho estudado sobre modelagem de dados e tentado sair daquele ciclo de "aprende/executa", entendendo realmente o quê e porquê estou implementando algo de determinada maneira, me surgiu essa dúvida.

 

Conheço alguns destes padrões de projeto que você citou, outros não, estou estudando sobre eles ainda, checando a melhor abordagem, até porque, divido o tempo entre estudar e aplicar o que estudei, numa empresa em que eu sou o responsável pelo T.I; é difícil.

 

Agradeço muito pelo link e pelos conselhos, já usei o Zend, o CodeIgniter, o Cake, mas nunca testei o Laravel, acho que é um bom momento para aprender ainda mais.

 

Novamente, muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Single of responsiblity, é especificamente para fazer com que cada classe tenha uma única responsabilidade.

Por exemplo:

Eu tenho um algoritmo desenvolvido para uma loja. Eu possuo uma classe cliente e através dessa classe eu consigo fazer:

Cadastro de novos clientes

Editar clientes existentes

Remover clientes

Adicionar dívidas do cliente

Remover dívidas do cliente

Exibir as dívidas do cliente

Editar dívidas do cliente

Enviar e-mail para cliente quanto estiver próximo ao vencimento.

 

Essa classe está de acordo com este princípio? De fato não.

 

Poderíamos ter a seguinte estrutura:

MainCliente

Gerenciamento cliente

Comunicar vencimento

 

Desta forma cada classe teria sua única responsabilidade.

Você poderia usar um middleware, de forma com que você primeiro faz uma verificação em algo relacionado ao funcionário para depois executar à ação do cliente.

 

Ou simplesmente o padrão facade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

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