如何优雅地抽离出数据库的共同特点
比如所有数据库有连接,断开关闭,执行 sql 语句的需求和功能。将这些抽离成接口,然后让举例的类去实现。最后通过注入的方式添加到 Application 中。
这样如是,下次需要更换成 Oracle 数据库时,只要重新注入即可。
#include <string> class IDatabase { public: virtual void connect() = 0; virtual void close() = 0; virtual void exec_sql(const std::string& sentence) = 0; }; class MySql : public IDatabase { public: void connect() override { // todo } void close() override { // todo } void exec_sql(const std::string& sentence) override { // todo } }; class Sqlite : public IDatabase { public: void connect() override { // todo } void close() override { // todo } void exec_sql(const std::string& sentence) override { // todo } }; class Application { private: IDatabase* m_sqlPtr = nullptr; public: Application(IDatabase* sqlPtr) { m_sqlPtr = sqlPtr; m_sqlPtr->connect(); } ~Application() { m_sqlPtr->close(); delete m_sqlPtr; } void exec_sql(const std::string& sentence) { m_sqlPtr->exec_sql(sentence); } }; int main(int agrc, char** argv) { if (agrc >= 2) { Application app(new MySql{}); } else { Application app(new Sqlite{}); } }小结
如果你对软件设计原则感兴趣,想必一定会听过许多其他的模式,比如:
- (DRY) 不重复你自己原则 Don‘t Repeat Yourself
- (CCP) 共同封闭原则 Common Closure Principle
- 优先使用组合原则 Favor Composition Over Inheritance
其实很多设计原则都是互通的思想,比如:(CCP) 共同封闭原则包含了 (SRP) 单一职责原则和 (OCP) 开闭原则的思想,优先使用组合原则又在 (DIP) 依赖倒置原则中有巨大的应用。
我们在软件框架或模块设计时其实不会一直把这些原则挂在嘴边,而是分析各个模块间的耦合性和内聚性,找出当前项目中最合适的解决方案才是软件设计的最终目标。
