当前位置: 首页 > news >正文

软件设计原则之OCP开闭原则

(OCP) 开闭原则 Open Closed Principle

核心原则

对扩展开放,对修改关闭。

场景描述

还是拿 UserInfo 进行举例。在开发过程中我们需要对我们使用的对象进行多步的组合操作,比如这里要打印账户和密码信息。

常规的方式就是在外部直接进行调用,或者在类的内部添加新的 to_string() 方法。

#include <ctime> #include <iostream> #include <string> class UserInfo { private: std::string username; std::string password; public: UserInfo(const std::string& name, const std::string& pwd) { username = name; password = pwd; } std::string get_username() const { return username; } std::string get_password() const { return password; } }; int main() { UserInfo user("Tom", "123456"); // 希望 UserInfo 有个to_string() 的方法 std::cout << "name = " << user.get_username() << '\n'; std::cout << "pwd = " << user.get_password() << '\n'; }

问题暴露

如果这是你一个人开发的内容,那直接在 UserInfo 中添加接口没人会管你。

但是当你在一个大型团队中进行多人协同开发的时候,并不是你想直接在别人的类添加代码就能添加的。这就是所谓的要对修改进行关闭。

一个比较合理的方式就是在模块的外部进行功能的扩充,这里编写一个全局的 to_string() 函数来满足我们的需求。

#include <iostream> #include <sstream> #include <string> // 修改关闭 // 类模块不做任何改动 class UserInfo { private: std::string username; std::string password; public: UserInfo(const std::string& name, const std::string& pwd) { this->username = name; this->password = pwd; } std::string get_username() const { return username; } std::string get_password() const { return password; } }; // 开放关闭 std::string to_string(const UserInfo& user) { std::stringstream ss; ss << "name = " << user.get_username() << '\n'; ss << "pwd = " << user.get_password() << '\n'; return ss.str(); } int main() { UserInfo user("Tom", "123456"); std::cout << to_string(user); }
http://www.jsqmd.com/news/793995/

相关文章:

  • 2026廊坊硅酸铝柔性包裹,防火专业厂家这样选
  • ARM虚拟化关键寄存器HIFAR与HMAIR详解
  • 终极指南:如何用Vue-Fabric-Editor解决轻量级图片编辑需求
  • 从EE Times标题竞赛看工程师文化:技术幽默如何驱动社区活力
  • 基于CMSIS和USB的嵌入式数据记录器开发指南
  • 高校普法系统|基于SSM高校普法系统(源码+数据库+文档)
  • 在Node.js后端服务中集成多模型API以提升应用灵活性
  • 学Simulink——基于储能系统参与电网一次调频的下垂控制仿真示例
  • TTS推理优化:低精度计算与硬件协同设计实践
  • 从零开始,在 Simulink 中搭建主电路,设计 SPWM 信号发生器,并观察滤波前后的波形变化
  • mp = collections.defaultdict(nums)mp = dict()有啥区别
  • ARM TLB维护指令TLBIP RVAE2详解与优化实践
  • AI编程入门指南:从提示词工程到实战工具配置
  • 模型驱动开发与软件产品线工程实践指南
  • 学生成绩管理系统(SSM框架)环境搭建与运行总结
  • AI模型轻量化部署实战:从模型压缩到边缘计算优化
  • 无监督在线视频稳定化技术:混合框架与实时优化
  • OpenViking:云原生AI场景下的高性能可观测性数据采集框架深度解析
  • VS Code + Claude Code 与 Codex 插件接入其他大模型详细教程
  • 硬件敏捷开发转型:MAHD框架实践与Altium工具链应用
  • 哔哩下载姬完整指南:轻松获取B站高清视频的3步解决方案
  • PCI总线调试挑战与MSO解决方案
  • 你还在用Airflow调度AI任务?奇点大会披露:下一代数据管道已淘汰编排范式——转向意图驱动的语义执行层(附对比压测数据:吞吐提升4.7x,Failover缩短至87ms)
  • 大跨度异型电动挡烟垂壁技术研发与工程应用研究
  • Godot MCP服务器:AI助手与游戏开发工作流的高效集成方案
  • Arm® Lifecycle Manager (LCM) 技术解析与应用
  • 备战蓝桥杯国赛【Day 8】
  • 云原生面试必看!这10道高频题,90%的求职者都栽过
  • 历史周期律的动力学本质:集体意识场视角下的文明演进规律
  • 基于Vagrant的Claude本地部署:自动化AI开发环境搭建指南