news 2026/5/11 5:47:25

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
软件设计原则之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); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 5:46:07

ARM TLB指令解析:RVAALE1OS与RVAALE1OSNXS对比与应用

1. ARM TLB指令深度解析&#xff1a;TLBIP RVAALE1OS与TLBIP RVAALE1OSNXS在ARMv9架构的虚拟化环境中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;维护指令的性能直接影响内存访问效率。作为系统程序员&#xff0c;理解TLBIP RVAALE1OS和TLBIP RVAALE…

作者头像 李华
网站建设 2026/5/11 5:46:07

【OC】NSTimer

NSTimer 文章目录NSTimer 为什么定时器停不下来&#xff1f;NSTimer 基础RunLoopNSTimer 的循环引用实战&#xff1a;无限轮播图的完整 Timer 方案为什么定时器停不下来&#xff1f; 我曾经做过一个定时器按钮&#xff0c;但是里面有这样一个问题&#xff1a;连续点击几次「开…

作者头像 李华
网站建设 2026/5/11 5:28:07

CoPaw智能体工厂:基于三层策略与安全协议的自动化创建工具

1. 项目概述&#xff1a;一个为CoPaw智能体平台量身定制的“智能体工厂”如果你正在使用CoPaw&#xff08;或者更广为人知的AgentScope&#xff09;来构建和管理你的AI智能体&#xff0c;那么你肯定遇到过这样的场景&#xff1a;每次想创建一个新的智能体工作区&#xff08;wor…

作者头像 李华
网站建设 2026/5/11 5:25:34

Python: Condition Variable Pattern

项目结构&#xff1a; # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a;Condition Variable Pattern 条件变量模式 # Author : geovindu,Geovin Du …

作者头像 李华
网站建设 2026/5/11 5:24:07

如何用Untrunc开源工具快速修复损坏视频:完整操作指南

如何用Untrunc开源工具快速修复损坏视频&#xff1a;完整操作指南 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否曾…

作者头像 李华
网站建设 2026/5/11 5:22:09

Spring Boot 与 GraphQL 集成最佳实践:构建现代化 API

Spring Boot 与 GraphQL 集成最佳实践&#xff1a;构建现代化 API 引言 GraphQL 作为一种现代化的 API 查询语言&#xff0c;正在逐渐取代传统的 RESTful API。它允许客户端精确地请求所需的数据&#xff0c;避免了过度获取或获取不足的问题。本文将详细介绍如何在 Spring Boot…

作者头像 李华