2 мая 2011 г.

Опоздавшее рациональное предложение

Жаль, что в Симбиане и S60 нет никаких правил для наименования функций, связанных с передачей или получением прав на объекты, то есть касающихся так называемого "object ownership transferring".

К сожалению, многочисленные API в Симбиане изобилуют функциями, в документации которых нет ни слова о передаче или получении прав на используемые объекты. Простейшим примером такой функции может послужить метод RPointerArray::AppendL( const T* anEntry ). Ни в хидере для класса RPointerArray, ни в его официальной документации нет ни слова о том, что класс RPointerArray именно через метод AppendL() получает права на объект anEntry. В документации лишь просто заявлено, что класс RPointerArray принимает на себя обязательства по обеспечению жизнедеятельности объектов, на которые ссылаются хранимые в нём указатели.

Однако многие ли из программистов могут всегда хорошо помнить каким именно образом каждый из конкретных классов обращается с используемыми в нём указателями и ссылками на объекты? Многие ли из программистов имеют достаточно времени для проверок передачи прав на объекты в создаваемом и используемом ими коде?

Только покопавшись в примерах, статьях или книгах для разработчиков, можно найти упоминание о том, что именно в методе RPointerArray::AppendL() передаются права на указываемые объекты. И если о классе RPointerArray ещё как-то упоминается в многочисленных материалах, то о других, более экзотических классах, или библиотеках сторонних разработчиков, уже нет.

Для опытных "симбионщиков", это конечно же, далеко не новость, а вот для новичков — достаточно неприятный сюрприз, приводящий как к утечкам памяти, так и к двойным удалениям объектов.

А ведь казалось бы, что может быть проще, чем добавить к правилу именования L-методов (leaving methods) ещё одно правило, касающееся методов, в которых происходит передача прав на объекты? Например, имена таких методов могли бы заканчиваться на букву "O", от выражения "ownership transferring".

В таком случае метод RPointerArray::AppendL( const T* anEntry ) мог бы получить имя RPointerArray::AppendOL( const T* anEntry ). И тогда программист любой закалки и выучки сразу бы заметил, что в данном методе речь идет не только о возможности "сброса" (leave), но так же и о передаче (или получении) прав на объект anEntry.

Уверен, что это помогло бы предотвратить множество ошибок, связанных с указателями и ссылками на объекты. И хотя мои советы Симбиану не только не нужны, но уже и бесполезны, всё же у любого из разработчиков, создающих программы на Symbian C++, есть право и возможность облегчить жизнь себе и другим программистам. Естественно, если этот мой весьма скромный совет будет найден хоть немного полезным.