std::map<std::string, std::function>; nebo řada ifů?

Libor

std::map<std::string, std::function>; nebo řada ifů?
« kdy: 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.


ja

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #1 kdy: 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.

Franta <xkucf03/>

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #2 kdy: 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)

Cyr

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #3 kdy: 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.


bjarne

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #4 kdy: 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) {
....
}





čumil

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #5 kdy: 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.

Libor

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #6 kdy: 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.

pavell

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #7 kdy: 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 );
}

Libor

Re:std::map<std::string, std::function>; nebo řada ifů?
« Odpověď #8 kdy: 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?