Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wilson Batista

Interpretar Diagrama de Classe para Código PHP.

Recommended Posts

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 setafoua.png


Só que eu lendo o livro (Padrões de Projeto em PHP da editora: O'Reilly) o autor descreveu essa seta81xu.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 foua.png para essa 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:

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom saber né.. conhecimento nunca é demais..

 

ainda mais se for para algo com relevante requisição..

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.


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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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 */
}

 

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:

- estudante pode ter uma equipe de futebol

- equipe tem entre 11 e 22 estudantes

- estudante pode ter matrícula trancada ou ele tem no máximo 8 disciplinas

- disciplina pode ter quantos alunos quiser, mas também pode não ter nenhum, pois todos podem estar com matrícula trancada

 

Logo:

- se há uma equipe, há no mínimo 11 estudantes para ela

- cada estudante tem um tipo de relação com a "escola": matrícula trancada ou no máximo oito disciplinas

- cada disciplina tem uma lista de estudantes vazia ou não (e provavelmente um nome, um professor, uma grade de horário, mas deixemos isso para depois)

- cada estudante pode opcionalmente ter uma equipe

 

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;
  }
}

Há dois problemas aqui para serem resolvidos ainda:

- não há nenhuma interação, apenas um mapeamento

- há repetição de código na validação do array, parte é culpa do PHP não ter um tipo Set nem suportar generics

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela força @Enrico, clareou muita coisa :D

Só umas dúvidas:

Há dois problemas aqui para serem resolvidos ainda:
- não há nenhuma interação, apenas um mapeamento
- há repetição de código na validação do array, parte é culpa do PHP não ter um tipo Set nem suportar generics

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.

jwi2.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

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).

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

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...
     */
}

Perceba que o método setCompanheiro espera em seu argumento um objeto do tipo Pessoa, que e da mesma classe (isso seria essa tal de associação recursiva?)

 

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);

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.