Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Libor 10. 04. 2016, 19:17:37

Název: std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: Libor 10. 04. 2016, 19:17:37
Zdravím c++ zkušené.

Co si myslíte, že je vhodnější? Mám metodu parsující konfiguraci z XML, je to napsané jako 180 if else na QString, tak jak s léty přibývaly požadavky na danou komponentu (Widget). Funkční bloky jsou tak řádku až 5 douhé. Celé mi to přijde nepřehledné a QtCreator v tak hlubokém zahnízdění nevidí použití proměnných. (Limit je 92) Také máme v coding style limit 40 řádek na fci a 500 na soubor. Má smysl to celé předělávat na QMap<QString, std::function>? Nebo je to jedno? Co s takovou 900 řádkovou obludou? Ještě doplním, že se widget inicializuje 3x. Rychlost startu není problém.
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: ja 10. 04. 2016, 19:52:18
ak robis nieco dolezite, pre seba alebo chces ulahcit maitainerovi daj tam tie  ify

ak si plateny od hodiny alebo nebodaj od poctu opravenych chyb, nevahaj a pouzi tu zlozitejsiu variantu. budes za borca jediny schopny to pochopit a v kratkom case to opravit.
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: Franta <xkucf03/> 10. 04. 2016, 19:53:28
Neexistuje pro C++ něco jako je JAXB v Javě? (deklarativní obousměrné mapování mezi objekty a XML)
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: Cyr 10. 04. 2016, 20:17:07
Osobně bych doporučil #define - bude to přehlednější než řešení s mapou a udržovatelnější než řešení s ručně psanýma ifama.

Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: bjarne 10. 04. 2016, 20:55:15
Muzes to udelat treba podobne jak syntaktickou analyzu shora dolu.
-
Takovy pseudokod:

Kód: [Vybrat]
XmlNode* currentNode = nullptr;

void readNextNode() {
currentNode = ....
}

void parseTopLevel() {
readNextNode();
if (elementName == "widget") parseWidget(new Widget());
else {
//error
}
}

Widget* widget parseWidget(Widget* widget) {
//zpracujes atributy
readNextNode();
if (elementName == "layout") {
widget.setLayout(parseLayout(newLayout()))
}

Layout* parseLayout(Layout* layout) {
....
}



Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: čumil 10. 04. 2016, 20:59:17
Omg 900 řádků ifu, jsi na hlavu? Kopni tam tu mapu.

A řešení pomocí preprocesoru by taky zasloužilo dostat přes tlamu.
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: Libor 10. 04. 2016, 21:01:50
Osobně bych doporučil #define - bude to přehlednější než řešení s mapou a udržovatelnější než řešení s ručně psanýma ifama.

Jak #define? Muzes, prosim, napsat kratky priklad? Tech 180 stringu jsou ruzne parametry, jako font, frekvence blikani atp.
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: pavell 10. 04. 2016, 21:04:25
Vyhnul bych se použití maker, jak tu někdo před tím doporučil. Pro použití makra musí být opodstatnění, tady ho nespatřuji.
V použití std::map neshledávám nic špatného, používáme to také, asi takhle:

Kód: [Vybrat]
typedef std::function< void ( int ) >                  Callback;
typedef std::map< const std::string, const Callback >  CallbackMap;

const CallbackMap callbacks{
    { "stats",  std::bind( &stats, _1 ) },
    { "bla",    std::bind( &bla,   _1 ) }
};

/* volani */
const CallbackMap::const_iterator it = callbacks.find( cmd );

if( it != callbacks.end() )
{
     it->second( arg );
}
Název: Re:std::map<std::string, std::function>; nebo řada ifů?
Přispěvatel: Libor 10. 04. 2016, 21:10:17
Omg 900 řádků ifu, jsi na hlavu? Kopni tam tu mapu.

A řešení pomocí preprocesoru by taky zasloužilo dostat přes tlamu.

Na hlavu jsem, kdyz ve zbytku kodu hledam chyby a QtCreator mi nenachazi pouziti atributu a metod. Je tam jeste jedna pekna 1000 radkova paint fce.

Takze myslis, v kontruktoru si udelat mapu na lambdy?