Что-то, что я часто делал в последнее время, это объявление typedefs, относящихся к определенному классу внутри этого класса, т.е.
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
) на более позднем этапе, это будет иметь минимальное влияние на код. - Я думаю, что он выглядит "красивее" и, возможно, легче читать.
Причины, по которым мне это не нравится:
- Иногда возникают проблемы с зависимостями - если вы хотите вставить, скажем,
Lorem::vector
в другой класс, но нужно (или хотите) перенаправить объявление Lorem (в отличие от введения зависимости от его заголовочного файла), тогда вы в конечном итоге придется использовать явные типы (например,boost::shared_ptr<Lorem>
, а неLorem::ptr
), что немного непоследовательно. - Это может быть не очень распространено и, следовательно, сложнее понять?
Я стараюсь быть объективным с моим стилем кодирования, поэтому было бы неплохо получить некоторые другие мнения по этому поводу, чтобы немного осмыслить свое мышление.