接口
接口是服务商与用户的契约,要易于理解、鼓励高效使用、不易出错、支持测试等
接口明确
避免非const的全局变量
- 非const 变量会注入隐藏依赖,全局变量会让函数和模块之间产生隐式依赖。函数通过全局变量共享状态,使得这些函数在其他地方重用时变得困难。如果函数依赖于某个全局变量,那么这个函数就无法在没有该全局变量的情况下独立使用,从而降低了代码的可重用性。
- 数据竞争 全局变量可以在代码中的任何地方访问和修改,这使得代码的依赖关系变得复杂,难以维护。
避免单例
- 单例模式的主要问题是它隐藏了对象之间的依赖性。单例对象可以在任何地方访问,这使得代码的依赖性不再明确,导致代码结构变得不清晰。依赖隐式地存在于代码中,难以追踪和管理。
- 由于单例通常通过私有构造函数来限制实例化,无法通过继承或多态来扩展类的行为.
class Database { public: static Database& getInstance() { static Database instance; return instance; } void query(const std::string& sql) { // 执行查询操作 } };
// 任何地方都可以随时使用这个单例
Database::getInstance().query("SELECT * FROM users");
谁来负责单例的销毁
是否应该允许从单例派生
如何以线程安全的方式初始化单例
当单例互相依赖时 应该以何种顺序初始化这些单例 (静态初始化顺序问题)
## 构建良好的接口
函数应该通过接口 (而不是全局变量)进行沟通。
1. 接口明确
2. 保持较低的参数数目