Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tudo bem pessoal
Não sei se este assunto que irei abordar e deste tópico Programação + PHP, mas vim aqui pois a minha dúvida é sobre interpretar ou converter o diagrama de classe para código php.
Sei que composição em UML é representada com essa seta/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img208/6185/foua.png&key=6148f02951c6c69fd65249f0aff3dd411b844f80964f4868f4cee6d667c5c6b2" alt="foua.png" />
Só que eu lendo o livro (Padrões de Projeto em PHP da editora: O'Reilly) o autor descreveu essa seta/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img560/2056/81xu.png&key=902f996654d9c96cd976dced26d2ebb096b3776f442614e367225ca32e1267a7" alt="81xu.png" /> nos diagramas de classes, e pareceu muito com uma composição(no código). veja a imagem da pagina deste livro onde eu vi isso, neste link http://imageshack.com/a/img607/612/a4v5.jpg
E ae pessoal qual diferença de /applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img208/6185/foua.png&key=6148f02951c6c69fd65249f0aff3dd411b844f80964f4868f4cee6d667c5c6b2" alt="foua.png" /> para essa /applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img560/2056/81xu.png&key=902f996654d9c96cd976dced26d2ebb096b3776f442614e367225ca32e1267a7" alt="81xu.png" /> nos diagramas de classes e na pratica na linguagem também?
Aproveitando esse tópico, poderiam me descreverem como seria o código em php, de cada um desses diagramas de classes:
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img823/3440/o1iu.png&key=c64af9829aa51e14c7dc781fba3321b5010f47a21405624e99e1603ffc63fc25" alt="o1iu.png" />
Obs.: Sei que uml é só uma representação e não como o código vai ser exatamente na linguagem. Só que vocês me passando o código de como seria, ficaria mas fácil de eu entender, pois estou com dificuldade de entender/interpretar Diagramas de classes passando para o código.
Agradeço muito quem me ajudar
http://msdn.microsoft.com/en-us/library/dd409437%28VS.100%29.aspx
sabe quando vc uma vaga de emprego que diz "conhecimento em UML"..
então... é essa coisa aí..
>
http://msdn.microsoft.com/en-us/library/dd409437%28VS.100%29.aspx
sabe quando vc uma vaga de emprego que diz "conhecimento em UML"..
então... é essa coisa aí..
Só aproveitando o tópico. "Essa coisa aí" vale a pena estuda-la? É sempre necessário uso do UML? Gostaria de ler a opinião de vocês sobre o UML.
É um porre e eu pessoalmente não uso na prática. Mas um monte de empresa requer e um monte de livros/artigos/especificações/documentações usam. É bom saber.
bom saber né.. conhecimento nunca é demais..
ainda mais se for para algo com relevante requisição..
Dei uma lida, pesquisei algumas coisa e cheguei na conclusão que, se não é a coisa mais chata de se fazer, está brigando para ser. Como o enrico disse "é um porre". Já que é algo com relevante requisição, custa nada ler uns livros sobre.
Eu concordo com Enrico é muito chato,para uma empresa pequena aonde tem um ou dois funcionário realmente não vejo muito a necessidade, porem com o " caso de uso " é importante, por que digamos uns dos dois ou os dois saiam do projeto ai pelo "caso de uso" ou "qualquer outro diagrama "os próximo saberão o que esta acontecendo dentro do projeto.
Agora em uma empresa grande aonde se encontra varias pessoas trabalhando no mesmo projeto eu acho imprescindível o uso da "UML", para que cada um possa desenvolver a sua tarefa de acordo com a necessidade do projeto.
Eu não construiria uma casa sem planta e um engenheiro
São abordagens diferentes em contextos diferentes.
Uma casa precisa de uma planta e uma especificação completa porque não é fácil "testar" e o caos causado por uma falha pode ser a morte de indivíduos.
Além disso, UML é muito mais sobre design do que algorítimo.
#9,
conforme o #10,
se formos fazer analogia com uma construção civil simples, uma casa por exemplo, o UML estaria mais para maquete do que para a planta em si.
Muito obrigado pela contribuição de vocês pessoal, na minha opinião eu acho UML importante, pois como disse o @Enrico
É um porre e eu pessoalmente não uso na prática. Mas um monte de empresa requer e um monte de livros/artigos/especificações/documentações usam. É bom saber.
Galera vendo esse diagrama de classe abaixo, montei o código na pratica de como seria mais ou menos, corrijam-me se algo estiver errado. Espero ajuda de vocês.
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img812/8708/qvb1.png&key=52e9d0320483bff84e1d4089895f76f0986615ede33b3598eb2c386aebde1837" alt="qvb1.png" />
Como seria o código na pratica desse diagrama de classe:
Interface Pessoa para implementar a classe Estudante
interface Pessoa{
public function setNome( String $nome );
public function getNome();
public function setIdade( Int $idade );
public function getIdade();
}
Classe Estudante
class Estudante implements Pessoa{
private $nome;
private $idade;
public function setNome( String $nome ) {
$this->nome = $nome;
}
public function getNome() {
return $this->nome;
}
/* Outros Métodos SET e GET */
}
Classe EquipeFutebol
class EquipeFutebol{
private $jogadores = array();
public function setJogador(Pessoa $pessoa) {
if( array_key_exists($pessoa->nome, $this->jogadores) ){
throw new Exception('Esta pessoa já faz parte da equipe');
if($this->quantJogadores() > 22){
throw new Exception('A equipe so pode ter 22 no maximo de jogadores');
}
}
$this->jogadores[$pessoa->nome] = $pessoa;
}
public function quantJogadores() {
return count($this->jogadores);
}
}
Classe Disciplina
class Disciplina{
private $alunos = array();
public function setAluno(Pessoa $pessoa) {
if( array_key_exists($pessoa->nome, $this->alunos) ){
throw new Exception('Esta pessoa já faz parte da turma');
}
$this->alunos[$pessoa->nome] = $pessoa;
}
}
Dúvidas:
1) Como colocar um limite de 11 jogadores na classe EquipeFutebol e a classe Estudante ter um limite de 8 Disciplinas?
2) As propriedades (jogador e Aluno) são atributos da classe Estudante ou são atributos das classes EquipeFutebol e Disciplina?
>
interface Pessoa{
public function setNome( String $nome );
public function getNome();
public function setIdade( Int $idade );
public function getIdade();
}class Estudante implements Pessoa{
private $nome;
private $idade;
public function setNome( String $nome ) {
$this->nome = $nome;
}
public function getNome() {
return $this->nome;
}
/* Outros Métodos SET e GET */
}
Aqui, como eu costumo falar, setters são inúteis. Uma instância de estudante representa um estudante, e um estudante não muda de nome e/ou idade durante o tempo de execução. Eles podem ser simples Value Objects e a interface ficaria mais simples.
Outra coisa que vale a pena falar é que o PHP não suporta type hinting de scalar values (string, int, etc.).
interface Pessoa {
public function getNome();
public function getIdade();
}
class Estudante implements Pessoa {
private $nome;
private $idade;
public function __construct( $nome, $idade ) {
$this->nome = $nome;
$this->idade = $idade;
}
public function getNome() {
return $this->nome;
}
public function getIdade() {
return $this->idade;
}
}
1) Como colocar um limite de 11 jogadores na classe EquipeFutebol e a classe Estudante ter um limite de 8 Disciplinas?
Com um simples if count then exception.
2) As propriedades (jogador e Aluno) são atributos da classe Estudante ou são atributos das classes EquipeFutebol e Disciplina?
Veja bem o que você disse no início:
Logo:
Podemos usar um Decorator junto com algumas outras interfaces para isso:
<?php
interface Person {
public function getName();
public function getAge();
}
interface Player extends Person {
public function playsFor(Team $team);
}
interface Team {
public function getName();
public function hasPlayer(Player $player);
public function getPlayers();
}
abstract class Student implements Person {
private $name;
private $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function getName() {
return $this->name;
}
public function getAge() {
return $this->age;
}
abstract public function studies(Course $course);
}
class InactiveStudent extends Student {
public function studies(Course $course) {
return false;
}
}
class ActiveStudent extends Student {
private $courses;
public function __construct($name, $age, array $courses) {
if (count($courses) < 1)) {
throw new LogicException('Um estudante ativo deve ter no mínimo uma matéria.');
}
if (count($courses) > 8)) {
throw new LogicException('Um estudante ativo deve ter no máximo oito matérias.');
}
foreach ($courses as $course) {
if (! $course instanceof Course) {
throw new InvalidArgumentException('Todas as matérias devem ser do tipo "Course".');
}
}
$this->courses = $courses;
parent::__construct($name, $age);
}
public function studies(Course $course) {
return in_array($course, $this->courses);
}
}
class FootballPlayer implements Player {
private $person;
private $team;
public function __construct(Person $person, Team $team) {
$this->person = $person;
$this->team = $team;
}
public function getName() {
return $this->person->getName();
}
public function getAge() {
return $this->person->getAge();
}
public function playsFor(Team $team) {
return $this->team === $team;
}
}
class Course {
private $name;
private $students;
public function __construct($name, array $students = []) {
$uniqueStudents = array_unique($students);
foreach ($uniqueStudents as $student) {
if (! $student instanceof Student) {
throw new InvalidArgumentException('Todos os estudantes devem ser do tipo "Student".');
}
if (! $student->studies($this)) {
throw new LogicException('O estudante "' . $student->getName() . '" não está cursando a disciplina "' . $this->name . '".');
}
}
$this->name = $this->name;
$this->students = $uniqueStudents;
}
public function getName() {
return $this->name;
}
public function hasStudent(Student $student) {
return in_array($student, $this->students);
}
public function getStudents() {
return $this->students;
}
}
class FootballTeam implements Team {
private $name;
private $players;
public function __construct($name, array $players) {
$uniquePlayers = array_unique($players);
if (count($uniquePlayers) < 11) {
throw new LogicException('Não há 11 jogadores para a equipe "' . $name . '".');
}
if (count($uniquePlayers) > 22) {
throw new LogicException('Há mais de 22 jogadores para a equipe "' . $name . '".');
}
foreach ($uniquePlayers as $player) {
if (! $player instanceof Player) {
throw new InvalidArgumentException('Todos os jogadores devem ser do tipo "Player".');
}
if (! $player->playsFor($this)) {
throw new LogicException('O jogador "' . $player->getName() . '" não está jogando no time "' . $this->name . '".');
}
}
$this->name = $name;
$this->players = $uniquePlayers;
}
public function getName() {
return $this->name;
}
public function hasPlayer(Player $player) {
return in_array($player, $this->players);
}
public function getPlayers() {
return $this->players;
}
}Obrigado pela força @Enrico, clareou muita coisa :D
Só umas dúvidas:
Há dois problemas aqui para serem resolvidos ainda:
1) Como assim interação e mapeamento, não intendi o que você quis dizer com isso
2) porque você fez classes estudante ativo e estudante inativo??
3) No diagrama que apresentei acima, tem duas setas com os nomes (joga e cursa) o que elas significam? circulei em vermelho a setas veja abaixo na imagem.
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.com/a/img46/1043/jwi2.png&key=e75d90581ea8badca027d4449ab782999de5e10fed77945aa6aa854ef46b42ae" alt="jwi2.png" />
Como assim interação e mapeamento, não intendi o que você quis dizer com isso
Não há um comportamento com isso, é apenas um mapeamento de dados (estudantes, disciplinas e times).
porque você fez classes estudante ativo e estudante inativo??
Por causa da especificação que você postou na imagem. Analise o que está escrito: "um estudante pode cursar no máximo oito disciplinas, ou estar com a matrícula trancada". Logo, há duas opções para um estudante: estar ativo (cursar até oito disciplinas) ou estar inativo (não cursar nada).
Estudante
Ativo Inativo
3) No diagrama que apresentei acima, tem duas setas com os nomes (joga e cursa) o que elas significam? circulei em vermelho a setas veja abaixo na imagem.
Demonstra que um Estudante pode jogar em uma EquipeFutebol (que tem de 11 a 22) e cursar em até 8 tipos de Disciplina (que tem infinitos).
Obrigado pela ajuda e paciência Enrico :)
Poderia me explicar uma associação recursiva?
li que é quando a uma conexão entre dois objetos, mas os objetos conectados são da mesma classe
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.macoratti.net/vb_uml25.gif&key=d2801eb632a3f5da7901fe067a4ba6804328b097ef372a5c54822487b538e330" alt="vb_uml25.gif" />
Então no código ficaria mais ou menos assim?
Veja:
class Pessoa {
private $nome;
private $sexo;
private $companheiro;
public function setNome() {
$this->nome = $nome;
return $this; //retorna o objeto para fazer o encadeamento de métodos
}
public function setSexo($sexo) {
switch (strtolower($sexo)) {
case 0:
case 'm':
case 'masculino':
$this->sexo = 'm';
break;
case 1:
case 'f':
case 'feminino':
$this->sexo = 'f';
break;
default:
$this->sexo = 'indefinido';
}
return $this; //retorna o objeto para fazer o encadeamento de métodos
}
public function setCompanheiro( Pessoa $companheiro ) {
if ( $companheiro->getSexo() == $this->getSexo() ) {
throw new Exception('Não pode ser do mesmo sexo, tem que ser do sexo oposto');
}
$this->companheiro = $companheiro;
return $this; //retorna o objeto para fazer o encadeamento de métodos
}
/**
* Métodos GET...
*/
}Vamos usar isso agora:
$joao = new Pessoa();
$maria = new Pessoa();
$joao->setNome('joão')->setSexo('m')->setCompanheiro($maria);
$maria->setNome('maria')->setSexo('f')->setCompanheiro($joao);>
if ( $companheiro->getSexo() == $this->getSexo() ) { throw new Exception('Não pode ser do mesmo sexo, tem que ser do sexo oposto'); }
Homofobia é crime :rolleyes: ... ehaehuaehuaheuahue
Anyway, a ideia é essa mesma...
hahahahahahahaha verdade :assobiando:
Da uma olha neste pdf acho que vai te ajudar bastante.
http://www.les.inf.puc-rio.br/wiki/images/7/7f/Aula1-diagrama_classes.pdf
Em questão do código vai depender muito da situação do problema.
Abraços