Ho due componenti, entrambi sono una coppia parser / builder. Quindi componente A può analizzare A e creare A , componente B può analizzare B e creare B .
A e B contengono entrambe entità diverse, che vengono estratte dai parser.
Esempio, BParser funziona allo stesso modo:
$AParserResult = AParser::parse(A);
dump(
$AParserResult->getEntityZ(),
$AParserResult->getEntityX(),
$AParserResult->getEntityY(),
...
);
$aBuilderSpecification = ABuilderSpecification::new()
->addEntityZ(Z)
->addEntityY(Y)
->addEntityX(X);
A = ABuilder::build($aBuilderSpecification);
// now I have a "fully functionally" A again
Il mio compito è scrivere componente C che utilizza AParser per analizzare un A , quindi creare un BBuilderSpecification da AParserResult e poi passarlo a BBuilder e ottenere un B da esso - e viceversa, creando un B da un A .
I parser / builder sono relativamente semplici da usare, tuttavia, il mio codice nel componente C si presenta principalmente come segue:
// in method 'transformAToB()'
$AParserResult = AParser::parse(A);
$BBuilderSpecification = BBuilderSpecification::new();
if ($AParserResult->hasEntityZ()) {
$BBuilderSpecification->setEntityZ($AParserResult->getEntityZ());
}
if ($AParserResult->hasEntityX()) {
$BBuilderSpecification->setEntityX($AParserResult->getEntityX());
}
// sometimes some simple conditions maybe, and simple transformations
if ($AParserResult->hasEntityY() && someCondition()) {
$BBuilderSpecification->setEntityY(to_lower_case($AParserResult->getEntityY()));
}
...
// Goes on for about 10 more entities
// and very similar code in the method 'transformBToA'
Questo è un codice molto ripetitivo - mi chiedo se ci sia un modo per ripulirlo / refactarlo - senza introdurre ulteriore complessità aggiungendo una configurazione XML o così ... alla fine è (quasi) solo codice boilerplate.
La lingua è PHP, se questo è importante.