Coś, co ostatnio często robię, to deklarowanie typów definicji odpowiednich dla określonej klasy wewnątrz tej klasy, tj
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
Te typy są następnie używane w innym miejscu w kodzie:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Powody, dla których to lubię:
- Zmniejsza hałas wprowadzany przez szablony klas,
std::vector<Lorem>
staje sięLorem::vector
itp. - Służy jako deklaracja intencji - w powyższym przykładzie klasa Lorem ma być odniesieniem liczonym przez
boost::shared_ptr
i przechowywanym w wektorze. - Pozwala to na zmianę implementacji - tj. Gdyby Lorem wymagał zmiany, aby inwazyjne zliczanie referencji (przez
boost::intrusive_ptr
) na późniejszym etapie, miałoby to minimalny wpływ na kod. - Myślę, że wygląda „ładniej” i jest prawdopodobnie łatwiejszy do odczytania.
Powody, dla których tego nie lubię:
- Czasami występują problemy z zależnościami - jeśli chcesz osadzić, powiedzmy, a
Lorem::vector
w innej klasie, ale potrzebujesz (lub chcesz) przekazać dalej deklarację Lorem (w przeciwieństwie do wprowadzania zależności od jej pliku nagłówkowego), w końcu będziesz musiał użyć jawne typy (np.boost::shared_ptr<Lorem>
zamiastLorem::ptr
), co jest trochę niespójne. - Może nie jest to zbyt częste i przez to trudniejsze do zrozumienia?
Staram się być obiektywny w swoim stylu kodowania, więc dobrze byłoby poznać inne opinie na jego temat, abym mógł trochę przeanalizować swoje myślenie.