Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Bssldr
HV kasutaja
liitunud: 05.12.2009
|
28.06.2011 12:57:02
C++ shared_ptr typedef? |
|
|
Kasutan uues projektis std::shared_ptr'it ja mõtlen, mis oleks hea disain - pidevalt std::shared_ptr<Class> kirjutada on pisut tüütu.
Hetkel olen olukorra lahendanud järgmiselt.
class Class
{
public:
typedef std::shared_ptr<Class> Ptr;
typedef std::shared_ptr<const Class> CPtr;
};
|
On kellelgi elegantsemaid variante välja pakkuda?
|
|
Kommentaarid: 9 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
28.06.2011 13:34:32
|
|
|
IMHO võiks pointerite tüüpe mitte ümber nimetada (ega ka muude standardsete asjade). Väga vaevaline on lugeda koodi, mis defineerib tüübid ümber (v.a. mõned elementaarsed). Kui sellega veel interfeissida tuleb, siis läheb päris põrgu lahti.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
siimannuk
HV vaatleja
liitunud: 07.06.2003
|
28.06.2011 13:45:00
|
|
|
Üpris levinud kirjaviis on ka (mida ise kasutan):
class MyClass
{
...
};
typedef std::shared_ptr<MyClass> MyClassPtr;
|
Minu arvates on "Ptr" lõpuga tüübinimetus *suhteliselt* üheselt mõistetav...
|
|
tagasi üles |
|
 |
Bssldr
HV kasutaja
liitunud: 05.12.2009
|
30.06.2011 22:03:02
|
|
|
Küsin veel teema jätkuks, et kui laialdaselt juba C++0x võimalusi kasutatakse, näiteks ettevõtetes? Ise kasutan peaaegu kõiki võimalusi, mida VS2010 toetab. Tuleb mainida, et shared_ptr on ikka väga hea - exceptionite viskamine/püüdmine osutub nüüd isegi kasulikuks ja try bloki sees memory leake ei teki. Samuti teevad lambdad koodi kirjutamise palju mugavamaks.
|
|
Kommentaarid: 9 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
01.07.2011 14:55:37
|
|
|
No shared_ptr on juba suhteliselt vana asi meil oli see kasutused alates Visual studio 2005-ga. lambda asemel sai kasutatud boost.bind. Kuna C++0x pole täielikult veel supporditud ja näiteks VS 2010 on suht uus IDE tasuks natuke oodata kuni nad enamus bugid ära parandavad. SP1 on väljas küll aga ikkagi päris palju bugisid sees.
Kirjapildi poolest nõustun siimannukiga.
|
|
tagasi üles |
|
 |
