Sto imparando OOP e SOLID. Ho una classe 'principale' che esegue alcune azioni dopo aver letto le variabili da un file di configurazione. Questa classe "principale" non è al centro di questa domanda, ma può essere descritta come una concrezione.
Sto provando a suddividere il processo di lettura del file di configurazione e usando le sue impostazioni nella classe 'main'.
Sto pensando di creare una classe Config
.
interface ConfigInterface {
public function getFileContents();
}
class Config implements ConfigInterface {
protected $file_path;
protected $file_contents;
public function getFileContents() {
return $this->file_contents;
}
protected function readFileContents() {
$file_path = $this->file_path;
if ( is_file( $file_path ) ) {
$file_contents = include( $file_path );
return $file_contents;
} else {
die( 'Invalid config path specified ' . $file_path );
}
}
public function __construct( $file_path ) {
$this->file_path = realpath( $file_path );
$this->file_contents = $this->readFileContents();
}
}
Ciò consente a un utente di ottenere tutte le impostazioni come un singolo array dal metodo pubblico.
Tuttavia, come classe, non posso fare a meno di sentire queste impostazioni recuperate come un array dovrebbe essere assegnato come proprietà individuali dell'oggetto con i metodi di accesso pubblici. In quanto tali, queste impostazioni sarebbero uniche per la mia classe 'principale'. In questo caso, sto pensando di estendere una generica classe Config
con una classe MainConfig
che avrebbe queste proprietà / accessor specifici in relazione alla mia classe 'principale'.
interface ConfigInterface {
// A config has a path, but doesn't need to have a public interface
// So don't know what goes in here now
}
class Config implements ConfigInterface {
private $file_contents;
public function __construct( $config_path ) {}
protected function readContents() {}
}
class MainConfig extends Config implments ConfigInterface {
private $main_settings_one;
private $main_settings_two;
private $main_settings_three;
public function getMainSettingOne() {};
public function getMainSettingTwo() {};
public function getMainSettingThree() {};
}
In primo luogo , questo è un approccio corretto o è meglio mantenere l'array? Inoltre, sono definite le funzioni di interfaccia / classe base necessarie ? O possono essere definiti in seguito?
In secondo luogo , ho bisogno di una classe ConfigHandler
/ ConfigReader
? Se la mia classe 'principale' ha bisogno che le impostazioni funzionino, potrei semplicemente passare l'oggetto config alla classe 'main' e fare in modo che funzioni? O è una responsabilità separata di un'altra classe?
Sto anche imparando la codifica su un'interfaccia. La mia classe 'principale' funziona solo con impostazioni specifiche (è questa una concrezione?) Quindi se avessi
class Main {
public function __construct( ConfigInterface $config ) { // coding to interface
$config->getMainSettingOne(); // specific functionality relating to a concretion?
}
}
$conf = new MainConfig( $path );
$main = new Main( $conf );
Se viene passato un valore diverso da MainConfig
, la mia classe 'main' non verrà inizializzata correttamente. Stavo pensando ad un'interfaccia "specializzata", da utilizzare con la mia classe "principale".
interface MainConfigInterface {
public function getMainSettingOne();
public function getMainSettingTwo();
public function getMainSettingThree();
}
class Config { ... }
class MainConfig extends Config implments ConfigInterface {
private $main_settings_one;
private $main_settings_two;
private $main_settings_three;
public function getMainSettingOne() {};
public function getMainSettingTwo() {};
public function getMainSettingThree() {};
}
Poi di nuovo nella mia classe 'principale', posso ancora codificare su un'interfaccia?
class Main {
public function __construct( MainConfigInterface $config ) { // coding to interface
$config->getMainSettingOne();
}
$conf = new MainConfig( $path );
$main = new Main( $conf );
Infine , è questo il modo corretto di codificare un'interfaccia in questo senso?