Что-то, что я часто делал в последнее время, это объявление 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), что немного непоследовательно. - Это может быть не очень распространено и, следовательно, сложнее понять?
Я стараюсь быть объективным с моим стилем кодирования, поэтому было бы неплохо получить некоторые другие мнения по этому поводу, чтобы немного осмыслить свое мышление.