【问题标题】:If getOrCreate is an antipattern, how can I avoid it?如果 getOrCreate 是一种反模式,我该如何避免呢?
【发布时间】:2015-11-24 11:39:23
【问题描述】:

根据http://martinfowler.com/bliki/CQRS.html,我认为 getOrCreate 函数是一种反模式。

function getOrCreateObj(something) {
  let f = find(something, db); 
  if (f) return f;
  else return createObj(something);  
}

我应该怎么做才能避免它?

【问题讨论】:

  • 您正在那里创建一个全局变量f。最好这样做,find(something, db) || createObj(something)。除此之外,您的; 用法不一致。
  • @thefourtheye 是的,它只是在没有检查的情况下编写的。但这些只是与问题本身没有太大关系的细节

标签: javascript design-patterns anti-patterns


【解决方案1】:

最好有返回特定类型或 null 的无副作用函数。

所以你会有一个get 和一个create 方法,并在应用程序逻辑或上面的抽象中检查something 的存在

// pseudo code
get( INT: id ); // Returns SomeObj or NULL
create( INT:id ):: SomeObj;

// In service or application layer or other abstraction
foo = get( 1 ) || create( 1 );

【讨论】:

  • 好吧,但它和我的代码一样,我只是在一个函数下限定它,不是吗?
  • 这是另一个问题,但让我在这里回答:它相同,但给调用者更多的灵活性。它被称为Inversion of Control
  • @MaciejSz 所以关键是不要将这种功能性限制在一个功能中,而是始终让它传播?
  • 这个想法是编写函数,您不需要检查要使用的代码。副作用,即使被评论,也意味着使用该方法的程序员需要了解它的工作原理。在具有数百个功能的复杂系统中,这可能会导致无法一次处理,并且会从根本上降低程序员的速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多