Ir para conteúdo

POWERED BY:

Arquivado

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

Prove Yourself

Problema com análise

Recommended Posts

Fiz uma classe que representa um arquivo em disco, um wrapper para um arquivo. Existem operações de cópia, deleção, mover (ou renomear) e etc. Agora quero fazer outra classe que represente um arquivo que foi enviado para o servidor (upload). Até aí tudo bem, eu poderia estender a classe arquivo e adicionar os métodos desejados. Mas o problema é que eu quero criar classes mais específicas. Por exemplo, a classe Imagem contém as mesmas operações/propriedades da classe arquivo. Por outro lado, a classe Imagem pode (ou não) ser uma imagem enviada para o servidor (upload). Como eu poderia implementar isso sem ficar preso a uma implementação? Pensei em interfaces mas não sei como aplicar nesse caso.

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A primeira coisa que você precisa notar é que, independentemente de ter vindo de um upload ou não, o arquivo estará em disco (no diretório temporário ou em qualquer outro).

 

Como tudo é arquivo, você precisa definir a interface de um arquivo. Para isso, você pode utilizar a construção de linguagem "interface" ou pode utilizar herança de classes mas, independentemente da forma que você fará, o primeiro passo é definir a interface de um arquivo qualquer.

 

Com essa interface você poderá "especializar" sua classe para situações mais específicas, como tratamento de imagens e outros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A diferença é que para mover uma arquivo de upload eu uso move_uploaded_file, não copy ou rename, por exemplo... Então vamos por partes, abaixo, minha interface:

<?php
namespace Filesystem;

Interface FileInterface {
    public function getPath();
    public function getDirectory();
    public function getName();
    public function getExtension();
    public function getMime();
    public function getSize();
    public function move($name);
    public function copy($name);
    public function delete();
}
?>
Valeu por enquanto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então vamos por partes, abaixo, minha interface:

<?php
namespace Filesystem;

Interface ...

Apesar de o PHP não ser sensível a caixa (ainda ?), é interessante que você respeite a forma que as palavras chave são definidas e, no caso da construção de linguagem "interface", ela é toda escrita em minúsculo.

 

namespace Filesystem;

Interface FileInterface {
public function getPath();
public function getDirectory();
public function getName();
public function getExtension();
public function getMime();
public function getSize();
public function move($name);
public function copy($name);
public function delete();
}

 

Pelo que pude perceber na sua interface, você dará mais responsabilidades do que deveria ao objeto, não faça isso.

 

Separe o que é informação do que é manipulação em interfaces distintas http://forum.imasters.com.br/public/style_emoticons/default/seta.gif delegue em vez de assumir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo... interface em minúsculo :)

A separação seria entre os métodos get dos métodos específicos de um arquivo (copy, move, etc...) ?

Vou pesquisar sobre delegação (já li sobre isso e não entendi ...)

UPDATE: DELEGAÇÃO === COMPOSIÇÃO? Eu sei o que é composição, como não entendi delegação? :P

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então teriamos apenas isso:

 

Ainda não, isso seriam comandos e não manipulações.

 

size, name, path http://forum.imasters.com.br/public/style_emoticons/default/seta.gif informações

move, delete, copy http://forum.imasters.com.br/public/style_emoticons/default/seta.gif comandos

open, write, close http://forum.imasters.com.br/public/style_emoticons/default/seta.gif manipulações

 

Delegar é definir uma responsabilidade a alguma coisa, no seu caso você deve delegar a responsabilidade de manipulação à manipuladores, e o que não for exclusivamente manipulação, a outros objetos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui é FileInterface:

Interface FileInterface {}

 

Onde estariam os métodos comum a todo tipo de arquivo.

getDirectory() por exemplo.

 

Então, como o João falou, você poderá especializar suas classes que implementarem FileIterface com métodos para manipulação de arquivos.

copy() por exemplo.

 

Ou criar outra interface de manipulação, FileManipulate, com esses métodos de mover arquivo, etc.

Então nas suas classes você poderia implements FileInterface, FileManipulate.

 

Se eu estiver errado, da uma luz aonde!

:lol:

 

Putz, não tinha visto o último post seu João.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, não tinha previsto open/close/write/read. Na verdade open, close, read e write não fazem parte do que pretendo fazer. Eu estou usando funções como copy, rename e unlink do PHP. Mas sim, eles fazem parte da manipulação de arquivos, isso não temos dúvida ...

Referente a essas implementações que não irei usar, devo implementa-las?

Eu devo sempre "ismiuçar" a análise dessa forma? Muito legal, onde vocês aprendem isso tudo? Quanto mais eu leio menos entendo...

Trovoada, depois posto o código modificado :)

Valeu pessoal, obrigadão por enquanto.

 

<?php
namespace Filesystem;

interface FileInterface {
        public function getPath();
        public function getDirectory();
        public function getName();
        public function getExtension();
        public function getMime();
        public function getSize();
}
?>
<?php
namespace Filesystem;

interface FileManipulationInterface {
        public function open();
        public function read();
        public function write();
        public function close();
}
?>
<?php
namespace Filesystem;

interface FileCommandInterface {
        public function move($name);
        public function copy($name);
        public function delete();
}
?>

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.