Re: C++ Makro, template, nebo něco jiného?

Pavel Hudeček edizon na seznam.cz
Pondělí Září 25 14:19:23 CEST 2023


Bohužel se jedná o úpravy již existujícího, poměrně rozsáhlého softwaru. 
Některé metody a atributy jsou společné, ty zůstávají v nadřazené třídě. 
Jiné nikoli a jsou definovány zvlášť ve svých, případně je některé mají 
a jiné ne. No a tam kde nejsou sploečné, vypadají funkce takto.

Na mě právě teď mimo jiné je, vytvořit větší počet takových funkcí, jako 
náhradu za sady funkcí po 2, 3 nebo více, kdy v názvu je druh zařízení, 
což je relikt  z doby, kdy si kdosi myslel, že počet druhů bude 1 a pak 
že 2:-)

PH

Dne 25.09.2023 v 13:36 Pablo na xpablo.cz napsal(a):
> DD,
> myslim, ze jste mel spis napsat, co je cilem. Takhle mame "cistit" 
> reseni, ktere mohlo byt udelane jinak, ale co tam vidim ja:
> 1. zbytecne vytvarite ukazatele na jednotlive tridy zarizeni (pokud ta 
> abbrev dev znamena device), kdyz vzdycky budete potrebovat jen jeden a 
> pri rozsirovani pomoci ifdef budete muset ifdef psat na dvou mistech. 
> Doporucuji v kazdem case DEV... udelat lokalni ukazatel napr. takto 
> auto devT2 = dynamic_cast<IDevTyp2*>(dev);
> 2. nejsem si jisty, jestli by nebyl lepsi pristup udelat predka, tridu 
> IDev tak, aby obsahoval bud public prvek IDevTyp, nebo napsat getter 
> na IDevTyp - zbavite se tim toho mambo-jambo se zjistovanim typu zarizeni
> 3. kdyz udelate virtualni prototyp funkce lastError(), tak se cela 
> saskarna if... gLastError = .... v kazdem case zjednodusi na jednu 
> jedinou podminku pred return rc; nejak takhle:
> if (rc)
>   gLastError = devt->lastError();
> Otazkou ale je, jestli nebude lepsi mit v tride IDev virtualni metodu 
> na nastaveni tech parametru a nedelat ji pure virtual - pak sice bude 
> v kazdem potomkovi, ale prepsana bude jen tam, kde bude skutecne neco 
> delat.
> -- 
> Pavel Brychta
> http://www.xpablo.cz
>
> ---------- Původní e-mail ----------
> Od: Pavel Hudeček <edizon na seznam.cz>
> Komu: hw-list na list.hw.cz
> Datum: 25. 9. 2023 13:06:50
> Předmět: C++ Makro, template, nebo něco jiného?
>
>
>     Dobrý den všem,
>     mějme funkci jako
>
>     int doSomeWithDev(unsigned deviceIndex, int param)
>     {
>         std::vector<IDev*> devs = gDevs->devices();
>         IDev* dev = devs[deviceIndex];
>         IDevTyp* devt = dynamic_cast<IDevTyp*>(dev);
>         if (!devt)
>             return UNEXPECTED_ERROR;
>         int rc;
>         IDevTyp2* devT2;
>         IDevTyp3* devT3;
>     #ifdef IDevTyp4
>         IDevTyp4* devT4;
>     #endif
>
>         switch(devt->deviceType()) {
>             case DEVTYPE2:
>                 tevT2 = dynamic_cast<IDevTyp2*>(dev);
>                 if (!tevT2)
>                     return UNEXPECTED_ERROR;
>                 rc = tevT2->setSomeParam(param);
>                 if (rc){
>                     gLastError = tevT2->lastError();
>                 }
>                 break;
>             case DEVTYPE3:
>                 tevT3 = dynamic_cast<IDevTyp3*>(dev);
>                 if (!tevT3)
>                     return UNEXPECTED_ERROR;
>                 rc = tevT3->setSomeParam(param);
>                 if (rc){
>                     gLastError = tevT3->lastError();
>                 }
>                 break;
>     #ifdef IDevTyp4
>             case DEVTYPE4:
>                 tevT4 = dynamic_cast<IDevTyp4*>(dev);
>                 if (!tevT4)
>                     return UNEXPECTED_ERROR;
>                 rc = tevT4->setSomeParam(param);
>                 if (rc<0) {
>                     gLastError = tevT4->lastError();
>                 }
>                 break;
>     #endif
>             default:
>                 gLastError = "Unexpected device type";
>                 rc = UNEXPECTED_ERROR;
>                 break;
>         }
>         return rc;
>     }
>
>     A takových má být mnoho, s odlišnostmi jen v tom, co bude místo
>     ->setSomeParam(param);
>     a kolik to bude mít parametrů.
>
>     Chtěl bych to nějak zjednodušit, aby ty funkce nebyly tak dlouhý.
>     Nějaké nápady?
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230925/8d9f810e/attachment.htm>


Další informace o konferenci Hw-list