Ir para conteúdo

POWERED BY:

Arquivado

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

Vinicius Rangel

Design Pattern [chain of responsibility]

Recommended Posts

Fala galera beleza? eu estava lendo um artigo da Imasters

 

Chain of resposability

 

é uma coisa meia que nova pra mim e achei o artigo muito bom consegui entender o conceito e o por que usar e acabei gostando e mais pra baixo o amigo postou um exemplo no código onde eu tive uma enorme dúvida afinal nunca me deparei com tal situação, talvez minha dúvida nem seja sobre o pattern mas como foi lendo algo a respeito que vi achei melhor usar isso como abordagem.

 

enfim

 

class Caminhonete extends Handler
{
private $successor;
public function setSuccessor($nextVehicle)
{
	$this->successor = $nextVehicle;
}
public function handleRequest($request)
{
	if($request->getWeight() < 3000) {
		print('Uma caminhonete é boa para locomover: ' . $request->getWeight() . '<br />');
	} else if(!is_null($this->successor)) {
		$this->successor->handleRequest($request);
	}
}
}

 

reparem que no método handleRequest o retorno dele caso o peso for maior que 300 é uma propriedade com o próprio método eu realmente fiquei confuso quanto a isso, alguma boa alma pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele recebe Request que tem o método getWeight, se não entrar na condição vai jogar a requisição pro próximo cara da corrente.

E assim por diante, esse padrão é bem simples ... consiste em ir passando a requisição até que alguém possa manipular.

Compartilhar este post


Link para o post
Compartilhar em outros sites

até ai tudo bem mais de acordo com a lógica é

 

$this->handleRequest($request);

 

pois ele vai simplesmente chamar o método de novo só que ele usa a propriedade ainda, o uso da propriedade junto com o método é que esta confuso.

 

  $this->successor->handleRequest($request);

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa eu me perdi um pouco.

 

eu entendi que ele vai avançar para a próxima classe a qual uma vai suprir a necessidade do peso.

 

entendi que esse pettern vai trabalhar dessa forma, pelo menos falando.

 

agora quando fui para o código o simples fato de usar Objeto->propriedade>metodo me confundiu, essa é minha dúvida.

 

Obrigado pelas respostas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe a dúvida sim:

 

$this->successor->handleRequest($request);

 

por que ele usa esse sequência de referencia do próprio objeto uma propriedade do objeto e depois a função, eu nunca vi isso e fiquei me perguntando quando eu uso isso e o que ele faz exatamente.

 

nesse trecho do código eu sei que ele vai pular para próxima class até ai não fez muito diferença.

 

vlw galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

$successor é private ao escopo da Caminhonete. Então a caminhonete é capaz de acessa-lá.

 

Qual a dúvida ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

private $successor;

 

no escopo do objeto a visibilidade dela é private

 

Sim .. 'publica' que eu quis dizer é que qualquer membro lá dentro pode usar ela, e como não é usada por fora, não vai ter problema ... até agora não entendi a dúvida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma tentativa de pescar a dúvida...

 

<?php
class Lanterna {
  public $ligada;

  public  function setLiga() {
      $this->ligada = "ligado";
  }
  public  function setDesliga() {
      $this->ligada = "desligado";
  }
}

class Moto {
  public $lanterna;

  public function setLanterna($lanterna){
  $this->lanterna = new Lanterna();
  }
}

class Honda extends Moto {
  private $modelo;

  public function __construct($lanterna,$modelo) {
  $this->setLanterna($lanterna);
     $this->$modelo = $modelo;
  }
}

$lanterna = new Lanterna();
$honda = new Honda($lanterna,"CBR500");
echo "<pre>";
$honda->lanterna->setLiga();
print_r($honda);
$honda->lanterna->setDesliga();
print_r($honda);
echo "</pre>";
?>

 

Pode ser que este código fique completamente fora de contexto, sendo assim, não me joguem pedras ou cuspam na minha pessoa... Agradecido. ;)

 

Ps.: Meu exemplo não tem nada haver com o padrão de projeto, estou apenas tentando "pescar a dúvida".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw pela tentativa Prog porém o seu código faz sentido por que tudo se interlaça já do exemplo que citei não.

 

se eu fosse ler o seu exemplo direto e reto eu falaria algo assim

 

$lanterna = new Lanterna();
$honda = new Honda($lanterna,"CBR500");
echo "<pre>";
$honda->lanterna->setLiga();
print_r($honda);
$honda->lanterna->setDesliga();
print_r($honda);
echo "</pre>";

 

criou o objeto moto e definiu o modelo dela também, depois você pega a moto e liga a lanterna mostra depois vai no objeto moto vai na lanterna e desliga.

 

agora no exemplo do amigo

 

 $this->successor->handleRequest($request);

 

ele pega a instancia do objeto com a propriedade sucessor no caso seria algum automóvel que consiga carregar mais de 3000kg e chama o próprio método que esta fazendo essa verificação para repetir o processo.

 

Qual a dúvida ?

 

até agora não entendi a dúvida. 

 

eu só não vi a necessidade da propriedade SUCESSOR nessa parte, eu não achei a utilidade dela.

 

desculpem pela lerdeza só que ta complicado isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vinicius,

 

