Я использую следующие префиксы метода для обозначения владения объектом.
Право собственности означает ответственность за удаление.
Y.take_ZZZ(x)
Вызывающий передает право владения x на Y, и вызывающий не должен далее обращаться к x.
(потому что Y мог даже немедленно удалить x).
Y.own_ZZZ(x)
Похоже взять;
вызывающая сторона передает владение x на Y, но вызывающая сторона может продолжать ссылаться на x
и ожидать, что Y не будет немедленно удалить х
(по крайней мере, до тех пор, пока существует Y, и предполагается, что Y будет существовать, по крайней мере, в контексте знания вызывающим абонентом Y).
Обычно Y не удаляет x, пока Y не будет уничтожен (хотя Y может передать право собственности).
Y.know_ZZZ(x)
Вызывающий предоставляет указатель / ссылку на x (вызывающий может сам или не может иметь x), но Y не должен вступать во владение x.
Y будет ожидать, что x будет существовать до тех пор, пока он существует.
x = Y.provide_ZZZ()
x - это объект, которым владеет Y.
Y возвращает ссылку (&) на объект, чтобы вызывающий мог «знать» его.
Объект может быть изначально нулевым указателем, пока он не потребуется, Y не может создать объект, пока он не понадобится.
Независимо от того, является ли x динамически размещенным или нет, скрыто от вызывающей стороны, Y делает все, что необходимо для возврата ссылки на экземпляры объекта, который должен быть предоставлен.
x будет оставаться экземпляром до тех пор, пока существует Y.
Иногда я предоставляю соответствующий метод Y.done_with_ZZZ (x), чтобы вызывающий мог сказать Y, что это сделано, может удалить x.
x = Y.give_ZZZ()
Y передает х вызывающему и больше не будет ссылаться на него.
В этом случае вызывающая сторона будет владеть x и отвечать за ее удаление или передачу другому объекту.
x = Y.lend_ZZZ()
Y предоставляет ссылку / указатель на x для вызывающей стороны (противоположно know_ZZZ)
У сохраняет право собственности.
(аналогично предоставлению, но Y не создает экземпляр X, поэтому он либо будет иметь x и вернет ссылку (указатель), либо не получит и вернет null.
x = Y.check_out_ZZZ() and Y.check_in_ZZZ(x)
При оформлении заказа Y предоставляет звонящему эксклюзивный доступ к x до тех пор, пока звонящий не проверит его.
x = Y.create_ZZZ()
Y создаст x и немедленно передаст его вызывающей стороне (заводская функция).
Владение может быть дополнительно усилено с помощью умных указателей,
но обычно я использую эти соглашения об именах без умных указателей, если только
будет более сложная последовательность транзакций владения, область владения не очень локализована, или на объекты будут ссылаться (известны) несколько объектов.