gedalinux
(usa Slackware)
Enviado em 23/11/2008 - 14:10h
Meu caro,
OOP por ser um processo apenas de definicao é um pouco "doido" mesmo. Contudo deve-se parar e analisar seu processo, quando somente apos, surgirao as classes...
De posse de sua solicitacao verifico que:
1 : a classe Historico deve representar todo um histórico relacionado a um documento, portanto surgem algumas derivações no processo, que dependem principalmente do analista ou desenvolvedor, em alguns casos, uma é que, caso deseje isolar os dados em uma classe separada somente para cumprir um requisito básico de OOP (coesão) esta classe deverá receber uma referencia de um tipo Documento, daí surgiu sua dúvida sobre herança ou agregação, para o caso seria uma agregação o mais conveniente, o que uso agressivo de um sistema poderia haver uma
grande economia de recursos.
Porém percebeu também que suas classes são pequenas o suficiente para quase não ter métodos isso deixa claro que nem herança, nem agregação serão necessárias, por que de uma forma geral estas classes representam nada mais que ATRIBUTOS da classe Documento.
2: Vendo o relacionamento entre Documento e Historico, percebe-se claramente que se mantém um cardinalidade de 1:N (isto é um documento pode ter muitos registros históricos) então, se nos livrarmos das teorias e partirmos para uma linguagem final, terias a seguinte solucao
2.1: JAVA: manteria um Collection de Historico, usando ArrayList, Maps ou o que quisesse;
2.2: PHP5: Nessa linguagem somos levados a duas decisões, a primeiro totalmente baseada nos conceitos de OOP, implementamos uma classe Historico que recebe um referencia de Documento.
Lembre que mesmo assim as duas classes serão instanciadas para cumprir o requisito.
O conceito acima ficaria mais ou menos assim:
//modelo para agregacao
class Documento{
private $status ;
public function __construct(){
}
}
//Ou modelo para composicao
class Documento{
private $status ;
private $history;
public function __construct(){
//uma desvantagem desse processo é que cada
//objeto Documento, terá uma Instancia de Historico
$this->history = new Historico($this);
}
public function addHistory($history){
$this->history->addHistory($history);
}
}
//==========================================================
class Historico{
private $document;
private $history;
public function __construct(Documento $doc){
$this->document = doc;
}
public function addHistory($history){
$this->history[]=$history;
}
public function getHistory(){
foreach ($this->history as $historico){
echo $historico."\n";
}
}
}
//usando como composicao
$document = new Documento();
$document->addHistory("24-10-2008");
$document->addHistory("25-10-2008");
$document->addHistory("26-10-2008");
$document->addHistory("27-10-2008");
//ou entao usando como agregacao
$document = new Documento();
$historico = new Historico($document);
$historico->addHistory("24-10-2008");
$historico->addHistory("25-10-2008");
$historico->addHistory("26-10-2008");
A segunda decisão seria simplesmente usar um array interno a classe Documento, armazenando temporariamente o histórico do documento em um vetor de PHP, quando quisesse ler, bastaria
iterar o array.
3: O relacionamento entre Documento e Status e de 1:1 e ele se refere exclusivamente a Documento, assim desde o principio ele nada mais é que um ATRIBUTO e privado da classe Documento.