使用“单一职责原则”强制我的容器拥有公共设置器

2024-01-31

我正在努力遵循 SOLID 原则进行设计。我发现,当您使用“单一职责原则”(SOLID 的 S)时,您通常必须在数据容器和数据处理器之间划分类。例如,如果我有一个具有 5 个属性的类 person,它是从数据库读取的,而不是将所有内容都放在一个类中,我会创建一个包含这些属性的 Person 类,以及另一个从数据库读取该信息并创建 Person 的 PersonReader 类。

如果我这样做,我必须打开 Person 属性,以便 PersonReader 可以访问它们,但与将所有内容放入黑盒子并使属性只读相比,我的封装性要少。

我错过了什么还是这个原则的缺点?

提前致谢

编辑:我已将个人作者更改为个人读者,因为一开始就不需要公开属性设置者。


大多数数据访问策略(ORM 技术)都涉及您所描述的那种妥协。侵入性最小的实体在需要时(例如,当不存在公共设置器时)使用反射(或内省等)来填充实体。

话虽如此,如果您的实体只是数据容器(如贫血域模型 http://martinfowler.com/bliki/AnemicDomainModel.html),单一责任原则不应该让您真正关心,因为您的对象没有会被数据访问代码破坏(或干扰)的复杂逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“单一职责原则”强制我的容器拥有公共设置器 的相关文章

随机推荐

  • 可以知道一个字符串是否是用base64编码的吗?

    就那么简单 我正在制作一个应用程序 用户必须扫描 QR 码 基本上是 Base64 编码的字符串 有什么方法可以在解码之前验证该字符串是否以 Base64 编码并遵循应用程序的流程 我的代码负责的是 func captureOutput c
  • 在 SiteEdit 2009 中加载页面时出现“无法从组件 xml 架构获取类型信息”

    我使用此处给出的答案在 SitEdit 2009 SP2 上启用了内联编辑 使用 XSLT TBB 时如何在 SiteEdit 中启用内联字段编辑 https stackoverflow com questions 9667640 how
  • utf8 <-> utf16:codecvt 性能不佳

    我正在研究一些旧的 并且专门面向 win32 的 东西 并考虑使其更加现代 可移植 即在 C 11 中重新实现一些广泛可重用的部分 其中之一是 utf8 和 utf16 之间的转换 在我使用的 Win32 API 中MultiByteToW
  • Xcode 9 GM - 导出并上传到 App Store 崩溃

    我正在尝试将使用 ARKit Unity 构建 的应用程序上传到 iTunes Connect 以进行 TestFlight 分发 导出和上传到应用程序商店的过程均来自Xcode gt Organizer我看到 剥离 APPNAME app
  • 检查点后未使用新的 Spark.sql.shuffle.partitions 值

    我有一个 Spark 的结构化流应用程序 带有检查点以在 parquet 中写入输出并使用默认的 Spark sql shuffle partitions 200 我需要更改 shuffle 分区 但不使用新值 以下是应用程序重新启动后检查
  • C# ModInverse 函数

    是否有一个内置函数可以让我计算 a mod n 的模逆 例如19 1 11 mod 30 在本例中为 19 1 11 19 由于 Net 4 0 使用特殊的模块化算术函数 ModPow 实现 BigInteger 它产生 X power Y
  • 如何更改 data.table 中因子列的级别

    改变水平的正确方法是什么factor中的列data table 注 不是数据框 library data table mydt lt data table id 1 6 value as factor c A A B B B C key i
  • 在 Woocommerce 3 中以编程方式设置自定义运费

    我搜索并找到了许多如何更改运费的示例 基本上我想做同样的事情 但我想使用第 3 方 API 我已经使用functions php 设置了一个自定义插件并激活了它 我认为使用了这样简单的东西 add filter woocommerce pa
  • go中pprof导入开销有多大

    我有几个 go 程序有一个未使用的输入net http pprof在他们中 import net http pprof http ListenAndServe 127 0 0 1 6060 nil 我想知道这次导入的 CPU 和内存开销是多
  • 如何在 CodeIgniter 3 中使用 PHPSpreadsheet 从 Excel(.xlsx 和 .xls)文件读取数据?

    最近 在我的一个基于 CodeIgniter 的项目中 我需要从 Excel 文件 xlsx 和 xls 读取数据并将这些数据插入 MySQL 不幸的是 我没有使用PHP电子表格之前 因为我不需要使用 Excel 到目前为止我所做的是下载P
  • 如何向 JTextArea 添加文本? (控制台模拟)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何将文本 命令 如在控制台中 添加到 JTextArea 中 或者 更具体地说 如何在 FTP 程序中添加 JTextArea 作为控制台
  • 从 Native 指针中获取数据

    将数据放入 Perl 6 Native 指针中没什么大不了的 sub memcpy Pointer void source Pointer void destination int32 size is native my Blob blob
  • XCode 7.3.1 更新未安装

    看起来 XCode 发布了新的更新 此问题似乎持续存在 即使 iTunes Store 将更新发布在 过去 30 天内安装的更新 部分 也不会呈现该更新 重新启动后 系统会提示我再次更新 即使我已经完成了两次 最终 当我打开 XCode 时
  • 如何使 Istanbul 生成我所有源代码的覆盖范围?

    目前 伊斯坦布尔仅为我的测试中使用的文件生成覆盖范围 这没关系 但似乎在某种程度上违背了覆盖范围的目的 我没有伊斯坦布尔配置 并且通过调用它npm test使用以下脚本字符串 istanbul cover mocha R dot check
  • DS.FixtureAdapter 丢失带有 hasMany 异步属性的夹具数据

    背景 我已经提交了github问题 https github com emberjs data issues 2136与 Ember Data 团队合作 但我很想了解如何解决这个问题 或者如果我一直都错了 如果出现此错误 您可以看到一个工作
  • 如何在 JavaScript 警报框中打印 Struts2 ActionMessage

    我有一个Action使用发送操作消息的类addActionMessage 我想使用 JavaScript 警报框在 JSP 中显示该消息 我尝试过 alert
  • 全新 MYSQL 安装,用户“root”访问被拒绝

    我有一台旧的 lamp 服务器 我想将其移动到新机器上 所以我做了一个 mysqldump 在新机器上安装了 Ubuntu Server 13 10 在安装过程中安装了 lamp 然后从旧的 lamp 服务器导入了我的旧 mysql 数据库
  • 编译 bevy_dylib v0.5.0 错误:与 `cc` 链接失败:退出状态:1

    在刚刚升级到 Monterey 的 Mac 上 我在尝试执行以下操作时收到以下信息cargo run一个简单的 Bevy 程序 我已经按照推荐重新安装了 XCode CLThere https stackoverflow com quest
  • R.java消失了

    我最近下载了 Android 支持包 并一直在使用它尝试让我的应用程序 在 SDK 10 上运行 使用 GridLayout 不管怎样 我清理了我的项目几次 以解决 XML 文件中的这个错误 然后当我回到 src 中的类时 对 R 的每个引
  • 使用“单一职责原则”强制我的容器拥有公共设置器

    我正在努力遵循 SOLID 原则进行设计 我发现 当您使用 单一职责原则 SOLID 的 S 时 您通常必须在数据容器和数据处理器之间划分类 例如 如果我有一个具有 5 个属性的类 person 它是从数据库读取的 而不是将所有内容都放在一