|
| Publicidade |
|
|
|
Comentários de Usuários
Bom Mesmo
Semana passada eu precisei implementar um Factory, mas tive um problema pois precisava que a classe que é instanciada não premanece instanciada, ou seja, utilizando o exemplo acima ele eu precisaria guardar o valor do carro solicitado e ir somando os demais!
Exemplo: Supondo que a classe acima já tenha sido implementada para somar os valores e depois imprimir! $Carro = "Gol"; print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() ); $Carro = "Golf"; print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() ); print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->totalPreco() ); E ele retornar 55000, mas na verdade ele me retorna 35000. Até o momento não encontrei nenhuma solução!! Ou seja tive que refazer de outro modo!
Bom Mesmo (Corrigindo)
Eu havia escrito assim: "precisava que a classe que é instanciada não premanece instanciada"
O correto é: "precisava que a classe que é instanciada premanecesse instanciada" Desculpa o erro, sabe como é né, pressa!
Bom mesmo
Muito interessante estes novos recursos do php 5, melhorando um pouco os "furos" da orientação a objeto das versões anteriores. Mas uma questão: o php 5 resolveu aqueles problemas de cópias que eram feitas de objetos? pois se me lembro bem, precisávamos utilizar o operador '&' para evitar cópias.
Aquele manual pro php que tem no php.net ainda naum foi atualizado, se naum me engano... precisamos mais dissu
Dica:
Leia esse pequeno manual, fala alguma coisa sobre cópias em objetos:
http://www.developer.com/lang/php/article.php/10941_3302171_1
observação
na verdade, esta classe não precisa de mais do que um IF para funcionar, para se ter idéia, qualquer chamada que à new Vectra(), new Gol(), não vai resultar em nada pois a as funções da classe é chamada estaticamente, veja o novo exemplo de como a classe final poderia funcionar.
-- Final Class CarroFactory { public static function GetCarro($TCarro) { if (!$TCarro) { return null; } else { return new $TCarro(); } } } Header("Content-type: text/plain\n\n"); $Carro = "Gol"; print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() ); print("\n\n"); $Carro = "Vectra"; print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() ); --
Thomaz...
Amigo, beleza. Eu sei que funcionaria perfeitamente. Porém, a idéia inicial dos artigos publicados aqui é ensina e não enxugar o código fonte.
re: Thomaz
não tem nada de enxugação de código você que está ensinando algo que é desnecessário de se fazer.
re: re: Thomaz
Senhores,
desculpem por eu me intrometer, mas... Felipe: O cara só está adicionando algo ao seu artigo, que por sinal está muito bom! Você ensinou de uma forma e Thomas está mostrando um outro meio de chegar ao mesmo lugar. Thomas: Nada é desnecessário. A forma que você mostrou funciona muito bem com o exemplo dado por Felipe. Mas se as classes dos carros tivessem nomes diferentes do valor passado por parâmetro para o método GetCarro()? Será que funcionaria? Por exemplo: //Notem que o nome da classe não é mais "Gol" Class CarroGol extends Carro { public function Gol() { return $this->valor = 20000; } } $Carro = "Gol"; print $Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() ) Acho que neste caso realmente seria necessário o uso dos "ifs".
Eu de novo...HEHE
Amigos, só quero que saibam que o que pode ser fácil para uns pode ser difícil para outros... quero atingir a todos os níveis desde o iniciante ao avançado por isso estou tentando explicar não de forma simplificada mas sim de uma forma fácil de se aprender...ainda mais de orientação objeto que é onde fica as maiores dúvidas. Um abraço.
Bem Interessante
Olá Felipe,
Parabéns pelo seu artigo ficou muito bom e bem didático. Gostei muito. Quanto ao pequeno perrengue aí, eu acho q vale a pena mostrar como fazer(tanto de um modo como do outro). Só uma nota: OO é muito boa e deve ser usada, mas a economia que se tem com ela é mais aproveitada em projetos grandes. Obviamente o exemplo do Felipe é pequeno e faz as coisas ficarem mais complicadas, mas como ele disse, é para ser didático e não enxuto ehehe. Abraços e parabéns novamente.
Re: Bom Mesmo
Respondendo e perguntando :-) ao amigo Reinaldo Martinez Cabral, o correto é o php retornar 35000 que eh o preco do golf neh?
o que está retornando? não entendi o seu topico.. se vc pedir para realizar soma dos dois valores... do jeito q vc exemplificou está errado... pq vc nao vai conseguir criar uma instancia da classe abstrata... logo toda vez q vc chamar o metodo vai somar 0 ao valor do carro atual
Bem legal!
Me deixou um pouco confuso porque ainda naum estou mto acostumado a esses static e abstract, mas foi muito interessante o artigo mesmo!
No problema do Reinaldo, eu não atribuiria um valor diretamente a $valor como está sendo feito...Criaria um método setValor para isso e dentro dele incrementaria o $valor a um atributo novo, valorTotal digamos... entao seria: public function setValor($valor){ $this->valor = $valor; $this->valorTotal += $valor; } Ou algo assim...Aih as classes subsequentes ficariam algo como: Class Golf extends Carro { public function Golf() { return $this->setValor(35000); } }
factory compartilhada
Algum tempo atras eu tinha criado uma factory para o gerenciamento dos objetos compartilhados, como o obj de DB, controladores, obj de Template, etc...
Dessa forma vc só precisaria instanciar a classe na hora que fosse realmente usar, evitando validaçoes para ver se tal objeto ja foi criado ou evitando criar objetos no inicio, que nem chegam a ser usados por fluxos alternativos ou de exceção. <?php class Factory { private $objects; public function __construct() { $this->objects = array(); } /* objetos compartilhados retorna o objeto da cache ou um novo caso ele nao tenha sido instanciado @param $pack caminho do arquivo ex: $user = $fac->get('cadastro/User.php'); */ public function get($pack) { // se tem na cache if ( array_key_exists( &$pack, &$this->objects ) ) { return $this->objects[$pack]; } // se nao tem instancia else { $obj = $this->getNew(&$pack); $this->objects[$pack] = $obj; return $obj; } } /* instancia um objeto mas nao coloca na cache ideal para objetos nao compartilhados */ public function getNew($pack) { if ( file_exists($pack) ) { include_once($pack); $class = basename($pack,'.php'); return new $class(); } else { /* aqui poderia ser um throw mas seria um saco ter que um usar try para toda vez que fosse chamar uma classe em projetos que vc sabe que ela existe */ return NULL; } } } ?> Exemplo de uso <?php $fac = new Factory(); $db = $fac->get("/persistencia/DB.php"); ?>
If desnecessário
Caros,
O if neste exemplo é desencessário, podendo utilizar a variável como o nome da instância a ser criada. Além disso a utilização de if's gera um problema na engenharia do software, que ocorre quando criamos uma nova classe e temos q ficar adicionando em todos os pontos. Fui, Maiz |
|
|||||||||||||||||||||||||
|
|
| João Prado Maia | ||