Perl 构造函数应该返回 undef 或“无效”对象吗?

2024-04-10

Question:

什么被认为是“最佳实践” -and why- 处理构造函数中的错误?

“最佳实践”可以引用 Schwartz 的话,或者 50% 的 CPAN 模块使用它,等等……;但我对任何人提出的合理意见感到满意,即使它解释了为什么常见的最佳实践并不是真正的最佳方法。

就我自己对该主题的看法(多年来通过 Perl 软件开发了解),我在 Perl 模块中看到了三种主要的错误处理方法(在我看来从最好到最差列出):

  1. 构造一个对象,设置一个无效标志(通常是“is_valid“方法)。通常通过类的错误处理来设置错误消息。

    Pros:

    • 允许标准(与其他方法调用相比)错误处理,因为它允许使用$obj->errors()在错误的构造函数之后进行类型调用,就像在任何其他方法调用之后一样。

    • 允许传递附加信息(例如 >1 错误、警告等...)

    • 允许轻量级的“redo”/“fixme”功能,换句话说,如果构造的对象非常重,具有许多复杂的属性,那么100%总是可以的,并且它无效的唯一原因是因为有人输入了日期不正确,您只需执行“$obj->setDate()“而不是再次重新执行整个构造函数的开销。这种模式并不总是需要的,但在正确的设计中可能非常有用。

    Cons: 据我所知没有。

  2. Return "undef".

    Cons:无法实现第一个解决方案的任何优点(全局变量之外的每个对象错误消息和针对重对象的轻量级“fixme”功能)。

  3. 死在构造函数内。除了一些非常狭窄的边缘情况之外,我个人认为这是一个糟糕的选择,因为有太多原因无法在这个问题的边缘列出。

  4. 更新:为了清楚起见,我认为(否则非常有价值且出色的设计)解决方案具有非常简单的构造函数,根本不会失败,并且有一个繁重的初始化方法,其中所有错误检查都只是其中一个的子集出于本问题的目的,情况#1(如果初始化器设置错误标志)或情况#3(如果初始化器死亡)。显然,选择这样的设计,您会自动拒绝选项#2。


这取决于您希望构造函数如何表现。

这个回应的其余部分属于我个人的观察,但与 Perl 的大多数事情一样,最佳实践实际上可以归结为“这是一种实现方法,您可以根据自己的需要采用或保留它”。您所描述的偏好是完全有效且一致的,没有人应该告诉您其他情况。

其实我prefer如果构造失败就会死,因为我们将其设置为在对象构造期间可能发生的唯一类型的错误实际上是应该停止执行的大的、明显的错误。

另一方面,如果您不希望这种情况发生,我想我更喜欢 2 而不是 1,因为检查未定义的对象与检查某些标志变量一样容易。这不是 C,所以我们没有强类型约束告诉我们构造函数必须返回这种类型的对象。所以回来了undef,并检查它以确定成功或失败,是一个不错的选择。

构造失败的“​​开销”是某些边缘情况下的一个考虑因素(在这种情况下,在产生开销之前你不能很快失败),因此对于那些你可能更喜欢方法 1 的人。同样,这取决于你为对象定义的语义建造。例如,我更喜欢在构造之外进行重量级初始化。至于标准化,我认为检查构造函数是否返回已定义的对象与检查标志变量一样是一个很好的标准。

EDIT:为了响应您关于初始化程序拒绝案例 #2 的编辑,我不明白为什么初始化程序不能简单地返回一个指示成功或失败的值,而不是设置一个标志变量。实际上,您可能想同时使用两者,具体取决于您想要了解所发生错误的详细信息。但初始化程序在成功时返回 true 是完全有效的,并且undef失败时。

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

Perl 构造函数应该返回 undef 或“无效”对象吗? 的相关文章

