问题标签 [null-object-pattern]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - 带有 QObject 的空模式
(C++/Qt) 我有一个指向 QObject 的智能指针。假设是 QWeakPointer。由于某些外部原因(可能在另一个对象中发生的事情或由于某个事件),指向的对象可能会被破坏。因为我有一个智能指针,所以不会有悬空引用,所以没有问题。但我总是要检查指针是否为空。
我正在考虑使用空模式以避免一直检查这一点,但我不确定这对于 QObject 是否可行或方便。这个想法是指针指向对象,如果它被破坏,智能指针会将其指向的对象更改为空对象。这是一个好主意还是我应该忘记它并检查指针是否一直为 NULL?
让我们给你看一个例子。我们有一个工人使用工具来完成工作:
在这种情况下,工具是一个库的公共领域对象,由 Worker 使用。我正在开发这样的库。所以工人正在使用螺丝刀,但它被打破并被摧毁。没问题:
m_tool 为 0,所以它什么也不做。但是我们必须每次都检查它是否不为空。
现在假设我们有一个 NullTool 对象:
当工具被销毁时,我们的指针会很聪明,并且会知道它应该指向一个 NullTool 实例。所以 Worker::work() 可以这样实现:
然后 m_tool->use() 将在什么都不做的 NullTool 上被调用,因此无需检查指针是否为空。
这是一个好主意吗?Qt提供的智能指针类是否有可能,或者我应该继承QWeakPointer?
design-patterns - 空对象模式以避免空检查?
最近我遇到了空对象设计模式,我的同事说它可以用来消除在整个代码中遇到的空指针检查。
例如,假设一个 DAO 类返回有关客户的信息(在一个名为 CustomerVO 的值对象中)。我的主类应该提取 firstName 和 emailId 并向客户发送电子邮件。
这是一个非常简单的例子,但是这种空检查可以根据值对象的复杂性迅速传播到整个代码中。
我有两个关于空值检查的问题 - 它们往往使代码变得丑陋且难以阅读 - 经验不足的开发人员在实际上应该抛出异常时进行了不必要的空值检查。例如,在上面的代码中,最好从 getCustomer() 本身抛出异常,因为如果它无法找到给定 CustID 的客户信息,则表明 CustID 无效。
好的,回到空对象模式,我们可以使用“空”CustomerVO 对象来隐藏空检查吗?
不要这样有意义。你怎么看?
以及在您的应用程序中最小化空检查的操作是什么。
java - 获取一个虚拟的 slf4j 记录器?
我可以从 slf4j 获得一个虚拟记录器吗?(想想空对象设计模式。)如果是这样,有人可以提供一个例子吗?或者如果我想这样做,我是否必须实现自定义记录器?
我希望按照以下方式编写一个函数
NullPointerException
如果没有设置记录器,则不会在最后一行得到 a 。
java - 关于重构返回 null 的代码的有趣思考问题
我有兴趣听到您的反馈。我最近看到了一些以下列方式实现的 Java 代码:
每当在没有上下文的情况下返回 null 时,我总是很担心。我希望 SomeMethod 的响应更明确,并正在考虑对其进行重构。从 SomeMethod 抛出异常可以提供一种方法来做到这一点。它将在上下文中发生并发生在故障点。
我想知道 SomeMethod 是否有另一种方式可以通知 AnotherMethod '在数据库中没有找到任何东西',而不是假设 null 总是等于'未找到'。我认为可以使用 NullObject,但我不清楚如果找不到数据,AnotherMethod 应该如何避免“继续工作”。
你将如何重构代码?
ruby - 只是为了好玩 - 我可以为特定用途编写自定义 NilClass 吗?
编辑 | 或者另一个问题,关于同一个客体主题。我可以编写自己的类定义来使以下所有操作都起作用吗?
我可以nil?
轻松地做这件事,因为那只是一种方法。但是不知道如何让它在布尔表达式中评估为非真值(包括最基本的表达式“o”)。
原始问题如下...
更多是出于好奇,我真的可以用 Ruby (1.9.2) 获得多少乐趣......
当用户未登录时,我希望能够使用unless @user
或除非@user.nil?
等检测它,但同时,我希望能够调用User
该对象的方法并让它们返回相同的NilClass
(ala Objective-C),因为在大多数地方这将消除对样板if @user
代码的需要,同时仍然像nil
布尔表达式一样工作。
我看到你不能 subclass NilClass
,因为它没有#new
方法。您可以直接向实例添加方法,但它是一个单例,因此如果我想观察此行为的唯一地方是未登录用户,这将导致问题。
是否可以?
我的意思是,是这样的:
这基本上是 Objective-C 处理 nil 的方式,它在某些情况下很有用。
我想我不能继承 NilClass 而只是实现会导致它在布尔表达式中为假的方法?
编辑 | 哈哈,如果你重新定义顶层,你真的会严重破坏 Ruby NilClass
......它根本停止响应任何方法调用。
design-patterns - 空模式和复合模式不能很好地结合在一起
在这个复合树中,我保留对父节点的引用以进行灵活的树遍历。我不想一直检查父级是否有空引用,但是如果我创建一个 NullNode 类并将每个节点的父级初始化为此我会得到堆栈溢出,因为 NullNode 有一个 NullNode 有一个 NullNode 有一个.. .. ad infinitum 我已经尝试将 NullNode 的父级设置为 null,但是我仍然必须对父级进行 null 引用检查,这似乎违背了目的。有人遇到这个吗?什么,如果有什么可以做的?
谢谢!
c# - StructureMap 可以返回一个特例吗?
我想让 StructureMap为某个实例返回一个名为“None”的特殊情况。
假设我有这个MyUser
范围为 HttpContext 的类。我想要一个嵌套的、驱动的类None
(即。 ),当没有时MyUser.None
返回该类型(例如,在引导等中)。MyUser
HttpContext
Application_Start()
这意味着某些调用可以检查特殊情况类型而不是 null (更具可读性),例如
我需要什么 SM 配置来实现这一点?我已经尝试过这种ConditionallyUse
方法,但没有取得多大成功。我不断地NullReferenceExceptionS
从 SM 内部扔东西。
c# - 尝试重构为 Null 对象模式,但最终结果似乎更糟
我正在重构一个大类,该类在各处都对 null 进行了大量检查,以使用 null 对象模式。到目前为止,这几乎是一个平稳的变化,但我对最终结果有几个问题,我想知道是否有更好或不同的方法,甚至回到原来的方式。
最大的问题是我有以下代码:
如您所见,我可能会从此条件中删除空检查,但我有一个布尔属性,如果设置为默认值,它将执行一段代码。如果我总是返回 true,我可能会引入一些难以发现和消除的细微错误。
另一个问题是我不得不像这样从 null 修改检查:
这简直丑陋,因为现在我必须检查类型,而不是只检查 null。这种情况在类中发生了 3 次,因为我没有返回对象的属性之一或执行其方法之一,我必须进行此检查。
最后,该对象有几个不可为空的 DateTime 属性,架构师不希望它们可以为空。同样,通过将 MinDate 值设为默认值,一些讨厌的错误可能会爬入代码中。
所以你有它。这是一个空对象模式比散落在各处的意大利面条空检查更糟糕的情况吗?有没有更好的方法来实现这一点?
感谢您的回答。
java - 我更喜欢哪种模式?
在我们的项目中,我们需要存储一些对象(例如 User),并且 User 类必须有一个验证标志(setOutdated 和 isOutdated 等方法)
有时,我们的 User 对象可能为 null,但在这种情况下验证标志必须是可访问的。可以从 User 类中提取这些方法,但由于语义,该字段和方法必须在该类中。
我发现了一些关于 Null Object 模式的文章(像这样),我想知道 - 是否可以创建 Null 对象(作为一种模式),它可以存储几种状态,如 null 过时、null 未过时、null 过时和not null 没有过时。
PS:如果在我的班级中引入“过时”字段,则很难清除对象而不是将其设置为 null
c# - 我可以告诉 NHibernate 不要保存某些对象吗?
我使用 NHibernate 和 NullObject 模式来简化我的视图。我使用James Gregory在此处找到的解决方案
并且 Person 有一个 Address 属性等等......
在我尝试为没有地址的人保存我的 Person 对象之前,这非常有效。由于我创建了 NullPerson 对象的新实例,NHibernate 将尝试保存它。并给了我这个:
有什么办法可以让 NHibernate 不尝试保存我的 NullObjects?或者我还有其他方法应该攻击这个吗?