Non so come refactoring un pezzo di codice che differisce da altro nel numero di condizioni controllate su una clausola if
. Lascia che ti mostri un esempio del mondo reale che sto affrontando proprio ora.
L'unica differenza tra i due metodi è che all'interno elseif
, controlla una condizione aggiuntiva sul nuovo parametro.
Metodo 1:
public function getKeysToInvalidateOnCreation($entity, $allKeys)
{
$result = [];
foreach ($allKeys as $key) {
$entities_in_key = explode('+', substr($key, 0, strpos($key, '_')));
$key_type = substr($key, strrpos($key, '_'));
foreach ($entities_in_key as $entity_in_key) {
if ($entity_in_key == $entity) {
if ($key_type == self::GET_ALL_KEY || $key_type == self::CUSTOM_KEY) {
$result[] = $key;
} elseif (strpos($key, 'id:') === false) {
$result[] = $key;
}
}
}
}
return $result;
}
Metodo 2:
public function getKeysToInvalidateOnModification($entity, $allKeys, $modifiedId)
{
$result = [];
foreach ($allKeys as $key) {
$entities_in_key = explode('+', substr($key, 0, strpos($key, '_')));
$key_type = substr($key, strrpos($key, '_'));
foreach ($entities_in_key as $entity_in_key) {
if ($entity_in_key == $entity) {
if ($key_type == self::GET_ALL_KEY || $key_type == self::CUSTOM_KEY) {
$result[] = $key;
} elseif (strpos($key, 'id:') === false ||
strpos($key, 'id:'.$modifiedId) !== false) {
$result[] = $key;
}
}
}
}
return $result;
}
Quello che vorrei fare è estrarre tutto il codice interno in un nuovo metodo protetto che avrebbe il terzo parametro come facoltativo, e poi fare il secondo controllo solo se è impostato quel parametro. Ma per me ha una specie di cattivo odore: sembra come aggiungere una bandiera al metodo.
Quale sarebbe la strategia di refactoring appropriata?