Programação orientada a Objetos – Boas práticas de programação (1)
Tenho participações em fóruns como JavaFree e PortalJava. E notei que muitos programadores se “batem” com orientação a objetos, mesmo utilizando uma linguagem Orientada a Objetos como Java, Flex, Php.
Tentarei trazer dicas de orientação a objeto e boas práticas de programação, utilizando exemplos simples para o fácil entendimento. No momento estou bem ocupado, então posso demorar para postar coisas novas!
Então…
Notem este código:
public class Motor {
}
public class Carro {
private Motor motor = new Motor();
//construtora
public Carro(Motor motor) {
this.motor = motor;
}
}
Um exemplo muito simples, com dois objeto (Carro e Motor);
Agora, notem…
- A contrutora da classe “Carro”, informa (obriga) que um “Carro” tenha um “Motor”.
- Então antes de instanciar um carro, eu preciso instanciar um motor (motor pode ser “null”, nulo).
- Quando eu contruir um carro, eu incluo o motor no carro, mas notem a linha 2:
private Motor motor = new Motor();
- Se a construtora de “Carro” me obriga ter um “Motor”, por que diabo ela já tem um motor construído?
É mais ou menos como: “Vou contruir um carro 2.0, mas o carro já possuí um motor 1.0, então terei que tirar o motor 1.0, e substituir pelo 2.0″
(No mundo real isso é bom, já que eu teria um motor sobrando, mas … na programação há disperdício de processamento e memória para criar o motor 1.0, já que foi contruído e não foi utilizado)
- Agora você deve se perguntar, grande coisa… Não vai fazer muita diferença.
- Para um exemplo simples como esse sim, mas imagine um sistema complexo, com classe gigantes e complexas
Agora olhem a classe abaixo:
public class Carro {
private Motor motor = null;
//construtora
public Carro(Motor motor) {
this.motor = motor;
}
}
No carro eu “declarei” mas não “instanciei” o Motor.
É mais ou menos como: “tenho um carro, agora só falta o motor (reservei espaço para o Motor)”
Uma outra Boa Prática de Programação (BPP) é, sempre informar o valor da variável ao declará-la.
Como no exemplo abaixo
Exemplo de utilização:
Motor motor_1; //não recomendado
Motor motor_2 = null; //OK
Motor motor_3 = new Motor(); //OK
motor_1 = new Motor();
motor_2 = new Motor();
Carro corsa = new Carro(motor_1);
Carro corsa_sedan = new Carro(motor_2);
Até a próxima
HTTP Error: no data present after HTTP headers (SOAP + PHP)
Opa!
estava eu acessando um web service e precisei passar um objeto por webService.
E perdi algumas hora pra resolter um problema! Eu não consiguia enviar (em PHP, usando NuSoap) um objeto para o webServices!
Tentei de várias formas até que consegui!
então lá vai:
aqui um exemplo que Request que deveria ser feito para se inserir o objeto
POST /SafeVenue/WebInterface.asmx HTTP/1.1
Host: servidor.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://192.1.2.3/SafeVenue/InsertRedListEntry"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<InsertRedListEntry xmlns="http://192.1.2.3/SafeVenue/">
<redListEntry>
<TicketID>long</TicketID>
<FailureReasonID>int</FailureReasonID>
</redListEntry>
</InsertRedListEntry>
</soap:Body>
</soap:Envelope>
Para chamar enviar o objeto, no PHP, fiz assim:
<?php
/**
* Enviando Objeto via WebService com NuSoap
*
* @author Gregui Shigunov
* @since 03/10/2007
*/
require_once('nusoap/nusoap.php');
$wsdl = "http://servidor/SafeVenue/WebInterface.asmx?WSDL";
$client = new soapclient($wsdl, true);
$client->soap_defencoding = 'UTF-8';
$client->useHTTPPersistentConnection();
$err = $client->getError();
if ($err) {
echo '<pre>PROBLEMAS AO ACESSAR O WEBSERVICE ' . $err . '</pre><br>';
}
$objeto = '<InsertRedListEntry xmlns="http://192.1.2.3/SafeVenue/">
<redListEntry>
<TicketID>12345</TicketID>
<FailureReasonID>1</FailureReasonID>
</redListEntry>
</InsertRedListEntry>';
//detalhe em vermelho, sem isso não funciona
$result = $client->call('InsertRedListEntry', $objeto, "http://192.1.2.3/SafeVenue/");
echo "Resultado------------------------<br>";
print_r($result);
echo "------------------------";
if ($client->fault) {
echo '<h2>Fault</h2><pre>'; print_r($result);
echo '</pre>';
} else {
$err = $client->getError();
if ($err) {
echo '<h2>(Autenticacao)</h2><pre>' . $err . '</pre>';
}
}
echo '<br><br><h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
Qualquer coisa é só dar um toque pessoal!
Upload de Arquivo com FLEX
Ai vai um exemplo de aplicação FLEX para fazer upload de arquivos!
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute”>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private fileRef:FileReference = null;
(mais…)
Log para PHP, capturando erros no PHP, sem mostrar ao usuário
Rao!
Muitos programadores adoram utilizar o “@” (arroba) para as mensagem de erro na aplicação!
Só que fazendo isso, o programador terá muito trabalho para descobrir onde está ocorrendo o erro, e qual o erro!
Então ai vai mais um script utilitário que captura os erros levantados pelo php e loga as informações em arquivo “.txt” por exemplo!
Obs. Não utilizar arroba em nenhum lugar do sistema! pois o erro não vai ser exibido na tela e sim no arquivo de log!
—————-
<?php
/**
* Include que deve ser incluido no cabeçalho de cada arquivo php,
* Possui funções para tratar erros.
*
* @author Gregui Shigunov
* @since 01/08/2007
*/
/**
* Função executada a cada excessão levantada no PHP
*
* @param int $err_no
* @param String $err_desc
* @param String $err_file
* @param int $err_line
*/
function salvarErro($err_no, $err_desc, $err_file, $err_line) {
Transformando um Objeto PHP em XML
Opa!!!! primeiro post!
Eu estava aqui num projeto em PHP, onde eu precisava gerar um conteúdo XML para dar um parse com um XSL. Meus dados vem em forma de objetos, Pois tenho minhas Classes DAOs, que me retornam os dados em objetos (VOs ou Value Objects). Bom, eu poderia apenas pegar esses objetos e e criar na raça, xml por xml! Ou então! criar um código genérico que interpretasse esse objeto, ou array.
Vamos ao código:
<?php
/*
* Autor: Gregui Shigunov
* Data: 05/09/2007
*
* Classe que converte um objeto em um XML
*
*/
class XmlUtils {
/**
* Cria um XML baseado na estrutura de um Objeto
*
* @param Object $obj
* @param boolean $attrDefault Propriedades do Objeto como TextNode ou Attribute
* @return String
*/
public static function toXml($obj, $attrDefault = true) {
$dom = new DOMDocument(‘1.0′, ‘utf-8′);
print_r($obj);
if (is_object($obj)) {
$dom->appendChild(XmlUtils::object2Xml($obj, $dom, $attrDefault));
}
if (is_array($obj)) {
XmlUtils::array2Xml($obj, $dom, $dom, $attrDefault);
}
$out = $dom->saveXML();
return $out;
}
/**
* Cria um XML baseado na estrutura de um Objeto
*
* @param Array $array de objetos e/ou arrays
* @param DOMElement $elem Objeto DOMElement onde serão adicionados os nós
* @param DOMDocument $dom Documento pai do XML
*/
private static function array2Xml($array, &$elem, &$dom, $attrDefault = null) {
$i = 0;
for ($i = 0; $i < count($array); $i++) {
$value = $array[$i];
if (is_object($value)) {
$elem->appendChild(XmlUtils::object2Xml($value, $dom, $attrDefault));
} elseif (is_array($value)) {
$novoElem = $dom->createElement(“object”);
XmlUtils::array2Xml($value, $novoElem, $dom, $attrDefault);
$elem->appendChild($novoElem);
} else {
$elem->setAttribute(“val$i”, $value);
}
}
}
/**
* Retorna um DOMElement baseado na estrutura do Objeto
*
* @param Object $obj
* @param DOMDocument $dom
* @return DOMElement
*/
private static function object2Xml($obj, &$dom, $attrDefault = null) {
$vars = get_object_vars($obj);
if (get_class($obj) != “stdClass”) {
$elem = $dom->createElement( get_class($obj) );
} else {
$elem = $dom->createElement( “objeto” );
}
$i = 0;
foreach ($vars as $chave => $valor) {
if (is_object($valor)) {
$elem->appendChild(XmlUtils::object2Xml($valor, $dom, $attrDefault));
} elseif (is_array($valor)) {
XmlUtils::array2Xml($valor, $elem, $dom, $attrDefault);
} else {
if($attrDefault){
$elem->setAttribute($chave, $valor);
} else {
$elem2 = $dom->createElement($chave);
$elemText = $dom->createTextNode($valor);
$elem2->appendChild($elemText);
$elem->appendChild($elem2);
}
}
}
return $elem;
}
}
?>
Agora um código de exemplo de uso da classe:
<?php
include_once(“XmlUtils.php”);
class Usuario {
var $nome = null;
var $cidade = null;
var $estado = null;
var $mensagens = array();
}
$usr = new Usuario();
$usr->nome = “Gregui Shigunov”;
$usr->cidade = “Curitiba”;
$usr->estado = “PR”;
$msn = null;
$msn->titulo = “Convertendo Objeto para XML”;
$msn->texto = “Note que o objeto ‘msn’ não tem um tipo específico, “.
“e note que ‘usr’ é da classe ‘Usuario’”;
$msn->to = array();
$msn->to[0] = “Elaine Cristine”;
$msn->to[1] = “gregui@gmail.com”;
$msn->to[] = “http://gregui.wordpress.com”;
$usr->mensagens = $msn;
echo XmlUtils::toXml($usr, false);
?>
Executando o códito teremos:
<?xml version=”1.0″ encoding=”utf-8″?>
<Usuario>
<nome>Gregui Shigunov</nome>
<cidade>Curitiba</cidade>
<estado>PR</estado>
<objeto val0=”Elaine” val1=”gregui@gmail.com” val2=”http://gregui.wordpress.com“>
<titulo>Convertendo Objeto para XML</titulo>
<texto>Note que o objeto ‘msn’ não tem um tipo específico, e note que ‘usr’ é da classe ‘Usuario’</texto>
</objeto>
</Usuario>
Até mais!!!!