Ir para conteúdo

Arquivado

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

CrazyLOL

Trabalhando com POO

Recommended Posts

Comecei a trabalhar com o POO até para deixar algo mais profissional os meus desenvolvimentos, porém eis que surge uma dúvida.

 

Fiz uma classe chamada Clientes, nela coloquei todos os Set e Get das minhas variaveis, fiz 4 funcoes, salvar() ,deletar() e alterar()., load()

Até ai ok.

 

Quando eu quero trazer a informação de 1 cliente eu uso a função load no qual popular minhas variaveis para usar o Get, tranquilo.

A dúvida surgiu no seguinte caso, preciso mostrar todos os meus clientes para o meu usuário, antes eu simplesmente executava uma Query e utilizava um "while(mysql_fetch_array())" nos dados da minha query e exibia.

 

Porém usando o POO como que posso fazer algo mais dinamico e fácil também para ser utilizado futuramente.

 

Devo criar outra função por exemplo "carregar dados()" e nela fazer a forma que usava anteriormente?

 

Estou meio perdido nisso.

Agradeço a ajuda antecipadamente!

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Separe sua classe Clientes em duas interfaces: Uma estática para representar TODA a tabela e outra interface não-estática para representar os dados de um único cliente:

<?php

class Clientes
{
	// Interface estática
	public static getAll(){}
	public static getById(){}
	// Interface não estática
	public salvar(){}
	public deletar(){}
	public alterar(){}
}
Usando:

$cliente = Clientes::getById(15);
$cliente->deletar();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, ela retornaria uma array de objetos da classe "Clientes", algo como:

