代码之家  ›  专栏  ›  技术社区  ›  Tor Livar

获取或创建对象的方法的好名称是什么?

  •  39
  • Tor Livar  · 技术社区  · 15 年前

    假设您有一个缓存和一个方法,该方法将执行以下操作:

    if (wanted Foo is not in cache)
        cache.Add(new Foo())
    Return Foo from cache
    

    GetFoo() , GetOrCreateFoo() 或者别的什么(更好的)?或者这真的应该分为两种方法吗?

    16 回复  |  直到 15 年前
        1
  •  35
  •   Jason Williams    15 年前

    在大多数情况下,一个简单的GetFoo就足够了,因为调用者不需要知道您正在创建和缓存它。这就是封装的意义所在。

    但是,在某些情况下,创建是一项昂贵的操作,因此了解您可能正在按需创建某些内容,并且在某些情况下创建速度会很慢是很有用的。在这种情况下,不同的命名约定使调用者更清楚。在本例中,GetOrCreate()或Get(Options.CreateIfMissing)对调用方是一个很好的提示。

    (当然,应该在文档中注明这种行为,但最好使用一个方法名称,在人们阅读代码时提醒他们有关副作用的信息,而不必为每个调用的方法打开并阅读文档)

        2
  •  20
  •   Ibrahim Arief    14 年前

    我知道我问得太晚了,但我能向你求婚吗 GrabFoo() 作为get或create的约定,如果缺少,则将其与 GetFoo() ?

    在看 synonyms of Get ,我看到几个合适的动词,有些已经常用作方法动词。例如, Fetch

    Grab似乎很少使用,而且可能带有(尽管很弱)的语义 I want you to get-or-create it, no matter what.

        3
  •  12
  •   Louie Almeda    10 年前

    Getsert get insert update 插入 Upsert

    • 用户应该清楚地知道,它不会只执行正常的get
    • 易于拾取和直观(我不确定)
        4
  •  8
  •   Isinlor    9 年前

    文字 obtain acquire 看起来很合身。尤其是 获得 :

    占有;获得,获得或获得,如通过 努力或请求:获得许可;为了获得更好的

        5
  •  5
  •   Ofir    15 年前

    我的首选项是GetFoo(),因为从调用者的角度来看,操作是获取的,而缓存更像是一个实现细节。

        6
  •  3
  •   AakashM    15 年前

    我会叫它 GetFoo ,理由是 来电者 Foo -它只是想 Get .

        7
  •  2
  •   Alex Humphrey    15 年前

    对于缓存,我可以简单地称之为GetFoo()。缓存被设计成数据源后面的门面,这样调用者就可以轻松地访问项,而不用担心它们是如何加载的。

    我可以称之为GetFoo,但是如果请求的对象不在缓存中,那么缓存将加载它(以及可能产生的所有潜在性能影响)。

        8
  •  2
  •   Alexander Oh    9 年前

    如果您是引用透明的或者对象是单例的,那么另一个选项是有意义的。

    getOrCreate() 一个物体 如果它已经被创建,则返回对它的引用。在这种情况下,我将调用 lazyGet 它也用于其他库,如 javaslang's lazy .

    MyObject lazyGet() {
    }
    

    这对呼叫站点有一个好处。如果您的调用在创建上下文中是昂贵的,那么您的被调用方知道,可以使用急切的初始化将调用开销转移到程序的非关键部分。

        9
  •  1
  •   this. __curious_geek    15 年前

    我只想 GetFoo()

    GetFoo()

        10
  •  1
  •   Lasek    9 年前

    getInstanceFoo()
    

    getFooInstance()
    

    就像独生子女班一样。

        11
  •  1
  •   mchlstckl    8 年前

    我用 Take 而不是 Get . 原因:

    • take 听起来也有点像 make
    • get 在给定的上下文中
    • 听起来比 得到 得到 它,我只是
        12
  •  1
  •   Casey Plummer    8 年前

    有几个定义似乎很合适:

    • 使存在或发生;生产
    • 引起或创造

    这个词在你的问题中也可以分为两种观点。

    得到 创建

    Be=创建

    Get=获取

    加上它很短。


    我从Autofac借用这个词,Autofac使用Resolve方法获取对象的实例,或者在必要时创建它。

        13
  •  0
  •   OmniBus    15 年前

    如果创建对用户不重要,则为GetFoo;否则,称之为createOrGetFoo。

    如果需要区分概念,可以使用GetFoo、CreateFoo和createOrGetFoo等方法。

    根据你提供的信息,我更愿意把它命名为GetFoo。

        14
  •  0
  •   dasher    15 年前

    假设这个方法在cacheManager上,那么fetch(wanted)[或者get(wanted)取决于您的个人pref]就足够了-API doc指示如果该项不存在就创建它。

        15
  •  0
  •   psyanite    6 年前

    就像 upsert getsert 如“获取”或“插入并返回”。

    • greate 例如在get或create中

    • gadd 如get或add

        16
  •  0
  •   Christian    5 年前

    1.查找同义词

    你可以试着找到“get”的同义词。然而,您可能会发现,不使用“get”的getter可能意味着其他内容,但您并不确切知道它的作用。我会避免使用这种方法,因为最终理解它的功能是不干净的。

    您可以添加副词,通过确保您做了一些事情来指定get方法。例如“getCreated”、“getSafe”、“getAssured”、“getAssured”、“getInit”、“getInitialized”。这样一来,它就可以清楚地理解它是一种干劲,但同时也告诉你,它还会发生别的事情。但是,您可能不知道名称是属性还是get的一部分。比如“getSecureUrl”。所以我会避免在get中使用后缀。

    (不好)

    你也可以添加averbs作为前缀,告诉你在做什么。比如“secureGet”,“safeGet”,“initGet”。。。虽然这与属性没有冲突,但是您不知道它是否是一个getter,或者是在getter之前做了一些事情而实际上没有得到一些东西的其他东西。所以返回值可能是意外的。我也会避免这种做法。

    4.用词来描述你的实际工作 (也许)

    function initNameid($name) { ... }
    

    这样你就知道你可以初始化一些东西,而不仅仅是得到一些东西。这样你就可以保持你的吸气剂干净和简单,没有混合它。然而,如果你正在寻找一些你必须考虑的更标准的东西,那么如果人们正在寻找获得者,他们可能找不到它。所以这可能不是最好的。

    5.提高吸气剂的附加性能 (好的)

    function getName($id, $create = false) { ... }
    

    通过这种方式,您可以向get函数提供信息,如果布尔值为true,它应该尝试强制获取其值。如果你使用一个合适的IDE,它也会告诉你争论的关键是“force”、“create”或类似的东西,所以你总是知道它是做什么的。明智的预期可能是通过最干净的方法。

    6.合并初始化和getter而不合并它们 (好的)

    扪心自问,为什么一定要把它组合起来呢?当然,这是单行线,但是。。。你需要吗?简单的一个接一个地做怎么样:

    initName($name);
    getNameId($name);
    

    有时候,最好不要仅仅因为有一条线就把一些东西混在一起。

    7.你真的创造了什么还是简单的储存了它? (好的)

    如果你只是储存一些类似的东西:

    public static $name;
    public static getName() {
    if (!self::$name) $name = ...
      return self::$name;
    }
    

    8.你为什么要把两个不同的意思组合在一个动词里呢?

        17
  •  0
  •   Victor Timoftii    5 年前

    我建议使用 obtain . 我们已经在团队中设立了这个惯例,我们对此感到非常满意。

    Cambridge 定义:

    获得:获得某物,尤指通过索取、购买、为之工作或从其他东西中获得。

        18
  •  -1
  •   David Hedlund    15 年前

    如果这个设计在您的应用程序中有逻辑意义,那么我认为 GetOrCreateFoo

    另一种明确表达其目的的方法是

    GetFoo(bool createIfNotExists)
    

    当然,如果我们真的在谈 隐藏物 Foo

        19
  •  -1
  •   InsertNickHere    15 年前

    推荐文章