题:

什么被认为是“最佳实践” – 以及为什么 – 在构造函数中处理错误?

“最佳实践”可以是Schwartz的报价,或50%的CPAN模块使用它等等;但是,即使解释了为什么常见的最佳做法不是真正的最佳方法,我对任何人的理性意见感到满意.

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

>构造一个对象,设置一个无效的标志(通常是“is_valid”方法).通常通过类的错误处理与设置错误消息相结合.

优点:

>允许标准(与其他方法调用相比)错误处理,因为它允许在坏构造函数之后使用$obj-> errors()类型调用,就像在任何其他方法调用之后一样.
>允许传递其他信息(例如> 1错误,警告等)
>允许轻量级的“redo”/“fixme”功能,换句话说,如果构造的对象很重,许多复杂的属性总是可以100%,唯一的原因是因为有人进入一个不正确的日期,您可以简单地执行“$obj-> setDate()”,而不是重新执行整个构造函数的开销.这种模式并不总是需要的,但在正确的设计中是非常有用的.

缺点:没有我知道.
>返回“undef”.

缺点:无法实现第一个解决方案的优点(全局变量之外的每个对象错误消息和重型对象的轻量级“fixme”功能).
>在构造函数内死.在一些非常狭窄的边缘案件之外,我个人认为这是一个可怕的选择,有太多的理由列在这个问题的边缘.
>更新:为了清楚,我认为(非常有价值和伟大的设计)解决方案具有非常简单的构造函数,根本不能失败,并且一个重的初始化方法,其中所有的错误检查发生只是一个子集出于此问题的目的,任一情况#1(如果初始化程序设置错误标志)或情况#3(如果初始化程序死机).显然,选择这样的设计,你自动拒绝选项#2.

解决方法

这取决于你希望你的构造函数的行为.

其余的回应是我的个人观察,但是与大多数事情Perl一样,最佳实践真的归结为“这里有一种方法可以根据您的需要进行取舍或离开.”您所描述的您的喜好是完全有效和一致的,否则任何人都不应该告诉你.

实际上,如果构造失败,我宁愿死亡,因为我们设置它,以便在对象构造过程中可能发生的唯一错误类型真的很大,明显的错误应该停止执行.

另一方面,如果你喜欢不会发生,我想我更喜欢2超过1,因为它是一样容易检查一个未定义的对象,因为它是检查一些标志变量.这不是C,所以我们没有强大的打字约束告诉我们,我们的构造函数必须返回一个这样的对象.所以返回undef,并检查它是否建立成败是一个很好的选择.

施工失败的“开销”是某些边缘情况(在发生开销之前不能快速失败)的考虑因素,因此对于那些您可能更喜欢方法1的问题,再次依赖于您为对象定义的语义施工.例如,我喜欢在施工之外进行重量级初始化.对于标准化,我认为检查一个构造函数返回一个定义的对象是否像检查一个标志变量一样好.

编辑:为了回应关于初始化器拒绝#2的编辑,我不明白为什么初始化程序不能简单地返回一个指示成功或失败的值,而不是设置一个标志变量.实际上,您可能希望使用这两者,具体取决于您想要发生的错误的详细程度.但是,如果初始化器在成功时返回true并在失败时返回true,那将是完全有效的.

Perl构造函数是否返回undef或“invalid”对象?的更多相关文章

  1. three.js模拟实现太阳系行星体系功能

    这篇文章主要介绍了three.js模拟实现太阳系行星体系功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  4. ios – 在Swift中对MKCircle进行子类化

    我想通过添加另一个String属性来继承MKCircle,我们称之为“代码”.这个属性不是可选的和常量的,所以我必须从初始化器设置它,对吧?有没有办法定义一个单一的便利初始化器,在这种情况下需要3个参数?本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. ios – AVAudioPlayer不再使用Swift 2.0/Xcode 7 beta

    对于我的iPhone应用程序中的vartestAudio声明,我在这里收到错误“调用可以抛出,但错误不能从属性初始化程序中抛出”当我转到Xcode7测试版时,就发生了这种情况.如何在Swift2.0中使用此音频剪辑?

  6. ios – 斯威夫特.在初始化所有存储的属性之前在方法调用中使用’self’

    解决方法在初始化所有非可选实例变量之前,您无法在self上调用方法.有几种方法可以解决这个问题.>将属性更改为选项或隐式解包选项(不建议)>使buildCircle()方法静态或只是一个在文件中运行并为所有圆圈调用addSubview()在所有属性初始化并且您调用之后super.init()等等.你必须避免在自己之前打电话给自己class已初始化.

  7. ios – Objective-C警告未找到超类“-init”的指定的初始化程序的方法覆盖

    我在一个应用程序中清理警告,我收到了两次这个警告对于这行代码和这一行我相当新的Objective-C和谷歌这个警告,只是不明白的解决方案我的问题是如何摆脱这些警告?

  8. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  9. ios – UICollectionView不能使用UISearchController?

    在WWDC2014年的“AInsideInsidePresentationControllers”中,演示者展示了如何在UITableView中设置UISearchController.他们通过设置searchController的searchBar框架,然后将其设置为tableView的tableHeaderView来实现.不幸的是,UICollectionView没有相当于tableHeade

  10. ios7 – 如何使用默认的IOS映像

    嗨,我是IOS开发的新手.我知道如何在IOS应用程序中使用图像.但是我不知道如何使用默认图像,如开发者站点中提到的共享或书签图标.我想用它们我必须下载这些图像集或那些可用在xcode?

