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.