接口,抽象,编码到接口

时间:2015-07-16 13:17:42

标签: php oop interface abstraction

我正在学习OOP和SOLID。我有一个'main'类,在从配置文件中读取变量后执行一些操作。这个“主要”类不是这个问题的焦点,但它可以被描述为一种结石。

我正在尝试拆分阅读配置文件并在'main'类中使用其设置的过程。

我正在考虑制作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();
    }
}

这允许用户从公共方法中将所有设置作为单个数组获取。

但是,作为一个类,我不禁感觉这些设置被检索,因为数组应该被指定为具有公共访问器的对象的单独属性。因此,这些设置对于我的“主要”课程来说是独一无二的。在这种情况下,我正在考虑使用Config类扩展泛型MainConfig类,该类具有与我的“主”类相关的特定属性/访问器。

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() {};
}

首先,这是正确的做法吗?此外,接口/基类是否需要定义函数?或者这些可以在以后定义吗?

其次,我是否需要ConfigHandler / ConfigReader课程?如果我的'main'类需要设置才能工作,我可以将配置对象传递给'main'类并让函数执行此操作吗?或者它是另一个班级的独立责任?

我也在学习编码接口。我的“主要”课程只适用于特定的设置(这是一个结论?)所以,如果我有

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 );

如果除MainConfig之外的任何内容都通过,那么我的'main'类将无法正常初始化。我想到了一个'专业'界面,用于我的'主'课程。

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() {};
}

然后回到我的'主'课程,我仍然可以编码到界面?

class Main {
    public function __construct( MainConfigInterface $config ) { // coding to interface
        $config->getMainSettingOne();
}

$conf = new MainConfig( $path );
$main = new Main( $conf );

最后,这是在这方面编码接口的正确方法吗?

0 个答案:

没有答案