Щось, чому я останнім часом часто зустрічаюсь, - це оголошення 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
і зберігається у векторі. - Це дозволяє змінювати реалізацію - тобто якщо Лорему потрібно було змінити, щоб настирливо посилатись (через
boost::intrusive_ptr
) на наступному етапі, то це мало б мінімальний вплив на код. - Я думаю, що це виглядає «красивіше» і його, мабуть, легше читати.
Причини, які мені не подобаються:
- Іноді виникають проблеми із залежностями - якщо ви хочете вставити, скажімо,
Lorem::vector
в інший клас, але потрібно лише (або хочете) переслати оголошення Lorem (на відміну від введення залежності у його заголовок), тоді вам доведеться використовувати явні типи (наприклад,boost::shared_ptr<Lorem>
а неLorem::ptr
), що трохи непослідовно. - Це може бути не дуже часто, а значить, важче зрозуміти?
Я намагаюся бути об'єктивним зі своїм стилем кодування, тому було б добре отримати деякі інші думки щодо нього, щоб я міг трохи розсікати своє мислення.