Jump to content
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.

Share this post


Link to post
Share on other 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

  • +1 1

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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.

  • +1 1

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

  • +1 1

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

  • +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 heenrique
      Boa Noite
       
      amigos tenho um select no qual me retorna o seguinte 
      SELECT * FROM sis_suporte WHERE tecnico = '1' AND abertura < '2019-10-30'; +----+--------------------------------------+------------+---------------------+---------------------+-------+---------+----------------+-----------------------------+------------------+----------------------------+---------------------+------------+--------------+-------+---------+-------------+------------------------------------------------------------------+ | id | uuid_suporte | assunto | abertura | fechamento | email | status | chamado | nome | login | atendente | visita | prioridade | ramal | reply | tecnico | login_atend | motivo_fechar | +----+--------------------------------------+------------+---------------------+---------------------+-------+---------+----------------+-----------------------------+------------------+----------------------------+---------------------+------------+--------------+-------+---------+-------------+------------------------------------------------------------------+ | 36 | 1901294b-80e6-4389-9059-fa090c09e382 | Outros | 2019-09-14 19:27:42 | 2019-10-17 19:35:20 | NULL | aberto | 14091919272653 | Alex Ramos dos Santos | alex.santos | Letícia Paula de Oliveira | 2019-10-17 16:27:15 | normal | SAO PAULO | nao | 1 | leticia | TÉCNICO HENRIQUE FINALIZOU A ORDEM: CLIENTE BLOQUEADO | | 37 | af8da3e7-9dbc-45b9-945b-d50cd45d9ea6 | Outros | 2019-09-14 19:37:13 | 2019-10-04 21:11:25 | NULL | fechado | 14091919370623 | Alexsandro Santos Braz | alesysandro.braz | Letícia Paula de Oliveira | 2019-10-04 16:37:15 | normal | SAO PAULO | nao | 1 | leticia | TÉCNICO HENRIQUE FINALIZOU A ORDEM: | | 39 | 2b03e9d4-50ca-4713-8149-88fe083fb9d9 | Instalacao | 2019-09-16 17:00:22 | 2019-10-03 22:38:23 | NULL | fechado | 16091916593665 | Henrique Gabriel de Almeida | teste | Letícia Paula de Oliveira | 2019-10-03 08:00:15 | normal | POUSO ALEGRE | sim | 1 | leticia | TÉCNICO HENRIQUE FINALIZOU A ORDEM: QWE | | 40 | b2c0fc23-0a5c-46ae-a8b8-a8641b1d53c4 | Outros | 2019-10-03 23:21:22 | 2019-10-03 23:36:51 | NULL | fechado | 03101923210987 | Henrique Gabriel de Almeida | teste | sistema | 2019-10-03 14:21:15 | normal | POUSO ALEGRE | nao | 1 | admin | TÉCNICO HENRIQUE FINALIZOU A ORDEM: RELIGUEI A FONTE DO CLIENTE | | 41 | e9aaf792-56c6-4fe1-b8c3-aa51338f65d1 | Outros | 2019-10-03 23:23:02 | 2019-10-03 23:46:01 | NULL | fechado | 03101923225491 | Cintia Rocha Vaz | cintia.vaz | sistema | 2019-10-03 17:22:15 | normal | SAO PAULO | nao | 1 | admin | TÉCNICO HENRIQUE FINALIZOU A ORDEM: 12 | +----+--------------------------------------+------------+---------------------+---------------------+-------+---------+----------------+-----------------------------+------------------+----------------------------+---------------------+------------+--------------+-------+---------+-------------+------------------------------------------------------------------+ 5 rows in set (0.00 sec) e quando imprimo sai um por um, gostaria de agrupar por data de abertura ex.
       
      2019-09-14
      Alex Ramos
      Alexsandro
       
      2019-09-16
      Henrique
       
      2019-10-03
      Henrique
      Cintia
       
      como agrupar isso em php,
       
      esse e o cod onde eu imprimo
       
      <?php while($dados = mysqli_fetch_assoc($resultado_os)){ if ($dados['status'] == 'aberto'){ ?> <div class='row'> <div class='col-md-12'> <a href='os.php?os=<?php echo $dados['chamado']; ?>'> <div style='box-shadow: 3px 3px 0px 1px rgba(0,0,0,0.1);' class='info-box'> <span class='info-box-icon1 bg-agua'><i style='padding-top: 35%;' class='ion ion-ios-gear-outline'></i></span> <div class='info-box-content'> <span class='info-box-text'><b>ABERTA</b></span> <span class='info-box-text'><b>O.S:</b><?php echo $dados['chamado']; ?></span> <span class='info-box-text'><b>NOME:</b><?php echo utf8_encode($dados['nome']); ?></span> <span class='info-box-text'><b>TIPO:</b><?php echo $dados['assunto']; ?></span> <span class='info-box-text'><b>DATA/HORA:</b><?php echo (new DateTime($dados['visita']))->format('d/m/Y - H:i'); ?></span> </a> </div> </div> <?php } if ($dados['status'] == 'fechado'){ ?> <div class='row'> <div class='col-md-12'> <a href='os.php?os=<?php echo $dados['chamado']; ?>'> <div style='box-shadow: 3px 3px 0px 1px rgba(0,0,0,0.1);' class='info-box'> <span class='info-box-icon1 bg-red'><i style='padding-top: 35%;' class="fa fa-check" aria-hidden="true"></i></span> <div class='info-box-content'> <span class='info-box-text'><b>FINALIZADA</b></span> <span class='info-box-text'><b>O.S:</b><?php echo $dados['chamado']; ?></span> <span class='info-box-text'><b>NOME:</b><?php echo utf8_encode($dados['nome']); ?></span> <span class='info-box-text'><b>TIPO:</b><?php echo $dados['assunto']; ?></span> <span class='info-box-text'><b>DATA/HORA:</b><?php echo (new DateTime($dados['fechamento']))->format('d/m/Y - H:i'); ?></span> </a> </div> </div> <?php } } ?> </div> </div> </div> </section> </div>  
    • By avelar.avelar
      Boa Tarde galera, 
       
      Preciso criar um Test de Recursividade na mesma tabela:
       
      Tabela: Biblioteca
      Campos:
      ID
      Titulo
      Descricao
      Biblioteca-ID(Foreign Key)
       
      Obrigado
    • By LRDSILVA3
      Pessoal Boa Tarde ,Tudo certo?
      Estou com um projeto para aprendizagem (já que só tenho conhecimentos de css e html) e upgrade da firma onde trabalho e não estou conseguindo salvar os valores do formulário no banco de dados,a conexão é feita porem salva todos os valores como null.
      <?php
      $servername = "192.168.1.109";
      $database = "cadastrokm";
      $username = "teste";
      $password = "123456";
      // Create connection
      $conn = mysqli_connect($servername, $username, $password, $database);
      // Check connection
      if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
      }
       
      echo "Connected successfully";
      $funcionarioKm = isset( $_POST['funcionarioKm']); 
          $veiculoKm = isset($_POST['veiculoKm']);
          $kmInicial = isset($_POST['kmInicial']);
          $kmFinal = isset($_POST['kmFinal']);
       
      $sql = "INSERT INTO km (funcionarioKm,veiculoKm,kmInicial,kmFinal) 
          VALUES ('$funcionarioKm','$veiculoKm','$kmInicial',
          '$kmFinal')";
      if (mysqli_query($conn, $sql)) {
            echo "New record created successfully";
      } else {
            echo "Error: " . $sql . "<br>" . mysqli_error($conn);
      }
      mysqli_close($conn);
      ?>
      <!DOCTYPE html>
      <html lang="pt-br">
      <head>
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
      <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>

      </head>
      <body>
        
          <div class=container>
      <section>
          <!-- Página de Cadastro de KM -->
          <h1>Cadastro de Km</h1>
          <hr><br><br>
          <form method="post" action="conexao.php">
          <p class="font-weight-bold">Favor Selecione seu Nome:</p>
                <select id="funcionarioKm"  name="funcionarioKm"required autofocus>
                    <option>Motorista</option>
                    <option>Almir</option>
                           <option>Maykon</option>
                                      <option>Jorge</option>    
                                  </select>
      </br></br>
                <p class="font-weight-bold">Favor Selecione o Veiculo:</p>
                <select id="veiculoKm" value="veiculoKm " name="veiculoKm"required>
                    <option>Veiculo</option>
                    <option>L200</option>
                           <option>Strada 01</option>
                                      <option>Strada 02</option>    
                                      <option>Caminhão 01</option>    
                                  </select> 
       </br></br>
                 <label for="litros"><p class="font-weight-bold">Informe a Quilometragem Inicial:</p></label>
              <input type="number" id="kmInicial" name="kmInicial" required/>
      </br></br>
              <label for="litros"><p class="font-weight-bold">Informe a Quilometragem Final:</p></label>
              <input type="number" id="kmFinal" name="kmFinal" required />
      </br></br>
              <input type="submit" value="Salvar"    class="btn btn-primary btn-md">
              <input type="reset" value="Limpar"class="btn btn-primary btn-md" >
              <br><br>
      </form>
      </section>
      </div>
      </body>
      </html>
       

       
       
    • By proflupin
      criei uma página que busca alguns dados no BD e retornar em forma de collapse. Como existe um WHILE executando o collapse, ele sempre o executa com o mesmo ID, ou seja, se eu tiver 20 collapse, todos vão ser abertos ao clicar no primeiro.
      A dúvida é, como eu posso criar um novo ID para o collapse a cada loop do While?
      Código:
       
      <?php while($result_inners = mysqli_fetch_object($result_inner)){ ?> <div class="card-footer "> <a class="text-muted" data-toggle="collapse" href="#collapse1" role="button" aria-expanded="false" aria-controls="collapseExample"> <i class="fas fa-comment-alt"></i> <?php if(!empty($result_inners->nome_completo)) echo $result_inners->nome_completo . " respondeu..."; else echo "Aguardando resposta do técnico." ?> </a> <div class="collapse " id="collapse1"> <div class="bg-white mt-2 p-2"> <?php echo nl2br($result_inners->mensagem) ?> </div> <span style="color: #6c757d; float: right;"><?php echo date('d/m/Y H:i', strtotime($result_inners->data_hora)) ?></span> </div> </div> <?php } ?>  
    • By elielton
      Preciso usar um regex 
      qual expressão reconhece: 03-190325
       
       
      Alguém pode me ajudar?
       
       
×

Important Information

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