Se você der um print_r() no seu objeto "raiz", verá toda a hierarquia do padrão "chain of responsibility" aplicado no exemplo, e, consequentemente, vai entender o pq do successor e a utilização desta forma.

 

Se vê outra forma de reaolver o problema, poste um exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

com a ajuda de todos vocês e de um amigo meu do trabalho eu consegui entender.

 

parece que o grande x da questão é que a propriedade e o método já não é mais referente ao que ele esta executando o code e sim do sucessor dele.

 

vou tentar explicar para alguém mais que tenha essa dúvida:

 

class Caminhonete extends Handler
{
       private $successor;
       public function setSuccessor($nextVehicle)
       {
               $this->successor = $nextVehicle;
       }
       public function handleRequest($request)
       {
               if($request->getWeight() < 3000) {
                       print('Uma caminhonete é boa para locomover: ' . $request->getWeight() . '<br />');
               } else if(!is_null($this->successor)) {
                       $this->successor->handleRequest($request);
               }
       }
}

 

setamos que o sucessor será o próximo veiculo que no caso é um objeto então quando chamado $this->sucessor temos acesso a todas as propriedades e métodos do próximo veiculo e é assim que a banda toca.

 

desculpa o tempo aew galera. pode dar closed aqui.

vlww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sempre vi que a maior dificuldade (erro) dos programadores sobre patterns é começar pela aplicação antes de entender todo o conceito do pattern em si. Sem ter domínio do conceito, é muito difícil entender aplicando-o e ainda mais difícil entender o que ele está fazendo. Tentarei pescar a sua dúvida também.

 

Também vi que, o melhor entendimento sobre o pattern, é quando criamos sobre ele uma pequena história (quanto mais infantil, melhor).

 

Traduzindo, literalmente, Chain of Responsibility (utilizarei CoR por preguiça mesmo u.u) significa Cadeia de Responsabilidade. No seu exemplo, vamos entender o conceito fundamental, através de uma história simples.

 

Você possui uma carga e necessita de alguém que possa transportá-la.

 

Vamos aos nossos participantes e as "regras":

- Você é dono de uma transportadora;

- Possui N funcionários;

- Cada funcionário possui um veículo com suporte máximo e mínimo de peso (nenhum pode carregar muito e nem pouco peso).

 

Para um exemplo prático, o CoR seria o mesmo que, você colocar cada um de seus motoristas, um ao lado do outro e perguntar ao primeiro (da esquerda para a direita):

"Você pode transportar 3000kg?"

 

E espera a resposta dele:

"Não, pergunte ao Fulano."

 

Novamente você pergunta, mas agora direcionando ao Fulano:

"Você pode transportar 3000kg?"

 

E espera a resposta dele:

"Não, pergunte ao Ciclano."

 

E assim por diante, até que o "responsável" seja encontrado ou não haja mais motoristas, cada colaborador irá passar a sua responsabilidade para o próximo motorista.

 

E finalmente um motorista responderá (ou assim espera-se):

"Eu posso carregar."

 

Como ele pode responder (melhor que não responda assim):

"Não posso carregar e não há ninguém mais para perguntar."

 

A maior diferença da prática real sobre a programação, é que a cadeia de responsabilidade não se dá de forma explicita (da esquerda pra direita). Na programação você terá que definir a ordem da cadeia de responsabilidade, pois cada objeto possui seu sucessor já definido. É basicamente uma hierarquia definida na programação (método setSucessor).

 

Edit----

Que bom que sua questão foi resolvida. Não se preocupe com o tempo gasto, além da sua dúvida, demais pessoas (em um futuro próximo) poderão ter suas dúvidas respondidas nesse tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Gabriel, eu li sobre o conceito sim só que por uma pequena falta de atenção eu passei por essa dificuldade.

 

realmente a sua história ajuda, sabe quando você fala algo bem lento e pausado para pessoa entender.. é parece isso mais sem dúvida é realmente útil.

 

e esta resolvido quem quiser pode deixar um help high five aqui

 

\o

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre vim (e 99,9% dos programadores também) do conceito que na "prática" é mais fácil de entender. Como toda lógica e programação procedural.

 

Mas isso cai por terra quando fala-se em Orientação à Objetos, Design Pattern, e mais alguns (muitos, diga-se de passagem) paradigmas de programação.

 

Vi que minha primeira grande dificuldade foi com funções (ainda no Java), o qual eu não entendia, praticamente, como uma função se encaixava no contexto linear (Up to Down) da programação e como uma função podia ser chamada "independente" do local em que ela estava no código.

 

Para o bem da verdade, eu "exercito", um pouco, do entendimento de conceitos com a minha namorada. Ela fala sobre Direito e as leis (Código Civil, Penal, etc), das quais muitas não fazem o menor sentido e ela briga comigo por não aceitar o atual código (espero que um dia sejam mudadas muitas das leis), mas tudo é uma questão de interpretação. Que no caso do Direito, deve-se "engolir com farinha" (aceitar do jeito que é), como ela mesmo me diz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

até foi positivado pois minha mãe faz direito e realmente eu tentei resolver um caso (exercicio) e o que era certo falou mais alto e na verdade a lei protege o bandido.

 

eu estou sempre na procura de aprender e qualquer ajuda é bem vinda.

 

vlw mesmo

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.