Prendi il seguente esempio che carica un annuncio interstitial ogni 10 volte che l'utente fa XYZ nell'app, a determinate condizioni. Viene chiamato in più punti nella base di codice:
public class AdHandler {
public void showInterstitialAd() {
if (Subscription.isSubscriptionActive()) {
Log.i(TAG, "Subscription active, not loading interstitial ad");
return;
}
if (!EventTracker.isEventThresholdMet()) {
Log.i(TAG, "Threshold not yet met, not loading interstitial ad");
return;
}
... potentially more conditionals that return early if not met
// Finally create and show the interstitial ad because the conditional checks have passed
}
}
In questa versione, tutta la logica di caricare o meno l'annuncio è dentro il metodo che carica l'annuncio, il che sembra logico. E supponendo che chiamo showInterstitialAd()
in più punti nella base di codice, è ASCIUTTO perché non sto controllando isSubscriptionActive()
e isEventThresholdMet()
in più punti (e potrebbero esserci ottime condizioni più / logica da valutare).
La mia unica preoccupazione è che dal punto di vista esterno, senza guardare effettivamente la dichiarazione di showInterstitialAd()
, qualsiasi chiamata a showInterstitialAd()
sembra che l'annuncio sia stato caricato ogni volta , senza condizioni intorno al carico. Anche se questa non è la cosa peggiore, si può immaginare che avere più di 50 metodi che seguono questo paradigma declare-condizionale-logico all'interno può rendere il codice base un po ' convoluti a prima vista e difficili da seguire senza che le definizioni dei metodi siano sempre disponibili come riferimento.
Se guardiamo l'altra versione, sarebbe qualcosa del genere:
public void firstMethod() {
... more code above
if (!isSubscriptionActive() && isEventThresholdMet()) {
showInterstitialAd();
}
}
public void secondMethod() {
if (!isSubscriptionActive() && isEventThresholdMet()) {
showInterstitialAd();
}
... more code below
}
Questa versione rende ovvio quali condizioni causano il codice , ma è anche una delle principali cause di duplicazione della logica condizionale. Il mio istinto dice che la versione 1 è più manutenibile a lungo termine, specialmente se showInterstitialAd()
è chiamato in molti posti, anche se la versione 2 sembra più leggibile a prima vista.
C'è qualche consiglio / ragionamento da parte di persone più anziane, o libri come Clean Code che possono dare alcune ragioni per cui un approccio è migliore dell'altro? Sto specificatamente cercando un ragionamento in termini di leggibilità e manutenibilità.