Spesso, attraverso l'aspetto dell'importazione del mio framework, ho accesso a determinati dati che le funzioni che sto per utilizzare avranno sicuramente bisogno di se stessi.
Ho "resolver" che queste funzioni possono usare per ottenere i dati aggiuntivi di cui hanno bisogno ma sono operazioni molto pesanti e stavo pensando:
Dato che ho già accesso a quei dati esatti di cui la funzione avrebbe bisogno, perché non limitarti a passarli e non affidarti a questi risolutori heavy-lift per averlo per me?
Incontra "argomenti di supporto" - Posso semplicemente passarli a un array e all'interno della mia funzione, controlla se sono passati - altrimenti, chiedi ai resolver di darli (dato che ho bisogno dei dati in entrambi i casi).
Ecco il mio codice attuale:
/**
* Retrieves the component activated before a target component.
*
* @internal Targets the 'active_history' in the mother array, as such, it doesn't look at the installed history at all.
*
* @param string $target_component_name The target component name, used as a starting point.
* @param boolean $skip_check Flag to allow skipping of certain checks.
* @param array $support_package A support package passed from outside callers that can speed up the execution of this function due to bypasses of checks.
*
* @return string|mixed Returns the string of the component found before our target on success and a mix of boolean / WP_Errors on failure.
*/
public static function getActiveComponentBeforeThisOne( $target_component_name, $skip_check = False, $support_package = null )
{
$installed_components = get_option( 'currently_installed_demo_components' );
//Support check 1.
if( $skip_check == False ) {
if( !self::determineIfDemoComponentIsInstalled( $target_component_name ) ) {
return new \WP_Error(
'component-not-installed',
esc_html__( 'Component is not currently installed.', 'setup-theme' )
);
}
}
//Support check 2.
$local_package = [
'component_category' => ''
];
if( isset( $support_package['component_category'] ) ) {
$local_package['component_category'] = $support_package['component_category'];
} else {
$local_package['component_category'] = self::getComponentCategoryByName( $target_component_name );
}
//Do some things with $local_package['component_category'] here.
}
Come puoi vedere, il primo supporto $skip_check
mi consente di impostare un flag per saltare un controllo pesante che può essere ed è, nel 95% dei casi, eseguito prima che venga chiamata questa funzione.
Questa è una trappola: in un sistema basato su eventi come WordPress (anche se i ganci sono perfettamente eseguiti), si potrebbero riscontrare errori nelle condizioni di gara, specialmente all'interno delle chiamate AJAX (che è dove questi sono utilizzati). Il mio assegno non farebbe nulla allora. Anche se nel 99,9% dei casi in cui funziona, c'è quella terribile situazione in cui non funziona e finisce per rompere tutto.
Il secondo supporto è $support_package
. Sto chiamando getActiveComponentBeforeThisOne
da un contesto in cui ho già accesso a molti dati, in particolare component_category
, quindi, per quasi tutti i casi, posso solo fornire alla mia funzione, ancora, di saltare questi pesanti controlli che rallentano me giù.
Questa è una trappola due: potrei semplicemente decidere di chiamare getComponentCategoryByName
dove chiamo anche getActiveComponentBeforeThisOne
se, a quel punto, vedo che component_category
non è disponibile per me. Ciò introdurrebbe chiarezza su cosa sta succedendo. Quindi il vero problema qui è la visibilità e il secondo, forse un problema importante è la separazione delle preoccupazioni. Così com'è, la mia funzione getActiveComponentBeforeThisOne
finisce per fare troppo. Una funzione che genera molti dati in genere è soddisfacente: non è intelligente separare le operazioni di un array in un'unica operazione in più funzioni perché diventa rapidamente un cluster-f da seguire: i buoni commenti vanno bene. Ma qui, chiaramente, qui abbiamo una funzione mostro che fa molto in termini di controlli , infatti, le mie funzioni finirebbero per essere il 90% + solo questi controlli e il 10% effettivo "fai cosa X ".
Sto solo sporcando il mio codice, schiacciando il livello dati nel mio livello logico? Qual è l'alternativa?
Sembra che, quando leggo il mio codice, devo passare un sacco di controlli in cui ho bisogno di dire "Ah, quindi controlla questo, questo e questo ..." solo per ottenere al reale "ah, fa questo!".
Ho anche a che fare con cose molto delicate in cui se importo / elimino la cosa sbagliata, il mio sistema fallisce e non c'è altro modo di farlo, quindi è anche necessario controllare ogni passaggio prima di eseguire operazioni cruciali.