随机推荐

  • 关于 ExpandableListView ChildView 的 Button ClickListener 的问题

    我正在尝试为我的餐厅制作一个应用程序 这是我之前遇到的问题 并且已解决 但是 您会在 ChildView 中注意到一些按钮 即 添加 就像这样对于我之前的查询here https stackoverflow com questions 63
  • 禁用与原型观察方法的链接

    我想创建一个像这样的链接 a href http example com text a 并替换行为 以便链接在单击时使用 Ajax 下载内容 对我来说重要的是不要替换 href 属性 因此复制链接仍然有效 一种解决方案是 link oncl
  • 实体框架6错误无法加载指定的元数据资源

    我在解决方案中使用实体框架 6 和 模型优先 我将 数据模型 类分离到另一个项目中 以便我可以添加对 数据模型 类的引用 而无需公开我的 数据模型上下文 和连接 我不想将我的实体数据模型项目 尤其是数据库上下文等 暴露给我的 UI 层 我有
  • 图像绘制速度

    我正在开发一款游戏 但目前我正在运行基准测试 如果有人能在这件事上帮助我 我将不胜感激 我正在做的是 当我单击开始按钮时 使用以下代码在面板上触发绘制事件 private void startToolStripMenuItem Click
  • 共享 ViewModel 以帮助片段和父 Activity 之间的通信

    虽然 JetPack 的导航组件看起来很有前途 但我却找不到实现我想要的东西的方法 让我们看一下示例应用程序屏幕 该应用程序有一个主要活动 一个顶部工具栏 一个带有 fab 的底部工具栏 我面临着两个挑战 我想以正确的方式解决它们 1 我需
  • 从密度对象(或更广泛地从一组数字)生成随机数

    假设我有一组数字 我怀疑它们来自同一分布 set seed 20130613 x lt rcauchy 10 我想要一个从相同的未知分布中随机生成一个数字的函数 我想到的一种方法是创建一个density对象 然后从中获取 CDF 并取随机均
  • (go-sql-driver/mysql) packet.go 中出现意外的 EOF 和繁忙缓冲区

    我正在得到unexpected EOF and busy buffer错误于go sql driver mysql尽管设置后SetConnMaxLifetime SetMaxIdleConns and SetMaxOpenConns按照建议
  • 使用猫鼬保存图像

    我知道已经有很多关于这个主题的帖子 但不幸的是直到现在我才找到答案 我将 angular js 与示例代码一起使用http angular js in image upload http angular js in image upload
  • 从流而不是文件加载配置文件

    我使用 OpenMappedExeConfiguration 和 ExeConfigurationFileMap 来加载配置文件 它们的重载表明它们只适用于文件名 有没有办法从流加载配置文件 背景 我想加载存储为嵌入式资源的配置文件 没有文
  • self.method = environ['REQUEST_METHOD'].upper() KeyError: 'REQUEST_METHOD' 使用 uwsgi 在 EC2 上设置 django 服务器时

    我得到了 当我击中http ec2 X YZ ABC EFG compute 1 amazonaws com admin 我很确定我的 Django 应用程序没有任何问题 因为该应用程序是空的 即 我刚刚使用创建了该应用程序django a
  • TSQL:提交时触发

    我们有一个后台系统 可以通过以下方式将发票信息插入到 SQL 数据库中 MSDTC http en wikipedia org wiki Distributed Transaction Coordinator存储过程中 应用程序插入标头 然
  • 浏览器推送通知出现错误“AbortError:注册失败 - 推送服务不可用”

    我创建了一个系统 使用 Firefox 和 Chrome 的浏览器推送通知来与网站访问者进行更多交互 我正在查看我的 Google Analytics 事件 了解订阅失败的原因 最大的原因是 推送服务不可用 我查遍了一切 试图找到这意味着什
  • 使用 PowerShell 替换文本文件的内容

    我浏览了这个网站 似乎找不到任何适合我情况的内容 基本上 我正在尝试向 NETLOGON 文件编写一个附加内容 以替换所有用户桌面上的文本文件中的文本 当前文本全面静态 我想要更改的文本对于每个用户来说都是唯一的 我想将当前文本 user1
  • xmlstarlet:过滤掉带有属性的元素

    如何过滤掉某些类型的不具有神奇值属性的元素并保留文档的其余部分 所有这一切都使用xmlstarlet 到目前为止我所要做的是 cat lt lt EOF gt database xml
  • ECS 服务 - 使用新的 Docker 映像自动部署

    我想通过使用最新的 Docker 映像启动我的 ECS 服务来自动部署应用程序 据我了解 部署新镜像版本的方法如下 创建新的任务修订版 更新 Docker 存储库上的映像后 更新服务并指定新版本 这似乎可行 但我想通过 CLI 来完成这一切
  • SHA256CryptoServiceProvider 和相关的可以在 WinXP 上使用吗?

    是否可以在 Windows XP 上使用 SHA256CryptoServiceProvider 和相关 SHA2 提供程序 我知道提供商使用 Vista 及更高版本中包含的加密服务 是否可以在 Microsoft XP 中安装这些服务 E
  • 在 Objective-C 中存储和检索数字对的快速方法

    我正在实现排队洪水填充算法 需要存储和检索数字对NSMutableArray 基本上 我正在创建一个数组 m queue NSMutableArray array 然后有时我填充数组 m queue addObject NSValue va
  • 下载时出错

    下载控制台会返回以下错误 帧加载因策略更改而中断 Example a href app exe Start Download a Console Preview 我应该在中配置一些东西吗Compiler or QWeb设置 我发现了 在传统
  • 无法使用 Windows 10 移动技术预览版将通用应用程序部署到手机

    我已解锁开发者卢米亚 635昨天刚刚更新为Windows 10 移动版技术预览版 http windows microsoft com en us windows preview download phone 操作系统版本 10 0 125
  • Perl 构造函数应该返回 undef 或“无效”对象吗?

    Question 什么被认为是 最佳实践 and why 处理构造函数中的错误 最佳实践 可以引用 Schwartz 的话 或者 50 的 CPAN 模块使用它 等等 但我对任何人提出的合理意见感到满意 即使它解释了为什么常见的最佳实践并不