问题标签 [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.

0 投票
4 回答
1756 浏览

ruby-on-rails-3 - Rails 中关联的空对象模式

尽管在这里查看了一些关于 Rails 中空对象的答案,但我似乎无法让它们工作。

我的问题是,在创建用户时,我为配置文件传递了正确的嵌套属性(profile_attributes),最终我的新用户得到了一个 NullProfile。

我猜这意味着我的自定义配置文件方法在创建和返回 NullProfile 时被调用。如何正确执行此 NullObject 以便仅在读取时发生,而不是在对象的初始创建时发生。

0 投票
1 回答
152 浏览

ruby - Mongoid 关联和空对象模式?

您将如何在 Mongoid 关系上实现空对象模式?

大多数所有者不会有偏好,因此我希望他们有一个 NullPreference,如 Ben Orenstein 的精彩演讲中所述。

我想要的是这样的:

我在 ActiveRecord 中发现了一个关于同一事物的相关问题,但没有答案。

编辑:我使用的是 Mongoid 2.6,否则我可以使用autobuild: true并获得一个真实的 Preference并使用默认值。

0 投票
2 回答
1164 浏览

ruby-on-rails - 如何处理可选的 belongs_to 关联

用例:

考虑以下示例。

如果登录用户创建了 Foo,它将与它的用户记录相关联。如果一个未登录的用户创建了 Foo,它不会关联到任何用户。这只是一个示例,我的应用程序中有很多类似的用例。

问题:

问题是我的视图代码被很多 if 条件和三元运算弄乱了,比如,

当前解决方案:

为了克服这个问题,我使用了空对象设计模式。User 类定义了一个 NullUser 对象(其名称将设置为“未设置”)。如果 foo 对象没有用户对象,它将返回一个 NullUser 对象。我已经覆盖了执行 nil 检查的 Foo 类中的用户方法。

问题:

  1. 有没有更好的解决方案?
  2. 是否有一个 gem 可以促进 Rails 活动记录模型的空对象模式。
0 投票
1 回答
996 浏览

c# - c# - 当这些属性的父级可以或不能为空时,返回空属性的默认值

所以我没有找到任何优雅的解决方案,无论是谷歌搜索还是整个stackoverflow。我想我手中有一个非常具体的情况,无论如何它是这样的:

我有一个我无法控制的对象结构,因为我从外部 WS 接收到这个结构。这是一个相当大的对象,具有各种级别的字段和属性,并且在任何级别中,此字段和属性都可以为空,也可以不为空。您可以将此对象视为贫血模型,它没有行为,只有状态。

出于这个问题的目的,我将为您提供一个模拟我的情况的简化示例:

因此,在我的代码中,我必须访问不同级别的许多这些属性,以进行一些数学运算以计算我需要的内容。基本上对于我必须做的每种类型的计算,我必须测试我需要的每个级别的属性,以检查它是否不为空,在这种情况下,我将返回(十进制)0,或任何其他默认值,具体取决于业务逻辑。

我必须与之相关的数学示例:

非常重要的是,这种结构的叶属性始终是基元,或者可以为空的基元,在这种情况下,我会给予适当的处理。这是我必须为我需要的每个属性执行的“逻辑”,有时我必须使用其中的一些属性。实际结构也相当大,所以我需要做的验证次数对于每个必要的属性也会更大。

现在,我想出了一些想法,我认为它们都不理想:

  1. 创建方法来收集属性,其中将抽象任何必要的验证或获取默认值的逻辑。缺点是,在我看来,它会有相当多的重复代码,因为验证和默认值对于某些字段组是相似的。
  2. 创建一个通用方法,它接收一个对象,以及一个访问所需字段的 Lamba 函数。此方法将尝试执行该函数并返回其结果,并且在出现 NullReferenceException 的情况下,它将返回一个默认值。这个的好处是它非常通用,我只需要传递 lambdas 来访问属性,并且该方法可以处理任何问题。它的缺点是我正在使用 try -> catch 来控制逻辑,这不是它的目的,并且对于最终会对其进行维护的其他程序员来说,代码可能看起来令人困惑。
  3. 空对象模式,我猜这将是最优雅的解决方案。如果是正常情况,它将具有所有优点。但问题是为这个结构提供空对象的影响。只是为了提供更多背景信息,我正在开发的软件与政府的服务集成,我正在使用的结构(在政府的规范中)有一些字段,其中 null 有一些不同于默认值,如“0”。此外,该规范不时更改,并且再次生成类,并且我必须进行创建 Null 对象的后处理也需要维护,这对我来说似乎有点危险。

我希望我说得够清楚。

提前致谢。

解决方案

这是对我如何解决问题的回应,基于接受的答案。

我对 C# 很陌生,这种相关的讨论确实帮助我在许多方面提出了一个优雅的解决方案。我仍然有一个问题,即根据代码的执行位置,它使用.NET 2.0,但我也找到了解决这个问题的方法,我可以在其中定义扩展方法:https ://stackoverflow.com/a/707160/649790

对于解决方案本身,我发现这是最好的:http: //www.codeproject.com/Articles/109026/Chained-null-checks-and-the-Maybe-monad

我基本上可以通过这种方式访问​​属性,然后进行数学运算:

对于我需要的每个属性。它仍然不仅仅是:

当然,但是到目前为止我找到的任何解决方案都要好得多,因为我不熟悉扩展方法,所以我真的学到了很多东西。

再次感谢。

0 投票
2 回答
1235 浏览

ruby-on-rails - 在 Rails 中实现 NullObject 模式

Post belongs_to :user我想为已删除用户保留帖子的应用程序。在查看作者已被删除的帖子时,这可能会导致视图出现错误。我试图这样做:

这会导致“堆栈级别变深”错误。为什么?我可以这样做:

但以这种方式搅乱我的联想似乎并不正确。解决这个问题的最佳方法是什么?

0 投票
1 回答
173 浏览

c# - 使用反射创建对象

我正在尝试编写一个NullObject创建方法,在其中我传入一个实现ICreateEmptyInstance接口(即为空)的类名,它会遍历它的属性以寻找其他实现的类ICreateEmptyInstance并将创建这些类的“Null”实例。

我应该可以用这个来称呼它

我遇到问题的地方是在 foreach 循环内,这条线

...显然这不起作用,但我怎样才能完成创建一个“空对象”来分配给我当前正在创建的实例。

编辑:那泛型呢?我想创建空实例

0 投票
1 回答
241 浏览

c++ - boost::functions 类型的空实现

我有这样的事情:

这是定义 nullStyler 的正确方法吗:

我在想我可以这样做,但是空函数抛出:

使用 styler 函数的代码可以检查空,而不是使用“空对象模式”。哪个更好?在我的 Detail 命名空间中有一个奇怪的无功能或检查是否为空?

0 投票
1 回答
133 浏览

c# - 泛型空重载构造函数以及何时不使用泛型

我目前正在构建一个通用状态机,并且我正在使用StateMachine带有通用参数的构造函数来设置创建时的回退状态,以防机器无事可做。

我想知道拥有两个构造函数是否是不好的做法,一个在需要创建新状态对象时由状态机本身使用,另一个在第一次初始化状态机时使用(设置默认回退状态) .

我最大的问题是:我是否在滥用泛型,是否有应该使用泛型的时候?

状态机创建:

状态机构造函数:

以下是在NodeStateMachine类中更改状态的方式:

有问题的构造函数直接位于状态本身:

0 投票
1 回答
136 浏览

c++ - 双向链表中的空对象模式

我正在尝试在 C++ 的双向链表中使用空对象模式,但我似乎找不到在保持代码干净的同时使用它的方法。

问题在于以下代码:

getNext如果下getPrevious一个NullNode/上一个节点是nullptr.

失败的用例 - 当节点是头节点时:

下面将设置第二个节点的前一个指针指向一个导致内存泄漏的 NullNode 对象。

我在这里想要完成的是保持 NOP 并保持代码清洁nullptr和类类型比较,

任何建议将不胜感激!

0 投票
3 回答
101 浏览

java - NullObjectPattern 和 Comparable 接口

之前已经问过我遇到的问题:How to implement an interface with an enum, where the interface extends Comparable?

但是,没有一个解决方案可以解决我的确切问题,即:

我有一个值对象,类似于BigDecimal. 有时该值不会用真实对象设置,因为该值尚不知道。所以我想用空对象模式来表示这个对象没有定义的时间。这一切都不是问题,直到我尝试让我的 Null 对象实现Comparable接口。这是一个 SSCCE 来说明:

其他担忧:

  • 在实际示例中,我在Foo这里调用的内容有多个子类。
  • 我可能可以通过NullFoo不是一个来解决这个问题enum,但是我不能保证它只有一个实例,即Effective Java Item 3, pg。17-18