public static function getAll()
{
	$data = array();
	// SELECT * FROM TABLE
	while($c = mysql_fetch_array())
		$data[] = new Clientes($c);
	return $data;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia criar uma classe como uma entidade e uma classe para as funções de armazenamento (Storage/DAO).

<?php
    class Cliente{
        //Setters and getters
    }
<?php
    class ClientesDAO{
        public function fetchOne( Cliente $cliente ){}

        /**
         * Get all clients
         *
         * @return array
         * @throws AnyException case something fail
        */
        public function fetchAll(){
            try{
                $stmt = $this->pdo->prepare( sprintf( 'SELECT * FROM `%s`', $this->table ) );
                $stmt->execute();

                return $stmt->fetchAll();
            }catch( \PDOException $e ){
                throw new AnyException( $e->getMessage() );
            }
        }
        //Other storage methods (create, remove, update, etc.)
    }

E por favor, não há necessidade alguma de static methods, nesse caso só serve pra ocupar mais memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sugiro estudar este link, antes de sair "programando" em POO.

Você poderia criar uma classe como uma entidade e uma classe para as funções de armazenamento (Storage/DAO).


E por favor, não há necessidade alguma de static methods, nesse caso só serve pra ocupar mais memória.

Mais memória do este padrão oculpa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

"Mais memória do este padrão oculpa?" - ficou meio sem sentido isso :lol:

Não sei se essa resposta é a que você espera, porque não entendi sua pergunta:

Toda vez que usa-se um static method, é criada uma nova instancia da classe, ocupando o espaço na memória de um instancia toda (ou algo assim) e ele tem uma queda de performance.

 

Nesse post eles até fazem uma comparaçãozinha do tempo de execução: Performance of static methods vs. functions (há também o teste com objetos).

 

Meu argumento sobre não usar anterior pode estar errado, me baseei no que li uma vez, mas é fácil saber quando usar static methods e não é dessa maneira que o cache7b usou. Esse aqui é bom artigo sobre isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nunca usei dessa maneira, como ficaria a exibição dos valores depois?

 

 

Sim, ela retornaria uma array de objetos da classe "Clientes", algo como:

public static function getAll()
{
	$data = array();
	// SELECT * FROM TABLE
	while($c = mysql_fetch_array())
		$data[] = new Clientes($c);
	return $data;
}

 

Você faz um foreach, ou se for mais cômodo:

while($c = mysql_fetch_array()):
               // faz um echo aqui mesmo
endwhile;
	

Compartilhar este post


Link para o post
Compartilhar em outros sites

Errata:

*Mais memória que este padrão ocupa? - No caso o DAO.

 

Antes de continuar, deixo bem claro que prevaleça a opinião do Gabriel Jacinto

 

Estou meio na correia e não vou estender o assunto, aqui tem um bom conteúdo sobre este pattern DAO, um padrão muito utilizado em java, desenvolvi por 02 anos com este pattern, então posso dizer que, só não é mais difícil a manutenção, do que a programação procedural.

 

Praticamente temos que descarregar a VO ou DTO, utilizava VO "gets e setters" em cima da DAO, ocupando memória desnecessária, não vou nem falar do acoplamento que é difícil.

 

Não recomendo a ninguém, mas esta é minha opinião.

 

Vou de MVC

class ClienteController extends AppController {

	public function FunctionName()
	{
		try {


			//Exemplo rápido sem uso de gets e setters
			 $nome = Tools::getValue('Nome');
		  
			//filtros
		  
			$dados = array(); //tabela, campos, etc


			$this->Cliente->save($dados);
		  
		  
		} catch (Exception $e) {


		}
	}
   
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
@Williams Duarte,


Posso estar equivocado, mas MVC não interfere em nada nesse quesito. MVC é "apenas" a separação de camadas e responsabilidades.


Neste seu exemplo, você usou estático para fazer um "getter dinâmico", acredito. Mas isso também vai causar alto acoplamento e ainda vai deixar sua classe difícil de ser testada. Na minha opinião, mais ainda que utilizando DTO.


Com DTO você pode diminuir o acoplamento simplesmente usando dependency injection. Dependendo do caso, nem precisa criar os setters, pode usar o construtor para substituí-los.

No seu exemplo também tem um erro de design (talvez pela correira ou por ser apenas um exemplo): A herança mal utilizada.


Da maneira que foi escrito, você diz que um controller é uma model, o que é errado, ainda mais se falando de MVC, onde as camadas e responsabilidades estariam sendo misturadas...


Aqui mais um texto sobre estáticos:




Estáticos tem o seu uso, mas acho que a melhor maneira de usá-los, é na criação de outros objetos, do contrário, você mata todo o princípio da orientação à objetos, que é justamente trabalhar com objetos.


Corrijam-me caso esteja equivocado.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Riberry

 

na correria aqui, e sem dormir até o momento, faltou algumas coisinhas ali, quando editei você ja tinha respondido.

 

class ClienteController extends AppController {

    public function FunctionName()
    {
         try {

            } catch (Exception $e) {

           }
     }   
}

 

 

@Williams Duarte,
Neste seu exemplo, você usou estático para fazer um "getter dinâmico", acredito. Mas isso também vai causar alto acoplamento e ainda vai deixar sua classe difícil de ser testada. Na minha opinião, mais ainda que utilizando DTO.

 

 

Se isso não for dinâmico:

	public static function getValue($key, $default_value = false)
	{
		if (!isset($key) || empty($key) || !is_string($key))
			return false;
		$ret = (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $default_value));

		if (is_string($ret) === true)
			$ret = urldecode(preg_replace('/((\%5C0+)|(\%00+))/i', '', urlencode($ret)));
		return !is_string($ret)? $ret : stripslashes($ret);
	}

E não entendi onde é difícil de ser testada,

Bom essa não é dúvida do rapaz, estender o tópico fica completamente desnecessário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço a ajuda de todos, e usando a orientações e dicas de cada um que postou eu reformulei minhas classes.

Porém estou encontrando um pequeno problema e aproveitando este topico aberto estarei postando aqui.

 

Separei meus arquivos em 3 partes.

1 -> processo ( Onde coloco as chamadas do meu jquery com o PHP e executo os metodos que as classes possui )

2 -> Classe onde possuo as informações

3-> Classe DAO onde faz as conexões.

 

Como citei usei as dicas de cada um que foram realizadas aqui, mas encontrei um problema, na hora que eu utilizo o metodo "set" para adicionar algum valor por exemplo "setDescricao" e tento retornar usando o getDescricao ele me retorna vazio, o que eu fiz de errado?

Para entender melhor o que fiz abaixo está meus 3 arquivos.

 

processoCategorias.php (Responsavel para fazer a chamada do jquery com as Classes)

<?php
include_once '../_inc/config.inc.php';
include_once '../_classes/Categorias.php';
include_once '../_classes/CategoriasDAO.php';
include_once '../_classes/Funcoes.php';

$Categorias 	= new Categorias();
$CategoriasDAO  = new CategoriasDAO();
$Funcoes	    = new Funcoes();

$acao = (int)$_POST['acao'];

switch($acao){
	//buscar 
	case 1:
				
	break;
	
	//adicionar 
	case 2:
		
		//variaveis
		$dados_form = $_POST['data'];
		$dados_php	= array();
		
		//variavel para retorno jquery e php
		$json = array("sucesso" => "","erro" => "");
		
		//converterndo para array os dados do Form
		parse_str($dados_form,$dados_php);
		
		//variavel para controle de erro
		$erro = '';
		
		//adicionado separadamente os valores 
		foreach ($dados_php as $key => $value){
			
			//verifico se os campos foram preenchidos, se sim já adiciono nos SETTERS
			$erro .= $key == 'm_departamento' && empty($value) ? 'É necessário informar o departamento desda Categoria<br>' : $Categorias->setCodDepartamento($value);
			$erro .= $key == 'm_descricao' && empty($value) ? 'É necessário informar o nome desta categoria<br>' : $Categorias->setDescricao($value);
			$key == 'm_categoria_pai' ? $Categorias->setCodCategoria($value) : NULL;
		}
		
		//se a variavel erro estiver vazia executa as funcoes;
		if(empty($erro)){
			/*//verifico se o cod_categoria foi selecionado se sim então é uma sub_categoria que irei criar
			if(!empty($Categorias->getCodCategoria())){
				//sub categoria
			}else{
				//nova categoria
				$result = $CategoriasDAO->saveCategoria();
				if($result == "TRUE"){
					$json['success'] = "Nova categoria criada com sucesso";
				}else{
					$json['erro'] = $result;
				}
			}	*/		
			
		}else{
			//retornando erro json
			$json['erro'] = $erro;
			//$a = json_encode($json);
			//echo ($json);	
			echo $Categorias->getDescricao();
		}
         echo $Categorias->getDescricao();
	break;
}
?>

Classe Categorias.php

<?php

class Categorias{
	
	public $cod_categoria;	
	public $descricao;
	public $cod_departamento;
	public $cod_categoria_sub;
	
	public function __construct(){
		#
	}

	public function setCodCategoria($a){
		$this->cod_categoria = $a;
	}
	
	public function getCodCategoria(){
		return $this->cod_categoria;	
	}
	
	public function setCodCategoriaSub($a){
		$this->cod_categoria_sub = $a;
	}
	
	public function getCodCategoriaSub(){
		return $this->cod_categoria_sub;	
	}
	
	public function setDescricao($a){
		$this->descricao = $a;
	}
	
	public function getDescricao(){
		return $this->descricao;	
	}
	
	public function setCodDepartamento($a){
		$this->cod_departamento = $a;
	}
	
	public function getCodDepartamento(){
		return $this->cod_departamento;	
	}
}
?>

Minha classe DAO

<?php
include_once 'Categorias.php';
include_once 'Conexao.php';

class CategoriasDAO extends Conexao{
	
	
	//
	public function __construct(){
		
	}
	
	/**
	*	Função para retornar todos os dados de uma tabela
	*/
	public function loadAll(){
		
	}

	public function loadId($id){

	}
	
	public function saveCategoria(Categorias $c){
		try{
			$Query = "INSERT INTO `categoria`
							(
							 `descricao`,
							 `cod_departamento`)
				VALUES (
						'".$c->getDescricao()."',
						".$c->getCodDepartamento().");";
			$this->setSQL($Query);
			if($this->mQuery()){
				return "TRUE";
			}else{
				return $this->getErr();
			}
		}catch(Exception $e){
			throw $e;
		}		
	}
	
}
?>

Agradeço já ajuda de todos.

 

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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