Что-то, что я часто делал в последнее время, - это объявление typedef, относящихся к определенному классу внутри этого класса, т.е.
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
Эти типы затем используются в другом месте кода:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Причины, по которым мне это нравится:
- Это уменьшает шум, создаваемый шаблонами классов,
std::vector<Lorem>
становитсяLorem::vector
и т. Д. - Он служит заявлением о намерениях - в приведенном выше примере класс Lorem предназначен для подсчета ссылок
boost::shared_ptr
и сохранения в векторе. - Это позволяет изменить реализацию - то есть, если Lorem нужно было изменить для навязчивого подсчета ссылок (через
boost::intrusive_ptr
) на более позднем этапе, то это окажет минимальное влияние на код. - Я думаю, что он выглядит «красивее» и, возможно, его легче читать.
Причины, по которым мне это не нравится:
- Иногда возникают проблемы с зависимостями - если вы хотите встроить, скажем, a
Lorem::vector
в другой класс, но вам нужно (или вы хотите) только переслать объявление Lorem (в отличие от введения зависимости от его файла заголовка), тогда вам придется использовать явные типы (например,boost::shared_ptr<Lorem>
а неLorem::ptr
), что немного противоречиво. - Это может быть не очень распространено и, следовательно, труднее понять?
Я стараюсь быть объективным со своим стилем программирования, поэтому было бы неплохо узнать о нем другие мнения, чтобы я мог немного проанализировать свое мышление.