Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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.
-
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.
-
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 );
}
-
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?