Соглашение об именах для владения объектами в методах - PullRequest
3 голосов
/ 01 апреля 2011

Есть ли способ закодировать в сигнатуру метода, независимо от того, изменяется объект владельца или нет? В Getter () и Setter (), которые принимают или возвращают указатели, вы никогда не узнаете, изменяется или нет владение объектом.

О чем вы думаете:

// Uses pConfiguration or creates its own copy - the ownership is un-touched
void ContainerClass:SetConfiguration( const Configuration* pConfiguration ) {}
// Takes the ownership of pConfiguration (and deletes it in the destructor)
void ContainerClass:PutConfiguration( Configuration* pConfiguration ) {}
// Returns a 'reference' and keeps the ownership (you must not delete it)
const Configuration* ContainerClass::GetConfiguration() {}
// Returns a _new_ object and transfers the ownership to you
Configuration* ContainerClass::TakeConfiguration() {}

Так же Set () против Put () и Get () против Take () способ его кодирования, или вы используете тип (const vs. non-const) - или вы знаете это контекст?

С наилучшими пожеланиями,

Charly

Ответы [ 3 ]

5 голосов
/ 01 апреля 2011

Лучший способ определить в интерфейсе, что право собственности не изменилось, - это не использовать указатели. Предпочитаю ссылки на указатели:

// Does not take ownership
void ContainerClass::SetConfiguration( const Configuration& config ) {}

// Does not release ownership
const Configuration& ContainerClass::getConfiguration() const {}

Когда вам нужно передать право собственности на память, лучше документировать ее по именам. Если вы действительно хотите сделать это явно в подписи, используйте старый добрый std::auto_ptr:

void ContainerClass::SetConfiguration( std::auto_ptr<Configuration> cfg );
std::auto_ptr<Configuration> ContainerClass::CopyConfiguration() const;

std::auto_ptr обладает странным свойством, которое copy на самом деле означает , передающее владение

2 голосов
/ 01 апреля 2011
  1. Пишите хорошую документацию и комментарии (вы можете использовать doxygen)
  2. В Qt, где функции часто играют с методами владения, вызываемыми, например, itemAt и takeAt и addXXX, всегда передаются права собственности, которыеотражено в документации.Таким образом, вы можете использовать get() / take() и set() / put().В любом случае, хорошие документы всегда полезны, даже названия ваших функций не требуют пояснений.
0 голосов
/ 01 апреля 2011

В большинстве случаев при использовании указателей «владение» для начала отсутствует, поэтому нет никаких проблем с его изменением.Но дизайн - это ключ;роль класса должна прояснить его связь с указанным объектом.На более высоком уровне, чем владение или что-то еще.И эти отношения, в свою очередь, определяют, что он будет делать с объектом.

Для исключительных случаев, когда право собственности имеет значение, std::auto_ptr является стандартным способом выражения передачи.Это абсолютный перевод, хотя;если параметр имеет тип std::auto_ptr, то вызывающая сторона не может даже получить доступ к объекту после вызова функции.(Я обнаружил, что это очень эффективно в сценариях с многопоточностью. Имеет смысл, чтобы объект принадлежал определенному потоку в любой момент времени, и что никакой другой поток не может получить к нему доступ, и std::auto_ptr выражает это очень четкоэффективно.)

...