随机推荐

  1. 数组 – Perl中有什么神奇的数组?

    在Perldocumentationforreverse中,我发现:“请注意,将数组反转到自身(如@a=reverse@a)将尽可能保留不存在的元素;即对于非魔法数组或具有EXISTS和DELETE方法的绑定数组.什么属性区分神奇和非魔法阵列?解决方法一个神奇的阵列是一个执行它的操作不仅仅是改变内容.只有内置的魔术阵列是@ISA,而且这是非常不明显的.正如句子所暗示的,魔术阵列主要是一个绑定的阵列

  2. perl – 使用“isa”方法的最佳方式?

    什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

  3. 在CORE :: GLOBAL中哪些Perl内置函数不能被覆盖?

    解决方法toke.c中任何值为负的值都可以被覆盖;所有其他人可能不会.你可以看源码here.例如,我们来看看第10,396行的waitpid:由于waitpid为负数,因此可能会被覆盖.grep怎么样?这是积极的,所以不能被覆盖.这意味着以下关键字不能被覆盖:chop,defined,delete,do,dump,each,else,elsif,eval,exists,for,foreach,format,glob,goto,grep,if,keys,last,local,m,map,my,next,no

  4. 如何在Perl中打印由换行符分隔的列表元素?

    什么是最简单的打印所有列表的元素以Perl中的换行符分隔的元素?解决方法在Perl5.10中:其他方式:或:或者怎么样?

  5. 使用Perl如何获取文件大小(以兆字节为单位)?

    我想以磁盘的形式获取磁盘上的文件大小.使用-s运算符给出了以字节为单位的大小,但是我将假设,然后将其除以魔术数字是一个坏主意:我应该使用只读变量来定义1024,还是有一种编程方式来获取一千字节的字节数?

  6. perl – 如何测试/分类CPAN模块的utf8正确性

    例如:File::Slurp,如果你将读取该文件您将根据命令行开关获得不同的结果,并且perl-CSDA将无法正常工作.伤心.(是的,我知道比Encode::decode(“utf8”,read_file($file,binmode=>’:raw’));将帮助,但是SAD.我的问题:>在这里任何首选方式,如何测试/分类什么CPAN模块是utf8安全/准备/正确?>这里是像Perl::Criticforutf8这样的东西–什么将检查模块源可能的utf8不正确?总结以上是DEVMAX为你收集整理的perl–如

  7. 如何删除Perl字符串中的空格?

    如果我声明一个值为’3’的变量$myString.是否有任何功能来删除返回值的空格.有点像SomeFun然后返回’3′.输出:你可以注意到’vid’=>‘0’,上面的代码从theanswer.我正在研究它.总结以上是DEVMAX为你收集整理的如何删除Perl字符串中的空格?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 如何在mod_perl2下运行Devel :: Cover?

    Unfortunately,Devel::Coverdoesnotyetworkwiththreads.它也不适用于prefork.在startup.pl中使用,Devel::Cover问题perl5.8.9,Apache2.2.13.我的操作系统是FreeBSD,如果重要.同样的问题是reportedforwin32.更新:PerlTrace全部输出解决方法邪恶之源似乎是Apache::DBI.

  9. 如何使用Perl中的C类?

    我有一套用C写的课.从Perl脚本中调用它们的最佳方法是什么?

  10. perl – 在Emacs中以双模式更好的缩进

    我正在使用Emacs来修改Perl和Verilog交织的代码.我正在使用two-mode-mode在两者之间切换,这样可以预期.问题是perl代码与//一行一行地表示;如下图所示:而双模式则认识到它是Perl,它是逐行的,所以缩进等在线上无意义.我想做的是使Perl代码像往常一样格式化,但忽略//;字符.有什么想法吗?我刚刚开始偷看模式文件,它们是可以理解的复杂的,所以任何提示都不会感激!

返回
顶部