Ho una libreria che uso in diverse applicazioni. Ha un metodo che restituisce un URL:
class UrlBuilder {
public function url($config) {
$config = do_some_checks($config);
return make_url($config));
}
}
Spesso un'applicazione vuole alterare il modo in cui viene creato l'URL e vorrei chiarire il modo in cui la libreria è implementata. Ho trovato queste soluzioni:
-
Menzionalo nei documenti della biblioteca, ma altrimenti lascia che l'applicazione esegua l'override del metodo come qualsiasi altro:
class MyAppUrlBuilder extends UrlBuilder { public function url($config) { $config = do_some_checks($config); return make_url_differently($config); } }
-
Chiama una funzione separata che è solo lì per essere sovrascritta:
class UrlBuilder { public function url($config) { $config = do_some_checks($config); $config = $this->alterConfig($config); return make_url($config)); } protected function alterConfig($config) { return $config; } }
-
Fornisci un setter per impostare un callback di personalizzazione:
class UrlBuilder { public function url($config) { $config = do_some_checks($config); if ($this->configModifier) $config = $this->configModifier($config); return make_url($config)); } public function setConfigModifier($configModifier) { $this->configModifier = $configModifier; } }
C'è una differenza semantica e (se non è una questione di gusti) è preferibile uno di questi?