D'accord, ok, j'avais pas compris que le listValid se charge de faire le tri "y'avait un PDF/y'en avait pas". C'est vrai qu'il faut s'habituer au fait que ce soit pas lisible dans sa globalité (mais, c'est voulu, donc faut juste se caler l'esprit dans ce sens là, d'accord).
J'objecte, oui, parce qu'avant de me lancer dans une technique assez lourde, j'aimerai la questionner un max.
D'ailleurs, la classe File ne me semble pas East-Oriented?! Car File est forcée de retourner une chaîne String comme type, voire une classe castable en String (sinon, le switch est cassé).
Du coup, faudrait une méthode, dans file, passFileTypeTo(FileAggregator fg)...
Voire même, une classe dédiée...
Du coup, j'arriverai à:
Mais du coup, FileAggregator_FileTypeCommand juste dédiée à récupérer le $type... Je trouve cela encombrant.
Ou alors, la règle East du "no return / no getter" est à pondérer et non à appliquer strictement partout ?
Finalement, ce qui me gène (outre la verbosité), c'est surtout que je ne vois pas ce que cela apporte, puisque get* ou "push*" (ou similaire), la classe appelée se retrouve quand même contrainte: soit par le typage de retour du getter, soit par le typage des paramètres de la classe où "pusher". La seule liberté ajoutée serait donc de ne pas pusher, mais du coup, cela me semble se rapprocher d'un "je sais ce que je veux, mais je prends le risque que ce soit juste pas fait", ce qui (au vu de mon expérience dans des associations IRL ) finit souvent en "rien ne se passe".
J'objecte, oui, parce qu'avant de me lancer dans une technique assez lourde, j'aimerai la questionner un max.
D'ailleurs, la classe File ne me semble pas East-Oriented?! Car File est forcée de retourner une chaîne String comme type, voire une classe castable en String (sinon, le switch est cassé).
Du coup, faudrait une méthode, dans file, passFileTypeTo(FileAggregator fg)...
Voire même, une classe dédiée...
Du coup, j'arriverai à:
<?php
interface IFileTypeCommand {
public void run(String $type);
}
class FileAggregator_FileTypeCommand implements IFileTypeCommand() {
private FileAggregator $fg;
private FileUploader $fileUploader;
private File $file;
private $lineNumber;
public __construct(FileAggregator $fg, File $file, $lineNumber, FileUploader $fileUploader) {
$this->fg = $fg;
$this->fileUploader = $fileUploader;
$this->file = $file;
$this->lineNumber = $lineNumber;
}
public void run(String $type) {
$fg->addTyped($this->file, $type, $this->lineNumber, FileUploader $this->fileUploader) {
}
}
class FileAggregator implements ArrayIterator
{
private File[] $files = [];
public void add(File $file, $lineNumber, FileUploader $fileUploader) {
$file->pushTypeTo(
new FileAggregator_FileTypeCommand($this, $file, $lineNumber, $fileUploader));
}
public void addTyped(File $file, $type, $lineNumber, FileUploader $fileUploader) {
switch ($type) {
case 'pdf':
if (isset($this->files[$lineNumber]['pdf']) === true) {
$previous = $this->files[$lineNumber]['pdf'];
$previous['fileUploader']->fileRejected(
$previous['file'], 'Two PDFs for the same line');
$fileUploader->fileRejected($file, 'PDF already exist on this line');
unset($this->files[$lineNumber]);
} else
$this->files[$lineNumber]['pdf']
= ['fileUploader' => $fileUploader, 'file' => $file];
break;
case 'dxf':
case 'dwg':
if (isset($this->files[$lineNumber][$file->type]) === false)
$this->files[$lineNumber][$file->type] = array();
$this->files[$lineNumber][$file->type][]
= ['fileUploader' => $fileUploader, 'file' => $file];
break;
}
}
public function listValidFiles(FileUploader $fileUploader)
{
foreach ($this->files as $files) {
if (isset($files['pdf']) === true) {
foreach ($files as $type as $file) {
$fileUploader->upload($file);
}
}
else if (count($files) > 0) { // equiv: isset ['dxf'] || isset ['dwg']
foreach ($files as $type as $file) {
$fileUploader->fileRejected($file, 'No PDF for this line');
}
}
}
}
}
class File
{
public $filename;
private $type;
public pushTypeTo(FileTypeCommand $fc) {
$fc->run($this, $this->filename);
}
}
class FileUploader
{
public function thereIsAFileToUpload($lineNumber, File $file, FileAggregator $fileAggregator)
{
$fileAggregator->add($file, $lineNumber, $this);
}
public function fileRejected(File $file, $message)
{
echo 'File rejected ' . $message;
}
public function uploadAllFiles()
{
$fileAggregator->listValidFiles($this);
}
public function upload(File $file)
{
// Upload stuff for $file
}
}
Mais du coup, FileAggregator_FileTypeCommand juste dédiée à récupérer le $type... Je trouve cela encombrant.
Ou alors, la règle East du "no return / no getter" est à pondérer et non à appliquer strictement partout ?
Finalement, ce qui me gène (outre la verbosité), c'est surtout que je ne vois pas ce que cela apporte, puisque get* ou "push*" (ou similaire), la classe appelée se retrouve quand même contrainte: soit par le typage de retour du getter, soit par le typage des paramètres de la classe où "pusher". La seule liberté ajoutée serait donc de ne pas pusher, mais du coup, cela me semble se rapprocher d'un "je sais ce que je veux, mais je prends le risque que ce soit juste pas fait", ce qui (au vu de mon expérience dans des associations IRL ) finit souvent en "rien ne se passe".