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.
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.
Neexistuje pro C++ něco jako je JAXB v Javě? (deklarativní obousměrné mapování mezi objekty a XML)
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.
Muzes to udelat treba podobne jak syntaktickou analyzu shora dolu.
-
Takovy pseudokod:
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) {
....
}
Omg 900 řádků ifu, jsi na hlavu? Kopni tam tu mapu.
A řešení pomocí preprocesoru by taky zasloužilo dostat přes tlamu.
Citace od: Cyr 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.
Jak #define? Muzes, prosim, napsat kratky priklad? Tech 180 stringu jsou ruzne parametry, jako font, frekvence blikani atp.
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:
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 );
}
Citace od: čumil 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.
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?