Tworzenie aliasów typów a nazewnictwo

0

Jakie stosujecie nazewnictwo w sytuacji kiedy tworzycie alias dla jakiegoś bardziej złożonego typu?

Załóżmy, że chcemy stworzyć alias dla typu shared_ptr<my_class>. Jak wyglądałby wasz alias?

  1. typedef shared_ptr<my_class> my_class_ptr - tak?
  2. typedef shared_ptr<my_class> my_class_shared_ptr - tak?
  3. Inaczej?

Posiadacie jakieś własne konwencje nazewnictwa? Jeżeli tak to jakie?

Dodam, że wiem o możliwości tworzenia aliasów za pomocą słowa kluczowego using. W powyższych przykładach użyłem słowa kluczowego typedef aby dotrzeć zarówno do osób programujących w starym jak i nowym standardzie.

1
  1. Między wierszami można doczytać się using namespace std - lepiej tego unikać https://stackoverflow.com/a/1452738/1387438
  2. jeśli std::shraed_ptr to C++11, czyli jednak możesz używać using my_class_ptr =...., chyba że używasz boost::shared_ptr, ale wtedy using namespace boost jest nie do przyjęcia, albo jest to std::tr1::shared_ptr ale to ta sama sytuacja co boost.
  3. To tylko kwestia konwencji, najważniejsze, żeby było konsekwentnie (wszędzie tak samo). Sam preferuję wersję 1. ale w camel case.
0
MarekR22 napisał(a):
  1. Między wierszami można doczytać się using namespace std - lepiej tego unikać https://stackoverflow.com/a/1452738/1387438

W typowym kodzie produkcyjnym jak najbardziej masz racje. Pominąłem przestrzenie nazw raczej na potrzeby posta. Mimo wszystko słuszna uwaga.

  1. jeśli std::shraed_ptr to C++11, czyli jednak możesz używać using my_class_ptr =...., chyba że używasz boost::shared_ptr, ale wtedy using namespace boost jest nie do przyjęcia, albo jest to std::tr1::shared_ptr ale to ta sama sytuacja co boost.

Mogę i nawet chcę. Napisałem celowo typedef ponieważ stwierdziłem, że aliasy tworzone za pomocą słowa kluczowego typedef są bardziej znane niż aliasy tworzone za pomocą słowa kluczowego using. Ktoś kto programował / programuje w C++98 + boost może nie wiedzieć o tworzeniu aliasów za pomocą using. Z drugiej strony Ci co o tym wiedzą, zazwyczaj wiedzą też o typedef. Chciałem jedynie dotrzeć do większej grupy osób.

  1. To tylko kwestia konwencji, najważniejsze, żeby było konsekwentnie (wszędzie tak samo). Sam preferuję wersję 1. ale w camel case.

OK czyli rozumiem, że wolisz ukryć typ inteligentnego wskaźnika? Pytanie co w sytuacji kiedy chciałbyś pracować raz na std::unique_ptr a raz na std::shared_ptr?

2

Akurat shared pointerom ja bym aliasów nie nadawał w ogóle. Wg mnie ważniejsze jest, żeby osoba czytająca później mój kod bez zastanowienia wiedziała, czym są typy, których używam, niż żeby ten kod się trochę szybciej pisało. Widząc std::shared_ptr<MyClass> myClass; w czyimś kodzie, od razu wiem czym jest myClass. Aliasy typu my_class_ptr myClass; imho tylko utrudniają analizę kodu, bo dochodzi nam jedna więcej czynność do wykonania, czyli tłumaczenie sobie w pamięci aliasów na typy, które się pod nimi kryją.

3

Osobiście nie lubię nadawać shared pointerom nazw z "ptr" albo "pointer" w nazwie (za wyjątkiem traitsów typu Template<T>::pointer) - przecież wtedy lepiej po prostu pokazać rzeczywisty typ.

Natomiast widzę sens w nadawaniu tego typu nazw aby ukryć implementację danego typu w jakimś API - np. using Request = std::shared_ptr<HTTP::ServerRequest>;, przy czym uważam to za dość rzadki przypadek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1