问题标签 [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.
ruby-on-rails-3 - Rails 中关联的空对象模式
尽管在这里查看了一些关于 Rails 中空对象的答案,但我似乎无法让它们工作。
我的问题是,在创建用户时,我为配置文件传递了正确的嵌套属性(profile_attributes),最终我的新用户得到了一个 NullProfile。
我猜这意味着我的自定义配置文件方法在创建和返回 NullProfile 时被调用。如何正确执行此 NullObject 以便仅在读取时发生,而不是在对象的初始创建时发生。
ruby-on-rails - 如何处理可选的 belongs_to 关联
用例:
考虑以下示例。
如果登录用户创建了 Foo,它将与它的用户记录相关联。如果一个未登录的用户创建了 Foo,它不会关联到任何用户。这只是一个示例,我的应用程序中有很多类似的用例。
问题:
问题是我的视图代码被很多 if 条件和三元运算弄乱了,比如,
当前解决方案:
为了克服这个问题,我使用了空对象设计模式。User 类定义了一个 NullUser 对象(其名称将设置为“未设置”)。如果 foo 对象没有用户对象,它将返回一个 NullUser 对象。我已经覆盖了执行 nil 检查的 Foo 类中的用户方法。
问题:
- 有没有更好的解决方案?
- 是否有一个 gem 可以促进 Rails 活动记录模型的空对象模式。
c# - c# - 当这些属性的父级可以或不能为空时,返回空属性的默认值
所以我没有找到任何优雅的解决方案,无论是谷歌搜索还是整个stackoverflow。我想我手中有一个非常具体的情况,无论如何它是这样的:
我有一个我无法控制的对象结构,因为我从外部 WS 接收到这个结构。这是一个相当大的对象,具有各种级别的字段和属性,并且在任何级别中,此字段和属性都可以为空,也可以不为空。您可以将此对象视为贫血模型,它没有行为,只有状态。
出于这个问题的目的,我将为您提供一个模拟我的情况的简化示例:
因此,在我的代码中,我必须访问不同级别的许多这些属性,以进行一些数学运算以计算我需要的内容。基本上对于我必须做的每种类型的计算,我必须测试我需要的每个级别的属性,以检查它是否不为空,在这种情况下,我将返回(十进制)0,或任何其他默认值,具体取决于业务逻辑。
我必须与之相关的数学示例:
非常重要的是,这种结构的叶属性始终是基元,或者可以为空的基元,在这种情况下,我会给予适当的处理。这是我必须为我需要的每个属性执行的“逻辑”,有时我必须使用其中的一些属性。实际结构也相当大,所以我需要做的验证次数对于每个必要的属性也会更大。
现在,我想出了一些想法,我认为它们都不理想:
- 创建方法来收集属性,其中将抽象任何必要的验证或获取默认值的逻辑。缺点是,在我看来,它会有相当多的重复代码,因为验证和默认值对于某些字段组是相似的。
- 创建一个通用方法,它接收一个对象,以及一个访问所需字段的 Lamba 函数。此方法将尝试执行该函数并返回其结果,并且在出现 NullReferenceException 的情况下,它将返回一个默认值。这个的好处是它非常通用,我只需要传递 lambdas 来访问属性,并且该方法可以处理任何问题。它的缺点是我正在使用 try -> catch 来控制逻辑,这不是它的目的,并且对于最终会对其进行维护的其他程序员来说,代码可能看起来令人困惑。
- 空对象模式,我猜这将是最优雅的解决方案。如果是正常情况,它将具有所有优点。但问题是为这个结构提供空对象的影响。只是为了提供更多背景信息,我正在开发的软件与政府的服务集成,我正在使用的结构(在政府的规范中)有一些字段,其中 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
我基本上可以通过这种方式访问属性,然后进行数学运算:
对于我需要的每个属性。它仍然不仅仅是:
当然,但是到目前为止我找到的任何解决方案都要好得多,因为我不熟悉扩展方法,所以我真的学到了很多东西。
再次感谢。
ruby-on-rails - 在 Rails 中实现 NullObject 模式
Post belongs_to :user
我想为已删除用户保留帖子的应用程序。在查看作者已被删除的帖子时,这可能会导致视图出现错误。我试图这样做:
这会导致“堆栈级别变深”错误。为什么?我可以这样做:
但以这种方式搅乱我的联想似乎并不正确。解决这个问题的最佳方法是什么?
c# - 使用反射创建对象
我正在尝试编写一个NullObject
创建方法,在其中我传入一个实现ICreateEmptyInstance
接口(即为空)的类名,它会遍历它的属性以寻找其他实现的类ICreateEmptyInstance
并将创建这些类的“Null”实例。
我应该可以用这个来称呼它
我遇到问题的地方是在 foreach 循环内,这条线
...显然这不起作用,但我怎样才能完成创建一个“空对象”来分配给我当前正在创建的实例。
编辑:那泛型呢?我想创建空实例
c++ - boost::functions 类型的空实现
我有这样的事情:
这是定义 nullStyler 的正确方法吗:
我在想我可以这样做,但是空函数抛出:
使用 styler 函数的代码可以检查空,而不是使用“空对象模式”。哪个更好?在我的 Detail 命名空间中有一个奇怪的无功能或检查是否为空?
c# - 泛型空重载构造函数以及何时不使用泛型
我目前正在构建一个通用状态机,并且我正在使用StateMachine
带有通用参数的构造函数来设置创建时的回退状态,以防机器无事可做。
我想知道拥有两个构造函数是否是不好的做法,一个在需要创建新状态对象时由状态机本身使用,另一个在第一次初始化状态机时使用(设置默认回退状态) .
我最大的问题是:我是否在滥用泛型,是否有不应该使用泛型的时候?
状态机创建:
状态机构造函数:
以下是在NodeStateMachine
类中更改状态的方式:
有问题的构造函数直接位于状态本身:
c++ - 双向链表中的空对象模式
我正在尝试在 C++ 的双向链表中使用空对象模式,但我似乎找不到在保持代码干净的同时使用它的方法。
问题在于以下代码:
getNext
如果下getPrevious
一个NullNode
/上一个节点是nullptr
.
失败的用例 - 当节点是头节点时:
下面将设置第二个节点的前一个指针指向一个导致内存泄漏的 NullNode 对象。
我在这里想要完成的是保持 NOP 并保持代码清洁nullptr
和类类型比较,
任何建议将不胜感激!
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