Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Realidade na Programação:
Camada
Trazendo para nossa realidade de Programação, usar este conceito seria uma forma de
organizar o trabalho separando o sistema em partes menores (camadas), para resolver
problemas separadamente (separação de conceitos) desta forma o estruturando em
camadas.(uma sobre a outra)
Vantagens do uso de camadas:
Modularidade:
Melhor estruturação do sistema
Melhor entendimento
Coesão (Harmonia na relação dos arquivos)
Facilidades de Manutenção:
Custos de manutenção representam em média 75% do custo total do software,
então se um sistema está com todas suas tarefas e funcionalidades bem
divididas por suas partes menores, este será de facílima manutenção.
A estrutura a seguir será usada para o exemplo que estará disponível para download, ele é equivalente a o
esquema acima, mas mostrando a estrutura de diretórios para que o leitor possa se guiar no exemplo.
Classes Básicas:
Composta por classes simples do sistema, apenas com métodos de acesso aos seus
atributos.
Coleção de Dados:
Esta camada é responsável por manipular diversos objetos das classes básicas.
Normalmente possui alguma estrutura de armazenamento de objetos das classes
(Ex: Array de Objetos).
Conhecida também com Camada de Persistência.
Coleção de Negócios:
Esta camada é responsável por realizar críticas de Negócio específicas a uma determinada classe
básica da aplicação utilizando-se de uma Coleção de Dados, para lhe dar suporte a persistência
de objetos da aplicação.
Ex: “O usuário não pode ter a idade maior que a idade máxima de adesão ao plano” (Regra de
plano de saúde), ou “Não é possível inserir duas contas com o mesmo número” (Regra do
Banco).
Vamos agora definir quais são as funcionalidades básicas de Persistência de uma Pessoa, como ela deve
ser guardada.
Essa forma de armazenamento é chamada de Repositório.
Vamos abstrair um pouco...
Pense que uma Pessoa pode ser persistido de diversas formas, mas para isso preciso saber quais
funcionalidades são necessárias para a persistência.
Você deve estar se perguntando porque uma classe só com assinatura de métodos?
Antes de responder esta pergunta vou citar um conceito usado no PHP5, que será de extrema importância
para se trabalhar com camadas, ele é chamado de Indução de Tipos.
Com este recurso você pode forçar seu método a receber um determinado tipo de dado.
Ex:
public function inserir(Pessoa $objPessoa)
{
$this->inserir($objPessoa);
}
O Php informa que o objeto que deve ser passado como parâmetro da função deve ser uma instância da
classe Pessoa.
Agora que você sabe do conceito de Indução de Tipos, podemos responder aquela pergunta.
Automaticamente esta classe que implementa a interface será do tipo da interface, e a partir daí o
conceito de interface passa ter sentido.
Imagine que seu sistema pode sofrer mudanças e uma delas será onde salvar os dados, neste caso podem
ser salvos em um arquivo txt ou num banco de dados, por exemplo.
Para deixar flexível e não amarrar o sistema, podemos usar uma Interface que é implementada por varias
classes, mas que apenas uma será usada.
Agora vamos criar uma classe que implementa a Interface RepositorioPessoa, digamos que eu resolvi
salvar os registros em um banco de dados.
Autor: Ricardo Francisco Minzé Júnior
Mas de repente precisei salvar meus registros agora em um arquivo TXT, então vou criar uma classe
para salvar registros em um TXT, e ela terá que implementar a interface, e obrigatoriamente precisa
implementar seus métodos.
Então podemos criar uma classe que usa nossa interface RepositorioPessoa da seguinte maneira:
Autor: Ricardo Francisco Minzé Júnior
Como RepositorioPessoaBanco e RepositorioPessoaArquivo são do Tipo
RepositorioPessoa(Interface), se eu passar qualquer uma das duas minha Classe CadastroPessoa vai
entender que foi passado para ela uma Interface RepositorioPessoa, dessa maneira não gerando erros, e
deixando flexibilidade na hora de salvar meus registros.
Fachada
A idéia da Fachada é fornecer uma instância única para o sistema, de forma que o usuário só terá acesso
aos seus “comportamentos superficiais”, o próprio nome já diz, “FACHADA”, então o que devemos
fazer para definir uma fachada ?
Primeiramente vamos usar um padrão de projetos “Design Pattern”, esses padrões são de formas de
implementações para definir um comportamento padrão, facilitando assim a nossa vida como
desenvolvedores, aumentando a manutenibilidade dos sistemas.
Então a idéia é a seguinte: definir um atributo do tipo da classe como static private, deixar o construtor
como private para garantir que não será possível acessar o mesmo, criar um método static que retorna
uma Fachada, e perguntar se já foi instanciada.
Autor: Ricardo Francisco Minzé Júnior
Exceções
Não podemos nos esquecer das exceções, onde é possível tratar erros e dar um curso
alternativo ao programa.
Poderíamos ter criado Exceções para a classe Pessoa, mas para melhor ser visualizado
na prática resolvi criar uma única classe de exceção dedicada exclusivamente para
erros de banco, como falha na conexão ou até mesmo erros nas strings de SQL.
Nesta classe quando é levantada uma exceção ela recebe o código do erro e faz uma
busca no banco de dados onde os erros estão em português, se o erro não estiver
cadastrado ela exibe o erro do em Inglês do MYSQL.
Autor: Ricardo Francisco Minzé Júnior
Caso a conexão não seja efetuada ou o servidor é desconhecido esta classe de exceção
trata o erro dizendo que não é possível conectar ou o servidor é desconhecido.
Apresentação
Esta é a última camada que devemos nos importar, será a forma que o usuário
visualizará seu sistema, e quando seu sistema está dividido desta forma você poderá
mudar o layout do seu sistema ou site sem muito esforço para a manutenção.
A seguir será mostrado um diagrama de classes relacionando essas camadas e
envolvendo exemplos de código citados nos exemplos anteriores.
Autor: Ricardo Francisco Minzé Júnior
Autor: Ricardo Francisco Minzé Júnior
class Pessoa
{
private $id;
private $nome;
private $idade;
private $sexo;
private $cpf;
error_reporting("NONE");
require_once("../../excecoes/banco/ExcecaoBanco.php");
class Conexao
{
private $servidor = "localhost";
private $usuario = "root";
private $senha = "";
private $banco = "pessoa";
}catch(ExcecaoBanco $e){
$e->BuscarErro();
}
}
public function desconectar()
{
mysql_close();
}
if(!$ResultSet)
{
throw new
ExcecaoBanco(mysql_error(),mysql_errno(),$SQL);
}
break;
case "resource":
return mysql_fetch_array($ResultSet);
break;
}
}catch(ExcecaoBanco $e){
$e->BuscarErro();
}
}
}
Autor: Ricardo Francisco Minzé Júnior
ExcecaoBanco.php
case 2003:
case 2005:
}
}
RepositorioPessoa.php
interface RepositorioPessoa
{
public function inserir(Pessoa $objPessoa);
public function atualizar(Pessoa $objPessoa);
public function deletar($id);
public function pesquisar($id);
}
Autor: Ricardo Francisco Minzé Júnior
RepositorioPessoaBanco.php
require_once("../../repositorio/banco/Conexao.php");
require_once("../../repositorio/pessoa/RepositorioPessoa.php");
require_once("../../repositorio/repositoriosql/pessoa/RepositorioPessoaSQL.php");
$this->Conexao->execute($this->RepositorioPessoaSQL->inserir($objPessoa));
}
$this->Conexao->execute($this->RepositorioPessoaSQL->atualizar($objPessoa));
}
$this->Conexao->execute($this->RepositorioPessoaSQL->deletar($id));
}
CadastroPessoa.php
require_once("../../repositorio/pessoa/RepositorioPessoa.php");
class CadastroPessoa
{
private $RepositorioPessoa;
require_once("../../basica/pessoa/Pessoa.php");
require_once("../../negocio/pessoa/CadastroPessoa.php");
require_once("../../repositorio/pessoa/RepositorioPessoaBanco.php");
class FachadaPessoa {
private $RepositorioPessoa;
private $CadastroPessoa;
private static $instancia = null;
return self::$instancia;
}
require_once("../../basica/pessoa/Pessoa.php");
require_once("../../fachada/pessoa/FachadaPessoa.php");
$fachada = FachadaPessoa::getInstancia();
$objPessoa = new Pessoa(1,"Ricardo Minzé",23,'M',123);
$fachada->inserir($objPessoa);
// $fachada->atualizar($objPessoa);
// $fachada->deletar(1);
// $objPessoa = $fachada->pesquisar(1);
Espero ter contribuído para o conhecimento comum entre os que fazem a comunidade PHP.
You can order SCP PDF Builder for only $19.95USD from http://www.scp-solutions.com/order.html