matik
HV kasutaja
liitunud: 28.05.2008
|
04.07.2011 13:18:28
|
|
|
Supiplex kirjutas: |
IMHO võiks pointerite tüüpe mitte ümber nimetada (ega ka muude standardsete asjade). Väga vaevaline on lugeda koodi, mis defineerib tüübid ümber (v.a. mõned elementaarsed). Kui sellega veel interfeissida tuleb, siis läheb päris põrgu lahti. |
Umh, sellest mõttekäigust ei saanud nagu küll aru.
Kumb on loetavam ja selgem?
shared_ptr<Class> p = my_map[key];
|
või
Class::Ptr p = my_map[key];
|
IMHO on teine ikka kindlalt selgem Ptr tüüp konkreetse Classi jaoks, samas saab typedef-i abil shared_ptr implementatsiooni vajadusel kiirelt ka vahetada, või defineerida kasvõi "typedef Class * Ptr;" ning ei pea tervet koodi läbi käima ja kõiki kohti muutma...
"Interfeissimiseks" teiste moodulitega on olemas API ning API's mõistagi kasutatakse nö "highest common denominator" tüüpe ja võibolla plain pointereid - mis ei tähenda, et klassid sisemiselt ei võiks shared_ptr kasutada
|
|
tagasi üles |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
05.07.2011 11:55:00
|
|
|
typedef boost::shared_ptr<MyClass> MyClassPtr;
typedef boost::shared_ptr<MyClass const> MyClassConstPtr;
....
MyClassPtr ptr(myMap[MyKey]);
...
for (MyMap::iterator it = myMap.begin(); it != myMap.end(); ++it)
{
MyClassPtr ptr = *it;
}
for (MyMap::const_iterator = myMap.begin(); it != myMap.end(); ++it)
{
MyClassConstPtr = *it;
}
|
Kui tahad panna erinevaid mooduleid suhtlema siis Windowsil on väga hea asi nimega DCOM muidu kasutatakse ka suht palju omniORB ( CORBA ).
|
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
05.07.2011 12:08:52
|
|
|
matik kirjutas: |
Umh, sellest mõttekäigust ei saanud nagu küll aru.
Kumb on loetavam ja selgem?
shared_ptr<Class> p = my_map[key];
|
või
Class::Ptr p = my_map[key];
|
|
Loetavam ja selgem on see, millega sa harjunud oled. Minu jaoks on oluline et terad oleksid sõkaldest eraldatud, st oleks kaugelt peale vaadates näha mis on pointer ja mis on muutuja. Teisel juhul peab asjasse süüvima, esimesel juhul torkab kohe silma.
Klahvivajutusi vähendab küll, selles pole kahtlust.
tsitaat: |
IMHO on teine ikka kindlalt selgem Ptr tüüp konkreetse Classi jaoks, samas saab typedef-i abil shared_ptr implementatsiooni vajadusel kiirelt ka vahetada, või defineerida kasvõi "typedef Class * Ptr;" ning ei pea tervet koodi läbi käima ja kõiki kohti muutma... |
See argument kerkib alati esile. Jah saab tõesti vahetada, aga kas seda on vaja? Kui mitu korda sa oma karjääri jooksul oled pidanud sadades kohtades kasutusel olevat tüüpi ümber muutma? Pointeritüübid peaksid esimese paari koodirea kirjutamisel juba üsna kindlad olema.
tsitaat: |
"Interfeissimiseks" teiste moodulitega on olemas API ning API's mõistagi kasutatakse nö "highest common denominator" tüüpe ja võibolla plain pointereid - mis ei tähenda, et klassid sisemiselt ei võiks shared_ptr kasutada |
Rohkem kui ühe arendajaga projektis ei ole neid API-sid igal pool. Kui on vaja kõrvallauas kirjutatud moodulit kasutada, siis ei tee keegi selleks API-t.
Okei, objektipointerite ja teiste kasutaja tekitatud tüüpidega ei ole tegelikult suurt häda. Pigem tekib probleem kui on "unsigned" asemel tehtud "typedef unsigned int UINT" vms ja seda iga kuradi funktsiooni deklaratsioonis kasutatud.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
05.07.2011 13:13:08
|
|
|
Supiplex kirjutas: |
matik kirjutas: |
Umh, sellest mõttekäigust ei saanud nagu küll aru.
Kumb on loetavam ja selgem?
shared_ptr<Class> p = my_map[key];
|
või
Class::Ptr p = my_map[key];
|
|
Loetavam ja selgem on see, millega sa harjunud oled. Minu jaoks on oluline et terad oleksid sõkaldest eraldatud, st oleks kaugelt peale vaadates näha mis on pointer ja mis on muutuja. Teisel juhul peab asjasse süüvima, esimesel juhul torkab kohe silma.
Klahvivajutusi vähendab küll, selles pole kahtlust.
tsitaat: |
IMHO on teine ikka kindlalt selgem Ptr tüüp konkreetse Classi jaoks, samas saab typedef-i abil shared_ptr implementatsiooni vajadusel kiirelt ka vahetada, või defineerida kasvõi "typedef Class * Ptr;" ning ei pea tervet koodi läbi käima ja kõiki kohti muutma... |
See argument kerkib alati esile. Jah saab tõesti vahetada, aga kas seda on vaja? Kui mitu korda sa oma karjääri jooksul oled pidanud sadades kohtades kasutusel olevat tüüpi ümber muutma? Pointeritüübid peaksid esimese paari koodirea kirjutamisel juba üsna kindlad olema.
tsitaat: |
"Interfeissimiseks" teiste moodulitega on olemas API ning API's mõistagi kasutatakse nö "highest common denominator" tüüpe ja võibolla plain pointereid - mis ei tähenda, et klassid sisemiselt ei võiks shared_ptr kasutada |
Rohkem kui ühe arendajaga projektis ei ole neid API-sid igal pool. Kui on vaja kõrvallauas kirjutatud moodulit kasutada, siis ei tee keegi selleks API-t.
Okei, objektipointerite ja teiste kasutaja tekitatud tüüpidega ei ole tegelikult suurt häda. Pigem tekib probleem kui on "unsigned" asemel tehtud "typedef unsigned int UINT" vms ja seda iga kuradi funktsiooni deklaratsioonis kasutatud. |
Mis moodi peaks selline vahe nagu unsigned ja unsigned int midagi kottima, kui nii väga vaja,et täpselt byted samad siis tasuks võtta boost.integer header kasutusele. Üleüldse miks on vaja eraldi midagi typedefida, kui pole just tegemist complex objektiga ( vector, lsit, map, shared_ptr jne...).
|
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
05.07.2011 14:25:26
|
|
|
THNS kirjutas: |
kui nii väga vaja,et täpselt byted samad siis tasuks võtta boost.integer header kasutusele |
Pigem ikka kasutada standardlahendust stdint.h näol kui hakata taas mingeid ebavajalikke lisateeke projekti tirima.
Konkreetselt pointerite typedef'iga renamemisel erilist mõtet ei näe. Üldiselt peaks c++ koodi kirjutama selliselt, et pointereid eksisteeriks minimaalselt ning nood vähesed mis on võiks ka olla selgelt eristuvad muust kraamist.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
05.07.2011 15:51:06
|
|
|
Eks see ole igaühe enda asi kas ta defineerib oma tüübid ümber või mitte.
Minul teise koodi lugedes on igatahes lihtsam siis, kui on kasutatud ümber nimetamata standardseid tüüpe, tüübinimetusi ja keskkonnale omaseid tavasid. Asjad mis on ümber defineeritud suupärasemateks või lühemateks kurnavad asjatult niigi hõivatud lühimälu. Eks see toob ka veidi kibedust minu sõnadesse
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
05.07.2011 19:24:40
|
|
|
Tasub ikka küll kasutada boost.integer headerit kuna cstdint headeris on bugid sees mille boosti tegijad ära parandasid.
Ma ei ütleks et pointer halb asi on, ta on väga hea. Temaga tuleb osata lihtsalt ringi käia. Muidugi parem on kasutada reference (ohutum).
|
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
05.07.2011 19:30:28
|
|
|
THNS kirjutas: |
Tasub ikka küll kasutada boost.integer headerit kuna cstdint headeris on bugid sees mille boosti tegijad ära parandasid. |
Linki oskad jagada? Loeks huviga. Miskipärast viimase ~5a jooksul eri kompilaatorite-OS'idega pole probleeme täheldanud aga oleks vähemalt hea teada mida karta võiks.
THNS kirjutas: |
Ma ei ütleks et pointer halb asi on, ta on väga hea. Temaga tuleb osata lihtsalt ringi käia. Muidugi parem on kasutada reference (ohutum). |
Pigem oli mu jutu mõte, et praktiliselt alati on võimalik pointerite kasutamist vältida ilma programmi hapramaks või keerulisemaks ajamata. Smartpointerite kasutamine küll teeb asja mõnevõrra turvalisemaks kuid see ei tähenda, et peaks neid kõikjal hoogsalt pruukima hakkama kuna "asi on turvaline"
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
matik
HV kasutaja
liitunud: 28.05.2008
|
06.07.2011 18:20:11
|
|
|
Supiplex kirjutas: |
tsitaat: |
IMHO on teine ikka kindlalt selgem Ptr tüüp konkreetse Classi jaoks, samas saab typedef-i abil shared_ptr implementatsiooni vajadusel kiirelt ka vahetada, või defineerida kasvõi "typedef Class * Ptr;" ning ei pea tervet koodi läbi käima ja kõiki kohti muutma... |
See argument kerkib alati esile. Jah saab tõesti vahetada, aga kas seda on vaja? Kui mitu korda sa oma karjääri jooksul oled pidanud sadades kohtades kasutusel olevat tüüpi ümber muutma? Pointeritüübid peaksid esimese paari koodirea kirjutamisel juba üsna kindlad olema.
|
Ausaltöelda olen pidanud seda tegema sadu kordi, kui mitte rohkem. Mitte alati pointerid, vaid tõesti - kõiksugu muud andmetüübid. Ei oska ju tulevikku kunagi ette ennustada - alustad ikka kõige lihtsamast, algul on ming tüüp nt "int". tuleb paar parameetrit juurde, teed ta "structiks". Pärast juba täis-klassiks jne. Refactoringu tuleb elavas koodis ikka väga palju teha, et asi toimiks nii nagu vaja.
Mis sa arvad, miks STL-is ja paljudes muudes librades tehakse selliseid "tobedaid" typedef-e nagu
template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class map
{
public:
typedef _Key key_type;
typedef _Tp mapped_type;
typedef std::pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
typedef _Alloc allocator_type;
|
Eks ikka selleks, et vähendada kirjutamisvaeva kui ka hilisemaid ümberdefineerimismuudatusi... Selle kohta on pikk jutt õpikutes, kuidas vältida "cascade effecti", nii et iga pisimuudatus nõuab tuhandete koodiridade ümberkirjutamist.
Kui oled sadu kordi juba sama reha otsa astunud, siis lõpuks hakkad typedef-e kasutama
tsitaat: |
Rohkem kui ühe arendajaga projektis ei ole neid API-sid igal pool. Kui on vaja kõrvallauas kirjutatud moodulit kasutada, siis ei tee keegi selleks API-t.
|
Ja see on viga, et ei tee. Kuidas sa testid seda moodulit, kui tal pole API't ega virtual interface'i jne?
Kuidas sa isoleerid mooduli teistest moodulitest?
Või te ei testi koodi?
|
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
07.07.2011 01:26:43
|
|
|
Kontekstist. Mina isiklikult ei arenda STL-i. Ma arendan 95% oma ajast äriloogikat, mis pole ei taaskasutatav ega üldotstarbeline. Küll ta kas keeruline, puudulikult defineeritud või peab eilseks valmis olema. Tihti kõike korraga.
Selle käigus olen ma astunud paljude rehade otsa ja mulle ei meenu hetkel sellist mille puhul typedef päästaks. Küll olen ma hakanud hindama lihtsat, otsekohest koodi mis ei ennusta tulevikku ega ürita olla igaks juhuks modifitseeritav, laiendatav või taaskasutatav enam kui on nõutud - v.a. harvad juhud kus tulevik on juba tegemise ajal teada või harvad juhud kus tegemist on tõepoolest üldotstarbelise, taaskasutatava koodiga. Seniks aga on kõige lihtsam refaktoorida lihtsat koodi.
Ja jätkuvalt väidan ma, et kuna standardsete tüüpide ümberdefineerimine muudab koodi lugemise koormavaks ja API kasutamise keeruliseks, siis tuleks sellest hoiduda. Omaenda tüüpe käänab igaüks nii nagu soovib
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
matik
HV kasutaja
liitunud: 28.05.2008
|
09.07.2011 18:56:23
|
|
|
Supiplex kirjutas: |
Ja jätkuvalt väidan ma, et kuna standardsete tüüpide ümberdefineerimine muudab koodi lugemise koormavaks ja API kasutamise keeruliseks, siis tuleks sellest hoiduda. Omaenda tüüpe käänab igaüks nii nagu soovib  |
Hehe... ok, no offtopic kõvasti küll, aga shared_ptr pole "standardne tüüp".
Tõsi, päris "standardsete" tüüpide nagu int, char jne ümberdefineerimine on väga harva mõttekas.
Küsimus on selles, kas shared_ptr<Class> või nt std::vector<int> ümberdefineerimine on mõttekas?
typedefil on ju väga lihtne põhjendus - et koodi lugedes saaks sellest aru, ja et vältida suuremat tööd tulevikus, just tuleviku ennustamatuse pärast. Kui sul on mitu meetodit või funktsiooni a la
void modifitseeri(std::vector<int> &v) {...}
bool teemidagi(std::vector<int> &v) {...}
bool kontrolli_yle(std::vector<int> &v) {...}
|
siis loogilisem ja selgem on ju teha ikkagi pigem näiteks
// list data: RTT in milliseconds
typedef std::vector<int> tcp_ping_rtt_list;
void modifitseeri(tcp_ping_rtt_list &v) {...}
bool teemidagi(tcp_ping_rtt_list &v) {...}
bool kontrolli_yle(tcp_ping_rtt_list &v) {...}
|
et vältida N kohas koodi muutmist... võibolla on vaja muuta std::vector hoopis std::list-iks hiljem.. või on vaja muuta "int" tüüpi jne.
IMO koormavaks muudab see koodi lugemise ainult sel juhul, kui sa datatype nime kirjutad mõistetamatu, a la "vanaema_kalossid" vms, kui sa kirjutad ikka normaalse nime a la "tcp_ping_rtt_list" siis saab ju aru, mida mingi vector endast kujutab; sealjuures saab paremini aru kui parameetrite listis oleks "std::vector<int>", eriti kui koguaeg on kiire ning kui keegi sinu koodi loeb 2 aasta pärast (kasvõi sa ise).
|
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
12.07.2011 14:43:52
|
|
|
Okei, sinu näide on täiesti mõistlik ja mul pole põhjust sellele vastu vaielda. Aitab kah minu mölast
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
Liuskur
HV kasutaja

liitunud: 07.12.2005
|
05.09.2011 14:17:38
|
|
|
Ho Ho kirjutas: |
THNS kirjutas: |
kui nii väga vaja,et täpselt byted samad siis tasuks võtta boost.integer header kasutusele |
Pigem ikka kasutada standardlahendust stdint.h näol kui hakata taas mingeid ebavajalikke lisateeke projekti tirima.
Konkreetselt pointerite typedef'iga renamemisel erilist mõtet ei näe. Üldiselt peaks c++ koodi kirjutama selliselt, et pointereid eksisteeriks minimaalselt ning nood vähesed mis on võiks ka olla selgelt eristuvad muust kraamist. |
Sinu postitus ajas samal ajal sitaks naerma, nutma kui ka viha tundma, et on olemas inimesi kes toodavad juurde võhiklikke ning väär arvamusi c++ programmeerijate seas.
Muideks kui rääkida programmeerimisest, siis rääkida programmidest mis on 50, 000 rida ja rohkem, alla selle on jah jumala pohhui millist sitta koodi sa sinna kirjutad.
1. Lisa teekide, eriti boost library lisamine on vägagi kasulik - sest seal on juba palju sinu eest tööd ära tehtud ja palju väga kasulikku tööd kusjuures. And you know what? STL on ka teek!
2. Pointerite, objektide ükskõik milline ümber typedefimine on alati kasulik, see lisab loetavust koodi, ümberdefineeritud nimed peavad olema selged, arusaadavad ning tähenduslikud.
3. Pointerid ja referencid on just põhilised asjad mida c++ koodis näha tuleb, sest mida sa muud nende asmele kasutad? pass by value lol? - mitmeid kordi aeglasem! Muidugi standard tüübid int, float jne. võiksid olla pass by value alati. Pealegi pointerid ja referencid võimaldavad head disaini, kui koguaeg kõike by value passida, läheks kood väga koledaks.
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
1 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
05.09.2011 15:05:48
|
|
|
Liuskur, sa vist ei süvenenud väga täpselt mu juttu
1) Loomulikult ei ole mõtet jalgratast taasleiutada kuid samas pole ka mõtet dubleerida asju läbi väliste teekide kui need juba su kompilaatoriga niigi kaasa tulevad. Kasutan ise tervet posu boosti nodi kuid ainult noid mida tõesti standardis kaasas pole seega pole mul ka midagi nende kasutamise vastu.
2) Selle koha pealt peame leppima eriarvamustele jäämisega. Peamine vastuolu on mul kuna olen näinud N+1 projekti kus sellega rämedalt üle pingutatakse ning ühed samad asjad eri kohtades eri nimedega ümber nimetatakse. Lisaks kui on mõistlikult namespacesid-klasse nimetatud siis valdavalt puudub vajadus nimede ümber defineerimiseks neist paremini aru saamiseks. Eks siis on loomulikult lihtsam kui oled programmi arendusega aegade algusest peale tegelenud. Kui on vaja kellegi teise projekt üle võtta ning see on taolisi typedef'e täis siis on seal navigeerimine parajalt piinarikas.
3) Ma rääkisin ainult pointeritest. (const) Referenced on igati head ning noid peaks ka valdavalt kasutama. Raw pointerite kasutamiseks ei näe ma ühtki mõjuvat põhjust, isegi smart pointereid saab valdavalt vältida.
Pointerite selgelt eristumise all pidasin silmas, et mitte teha typedef Foo* FooPtr stiilis pornot vaid pigem jättagi igale poole tärnid kuhu vaja et oleks kohe selgelt näha mis on pointer ja mis mitte.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Liuskur
HV kasutaja

