代码之家  ›  专栏  ›  技术社区  ›  foraidt

函数名,用于创建尚未创建的内容

  •  4
  • foraidt  · 技术社区  · 17 年前

    有时我会编写一个函数,如果它还不存在,则只创建一些东西,否则什么也不做。
    名字像 CreateFooIfNecessary() EnsureThereIsAFoo() 我确实在工作,但他们觉得有点笨拙。

    也可以说 GetFoo() foo 可以首先创建,并且仅当函数返回句柄/指针/引用时才有效 .

    13 回复  |  直到 17 年前
        1
  •  18
  •   Sean    17 年前

    怎么样

        2
  •  12
  •   Neil Barnwell    11 年前

    更新

    我现在更清楚了,所以会应用命令查询分离(CQS)。CQS说一种方法应该 返回一个结果,不要同时返回两个结果。

    Foo GetFoo(id); // Throws if Foo cannot be found for id
    Foo FindFoo(id); // Returns null if the Foo cannot be found.
    void CreateFoo(id[, args]); // Creates a Foo with supplied args.
    

    旧的后忽略

    GetFoo(); // Always returns a Foo, so creates if there isn't one already.
    FindFoo(); // Returns null if the Foo cannot be found.
    

    在数据访问中特别有用,当您基于密钥加载员工或其他内容时,它可能存在,也可能不存在。

    具体来说,这是一个记录在案的编码标准。在代码库中工作的每个人都知道这个标准,并以同样的方式实现它。这就是我们如何摆脱这些相当通用的好名字的方法。

        3
  •  7
  •   RichieHindle    17 年前

    我会和你一起去 EnsureFoo() .

        4
  •  3
  •   Avi    17 年前

    这通常被称为 懒惰的创造

        5
  •  3
  •   pageman    17 年前

    所以你想成为一个创造者,对吗?然后。。。

    LetThereBeFoo();
    

    呵呵

    检查它是否存在

    IsThereFoo();
    
        6
  •  3
  •   Kirk Broadhurst    17 年前

    为什么不:

    private FooType m_foo;
    
    public FooType Foo
    {
       get
       {
          if (this.m_foo == null)
          {
             this.m_foo = new Foo();
          }
          return this.m_foo;
       }
       set
       {
          this.m_foo = value;
       }
    }
    
        7
  •  2
  •   ewrankin    17 年前

    我觉得只要有CreateFoo()就可以了。文档应说明函数在不同场景中的作用。查看一些文件I/O API,例如来自Win32 API的CreateFile(…)。根据参数,它将创建一个新文件或打开现有文件(如果存在)。您的不必基于参数,但它的行为可以根据程序的状态而有所不同。因此,从根本上说,我认为你的观点可能是相同的。

        8
  •  1
  •   chaos    17 年前

    我给这些起名字 RequireFoo() .

        9
  •  1
  •   Tom Dalling    17 年前

    如果您要返回该值,我就将其称为GetFoo(),因为延迟加载(可能)是一个实现细节,因此,在接口中不应该很明显。

    如果可以创建多个Foo对象,但它们没有被返回,那么我不确定。一开始听起来很奇怪。

        10
  •  0
  •   Mark Redman    17 年前

    在我的Foo类中,我将拥有GetExistingOrNew(Guid id)

        11
  •  0
  •   Doug Moscrop    14 年前

    我最近开始使用 defineFoo() getOrCreateFoo()

        12
  •  -4
  •   Angel.King.47    17 年前

    issetFoo();
    

    撒尿:

    AreWeThereYetFoo(); helloFoo(); booFoo();