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 landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por First
      Olá a todos!
       
      Quando eu tento fazer o login me mostra esse erro "Could not log you in."; Alguém sabe me ajudar a resolver esse problema no meu código?
      <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember"> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form>  
       
      Desde já obrigado.
    • Por ckcesar
      Eu tenho uma aplicação no zend com a versão 5.6 e com o postgresql 9.6. Agora eu precisei mudar a versão do meu postgresql para o 16.1, a parte de conexão do bd e consultas sqls funciona perfeitamente, o meu problema está para acessar os meus controllers. Eles não são encontrados em nenhuma rota, quero ver se alguém já passou por esse problema para me ajudar. Obrigado.
    • 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
×

Informação importante

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