Ir para o conteúdo
Devexz

lógica, método "redundante" ?

Mensagens Recomendadas

Devexz

Boas pessoal,

Precisava de uma ajuda na maneira de organização de duas classes

Exemplo:

Eu quero enviar encomendas utilizando várias empresas de correio ( ctt, dhl, fedex, etc )

E cada uma dessas empresas é uma classe, e que têm o método para enviar encomendas:

class-ctt.php

class-dhl.php

class-fedex.php

O que eu fiz foi

class-enviarEncomendas.php // que trata de enviar encomendas

class-meuprojecto.php // class para gestão do meu projecto

class-enviarEncomendas.php


require 'class-ctt.php';
require 'class-dhl.php'
require 'class-fedex.php'


class class-enviarEncomendas {

private empresaTransporte;
private empresaInstancia;

function __construct($empresa) {

if($empresa == "ctt") {
$this->empresaInstancia = new ctt();
}
else if($empresa == "fedex") {
$this->empresaInstancia = new fedex();
}
else if {
// assim em diante
}
$this->empresaTransporte = $empresa;

}


public function enviarEncomenda() {

//agora vejo novamente qual a empresa que foi chamada no construct e chamo o método correspondente
if($this->empresaTransporte == "ctt") {
$this->empresaInstancia->MetodoEnviarCTT();
}
else if($this->empresaTransporte == "fedex") {
$this->empresaInstancia->MetodoEnviarFEDEX();
}

}

}

class-meuprojecto.php

class-meuprojecto extends class-enviarEncomendas {

private empresaTransporte = ctt; // defino a empresa que quero utilizar para o envio

function __construct() {


parrent:construct($this->empresaTransporte);

// outras variaveis são definidas aqui também


}


public function enviar() {

$this->enviarEncomenda() // chamo o metodo da class parent
//fazer as query para guardar, etc, blalbal
}



}

(Ok, até agora isto está a funcionar, e sei que talvez não seja a melhor maneira de fazer isto, por isso podem dar as vossas opiniões.)

O problema:

Agora o problema é que eu quero modificar o metodo enviarEncomenda()de maneira que se o envio pelos ctt falhar, tenta enviar pelo fedex, se este também falhar passa para a próxima empresa.

A solução que tinha pensado era fazer um array por ordem de preferência: array("ctt", "fedex", etc) e percorrê-lo enquanto não for retornado true, mas também quero que seja possivel definir apenas e só uma empresa de envio.

No meio disto tudo não como é obvio não posso estar a instanciar classes de cada empresa...

Bem, como é que vocês fariam ou como é que eu devo fazer? :thumbsup:

Editado por Devexz

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

Isso não me parece função de nenhuma dessas classes. Se qualquer uma delas tomar conhecimento desse "mundo de possibilidades", deixou de ser um objecto.

podes explicar melhor sff ?


Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
taviroquai

Agora o problema é que eu quero modificar o metodo enviarEncomenda()de maneira que se o envio pelos ctt falhar, tenta enviar pelo fedex, se este também falhar passa para a próxima empresa.

O que é falhar? O que acontece? Isso é uma simulação? Tens que ficar a "espera" da conclusão do processo de envio?

Se o resultado do envio for instantâneo (tipo simulação), então basta uma coisa deste tipo:

<?php
$company_order = array('ctt', 'fedex');
$i = 0;
do {
   $company = new {$company[$i]};
   $result = $company->enviar();
   $i++;
} while ($i < count($company_order) && !$resultado);

Se tiveres que ficar à espera do resultado do envio da empresa então o teu sistema fica num estado em "standby" (guarda o estado numa base de dados) e tens que ter alguma coisa que receba a notificação da conclusão do envio; ou então algo que fique constantemente a verificar o estado da conclusão do serviço da empresa (neste caso uma solução pode ser cron job).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

o resultado é obtido de imediato, o código é meramente um exemplo, no entanto a lógica é igual.

assim que chamo o método enviar encomenda de cada empresa, obtenho logo um resultado e caso fosse false, queria passar de imediato para a próxima empresa.

Outra questão seria se devo fazer:

$ctt = new CTT();
$fedex = new fedex();

// ou então
private $instancia
$this->instancia = new Ctt();
$this->instancia= new fedex();

É que no __construct do class-enviarEncomendas.php já estou inicializar a classe e no método enviarEncomenda vou ter inicializar novamente?

Editado por brunoais
geshi

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

Antes de mais, o que estás a tentar fazer não faz muito sentido. Em que condições é que o envio de um objecto falha num desses provedores?

por exemplo, se eu estiver a enviar alguma coisa pelos ctt e estes estão com os servidores down, ou não conseguem enviar por alguma razao, eu tentava com outra empresa.

Edit: O objectivo final é que o envio da encomenda nunca falhe, daí eu ter várias empresas e se uma falhar, tentava noutra.

Editado por Devexz

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

Acho que o processo de mudança devia passar pelo utilizador, ou ele não pode escolher?

Lembra-te que caso o servidor de um provedor estiver em baixo, não é o envio que falha, é simplesmente o provedor que não está acessível, coisa que podes verificar até antes do envio da encomenda (e que faz mais sentido).

Editado por yoda
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.