C'est justement pour le moment privé puisqu'il est à destination de mon entreprise
Je n'ai pas pour le moment l'aval de la direction pour le rendre opensource (j'ai pas encore demandé).
Je dis juste que la conversation ne va pas dans le bon sens, puisque je viens parler d'un design de programmation et la discussion dérive sur ce que le PHP permet comme bêtise, ce qui n'était pas trop le sujet initial. Après c'est peut-être moi qui ai apporté le débat dans ce sens, dans ce cas c'est de ma faute ^^
L'exemple peut-être le plus parlant et le plus pertinent "avant/après" East :
Pas East :
East :
Mais ça reste un peu foireux car le code East gère plus de cas et est mieux découpé (par exemple dans le cas non East, $this->targets est initialisé en dehors de l'hydrate à proprement parlé)
(Et en effet j'ai réécrit 100% le code en East, j'ai terminé hier et en plus il est 100% testé)
Je n'ai pas pour le moment l'aval de la direction pour le rendre opensource (j'ai pas encore demandé).
Je dis juste que la conversation ne va pas dans le bon sens, puisque je viens parler d'un design de programmation et la discussion dérive sur ce que le PHP permet comme bêtise, ce qui n'était pas trop le sujet initial. Après c'est peut-être moi qui ai apporté le débat dans ce sens, dans ce cas c'est de ma faute ^^
L'exemple peut-être le plus parlant et le plus pertinent "avant/après" East :
Pas East :
public function current()
{
$objects = array();
foreach ($this->targets as $alias => $columns) {
foreach ($columns as $column) {
if (isset($objects[$alias]) === false) {
$entityName = $this->entityManager->getClass($column['table']);
if ($entityName === null) {
continue;
}
$objects[$alias] = new $entityName();
}
$fields = $this->metadataList[$column['table']]->getFields();
if (isset($fields[$column['name']]['fieldName']) === true) {
$propertyName = 'set' . ucfirst($fields[$column['name']]['fieldName']);
$objects[$alias]->$propertyName($this->iteratorCurrent[$column['index']]);
}
}
}
return $objects;
}
East :
public function hydrate($columns = array())
{
$result = array();
$metadataList = array();
foreach ($columns as $column) {
if ($column['table'] === '') {
$column['table'] = 'db__table';
}
if (isset($result[$column['table']]) === false) {
$this->metadataRepository->findMetadataForTable(
$column['orgTable'],
function ($metadata) use ($column, &$result, &$metadataList) {
$metadataList[$column['table']] = $metadata;
$result[$column['table']] = $metadata->createObject();
},
function () use (&$result, $column) {
$result[$column['table']] = new \stdClass();
}
);
}
if (isset($metadataList[$column['table']]) === true
&& $metadataList[$column['table']]->hasColumn($column['orgName'])
) {
$metadataList[$column['table']]->setObjectProperty(
$result[$column['table']],
$column['orgName'],
$column['value']
);
} else {
$property = 'db__' . $column['name'];
$result[$column['table']]->$property = $column['value'];
}
}
return $result;
}
Mais ça reste un peu foireux car le code East gère plus de cas et est mieux découpé (par exemple dans le cas non East, $this->targets est initialisé en dehors de l'hydrate à proprement parlé)
(Et en effet j'ai réécrit 100% le code en East, j'ai terminé hier et en plus il est 100% testé)