соглашение об именах для методов, которые передают право собственности - PullRequest
1 голос
/ 08 сентября 2011

Рассмотрим следующий пример:

class Foo
{
    private Bar x;

    // ...

    public Bar getAndResetX()
    {
        Bar result = x;
        x = new Bar();
        return result;
    }
}

Существуют ли установленные правила именования для таких методов? Как yieldX, transferX или что-то?

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Раньше мы использовали соглашение Принятие и Сирота в качестве префикса для указания намерения в имени метода (взято из книги Талигента на C ++).

Bar b = foo.orphanBar(); // take Bar out of Foo
foo.adoptBar(b); // put it right back in

Вы можете использовать что-то подобное, чтобы предоставить ключи к объектам.Откровенно говоря, хотя я бы придерживался соглашения Java об использовании add и remove .Они предоставляют достаточно намерений, и другим программистам не нужно будет читать комментарий, объясняющий новое соглашение.

Bar b = foo.removeBar(); // take Bar out of Foo
foo.addBar(b); // put it right back in
1 голос
/ 08 сентября 2011

Я не уверен, что для таких методов существует соглашение об именах.ИМХО, я бы использовал глагол take (например, takeX()).Для получения дополнительной информации относительно соглашений об именах методов см. JLS §6.8.3 Имена методов .

Но, честно говоря, это действительно просто вопрос мнения.Если вы действительно обеспокоены этим, я бы порекомендовал вам просмотреть Java API для методов, которые являются функционально эквивалентными, а затем смоделировать имя вашего метода после них.

0 голосов
/ 08 сентября 2011

Классы интеллектуальных указателей Mozilla используют метод forget(), чтобы указать передачу права собственности:

already_AddRefed<nsIFoo> GetFoo() {
    nsCOMPtr<nsIFoo> foo = ...
    ...
    return foo.forget();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...