11 January 2012

Помоги себе сам

Удивительно, но нашлись граждане, которые на мои призывы в этой заметке не использовать без острой надобности shared_ptr там, где вполне можно обойтись scoped_ptr, которые стали утверждать, что это сильно сложно, на это можно забить, и везде использовать только один, самый универсальный, вид умного указателя.

Честно говоря, сам себе я кажусь чуваком с четырехзвездочными погонами, но кое-какие вещи я проговорю еще раз.

При написании кода есть очень много правил, которые абсолютно никак не влияют на работу программы, но могут очень существенно влиять на трудности, возникающие при очень неблагодарном процессе чтения и понимания кода. Почти во всех языках программирования, к примеру, есть практика строго придерживаться какого-то единого стиля форматирования исходного текста.

Если мы говорим про C++, то я бы обратил внимание на мелочи, вроде маркера "const" рядом с методом объекта, или на "static" методы. Тема scoped_ptr vs shared_ptr совершенно из этой серии, когда не использование максимально жесткого варианта (а const и static это фактически ограничители) при написания кода, никак не влияет на его работу. Но иногда существенно помогает при его чтении.

Моя практика показывает, что в 90+% случаев вполне хватает "жесткого" варианта, т.е. scoped_ptr (можно исходить хотя бы из того, что подавляющее большинство всех типов в программе -- сущности, для которых запрещено копирование). Когда я вижу поле типа scoped_ptr я сразу понимаю время жизни этого объекта. Когда я вижу поле с shared_ptr -- я не могу сказать ничего. Поэтому этот вид указателя остается только для нетривиальных случаев, когда владение объектом сложно, непредсказуемо и определяется runtime поведением программы.

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

Такие вот пироги, можете продолжать говнокодить дальше.

No comments:

Post a Comment