liitunud: 07.12.2005
|
05.09.2011 16:34:38
|
|
|
Su vastust lugedes, tundub tõesti et ei süvenenud vist piisavalt.
Siiski:
Hea tava on jah mitte typedefida foo* fooPtr ega ka reference mitte, see kaotab läbinähtavust. Aga shared_ptr, auto_ptr jne tüübid typedefiks küll julgelt ära, projektil mil töötan äsja sai kuskil aasta tagasi just alles tehtud üks ports boosti shared_ptr typedefe mis nüüd ongi kujul FooPtr ja aitas loetavusele kaasa kõvasti.
Ühe ning sama asja ümbernimetamine erinevateks nimedeks võib olla vägagi kasulik loetavusel, eriti veel kui on vahetult koodis kasutusel näiteks mitmeid map-e, set-e, liste või mida iganes, mis on ühesugused aga erinevateks otstarveteks/andmeteks kasutusel. Kui pidevalt lugeda map<bla bla>::iterator vms või lihtsalt taolisi deklaratsioone, mis on erineva andmete hoidmiseks/töötlemiseks, siis läheb silme ees üsna kirjuks nende mapide tõttu ja jälgimisel on ekstra pingutust vaja, siis vaadata, mida parajasjagu too mapi iteratoriga või deklaratsiooniga tehakse, et teada saada milliseid andmeid nüüd kasutama hakatakse.
Typedefide asukoht peaks olema vastavalt vajadusele, kui klassile on mõistlik teha typedef, mis tegeleb ainult klassi member variablitega või ainult member funktsioonides, siis võiks ta olla klassi sees private deklaratsioonina. Kui aga klassile on mõistlik teha typedef mis on getter ja/või setter funktsioonide jaoks, võiks typedef olla klassi headeris aga klassist väljas, samas namespaces.
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
1 |
|
tagasi üles |
|
 |
|