Jak velká by měla main () Be, v C?

hlasů
12

Učím trochu C během víkendu, a začal jsem se dívat na jiné programy napsané v jazyce C. I skončili při pohledu na GNU netcat v domnění, že by to byl dobrý příklad.

Byl jsem trochu v šoku vidět 600 řádek main()funkci . Je to normální? Pokud je to normální, je to považováno za dobré C kódování praktiky?

Položena 28/12/2009 v 01:04
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
22

Tam je citát amerického prezidenta (Lincoln?), Který byl požádán, jak dlouho mužovy nohy by měla být. „Dost dlouho se dostat z jeho těla k zemi,“ řekl.

Dostat se zpátky k tématu:

Autoři knihy jako „čistý kód“, inzerovat, že každá funkce dělat jen jednu věc (to je hrubě zjednodušené já zde), takže teoreticky vaše main()by měl možná volat inicializační funkce a pak další funkce orchestrating práci aplikace, a to je vše.

V praxi, mnoho programátorů najít spoustu drobných funkcí dráždivé. Možná užitečnější metrika je, že funkce by se obvykle vejde na jednu obrazovku, i kdyby jen proto, aby bylo lépe vidět a přemýšlet o tom.

Pokud program je složitá a většina z jeho funkcí je main(), někdo neudělal slušnou práci prolomit problém dolů. V podstatě byste měli usilovat o možnosti správy, srozumitelnost a čitelnost. Tam je obvykle žádný dobrý důvod pro hlavní () být obrovský.

Odpovězeno 28/12/2009 v 01:10
zdroj uživatelem

hlasů
7

Často zjišťuji, na určité druhy aplikací, které main () má stovky řádků inicializace následuje asi 20 řádků na nejvyšší úrovni vedení.

Je to můj zvyk není rozbít funkce, dokud Musím jim dvakrát volat. To někdy vede k mi psát funkce s 300 řádky, ale jakmile vidím stejný blok vyskytují dvakrát zlomím, že zablokovat.

Pokud jde o hlavní, inicializační rutiny jsou často kdysi tak 600 linek nezní nepřiměřené.

Odpovězeno 28/12/2009 v 01:32
zdroj uživatelem

hlasů
4

Limit je okno editor ...

Heh, to je strašné, ale já jsem viděl horší. Viděl jsem velké multi-tisíc řádku Fortran programy bez podprogramů vůbec.

Domnívám se, že odpověď zní: je třeba přizpůsobit v okně editoru a měl by mít nízkou složitost cyclomatic .

Je-li hlavní program je jen série volání funkcí nebo výpočty, pak myslím, že tak dlouho, jak to nezbytné, může být, a to by mohlo mít výjimku z editor okna omezení. Dokonce i tehdy, tak bych být trochu překvapen, že tam nebyl přirozený způsob, jak extrahovat smysluplné jednotlivé metody.

Ale jestli to je testování a větvení a returning a breaking a continueing pak to musí být rozdělen do jednotlivých individuálně testovaných funkčních prvků.

Odpovězeno 28/12/2009 v 07:18
zdroj uživatelem

hlasů
4

Bez ohledu na jazyk, tak bych se pokusila omezit metodu podprogramu zhruba to, co je vidět na jedné straně kódem, a extrahovat funkčnost podprogramů všude tam, kde je to možné.

600 řádků Zní to dost dlouho na každé implementaci. Možná, že tam je nějaký naléhavý důvod wrt. předávání argumenty kolem a jasnost (já jsem se podíval na příklad, že jste zaslali), ale zní to, že na druhém konci toho, co se běžně praktikuje, a mělo by být možné rozdělit tento úkol.

Mám podezření, že to byl vyvinut kontinuální kumulativní přidávání funkcí v průběhu let, a nikdo se zastavil a refactored to být čitelnější / udržovatelná. Pokud nejsou žádné jednotkové testy pro to (a podle mých zkušeností main()metody nejsou často dostanou písemné testy - z jakéhokoli důvodu), pak to bude srozumitelný neochotu ji refaktorovat.

Odpovězeno 28/12/2009 v 01:09
zdroj uživatelem

hlasů
3

600 linka Hlavní je trochu výstražnou. Ale pokud se na to podíváte, a nevidí žádný způsob, jak prolomit to do jiných menší kusy, než jak toho dosáhnout.

void the_first_part_of_main(args...);
void the_second_part_of_main(args...);
...

main()
{
   the_first_part_of_main();
   the_second_part_of_main();
   ...
}

Měli byste ho nechat na pokoji.

Odpovězeno 28/12/2009 v 01:45
zdroj uživatelem

hlasů
3

Doufejme, že se chystáte na refaktorování. To vypadá velmi drsné.

  443   while (optind < argc) {
  444     const char *get_argv = argv[optind++];
  445     char *q, *parse = strdup(get_argv);
  446     int port_lo = 0, port_hi = 65535;
  447     nc_port_t port_tmp;
  448 
  449     if (!(q = strchr(parse, '-')))    /* simple number? */
  450       q = strchr(parse, ':');     /* try with the other separator */
  451 
  452     if (!q) {
  453       if (netcat_getport(&port_tmp, parse, 0))
  454   netcat_ports_insert(old_flag, port_tmp.num, port_tmp.num);
  455       else
  456   goto got_err;
  457     }
  458     else {        /* could be in the forms: N1-N2, -N2, N1- */
  459       *q++ = 0;
  460       if (*parse) {
  461   if (netcat_getport(&port_tmp, parse, 0))
  462     port_lo = port_tmp.num;
  463   else
  464     goto got_err;
  465       }
  466       if (*q) {
  467   if (netcat_getport(&port_tmp, q, 0))
  468     port_hi = port_tmp.num;
  469   else
  470     goto got_err;
  471       }
  472       if (!*parse && !*q)     /* don't accept the form '-' */
  473   goto got_err;
  474 
  475       netcat_ports_insert(old_flag, port_lo, port_hi);
  476     }
  477 
  478     free(parse);
  479     continue;
  480 
  481  got_err:
  482     free(parse);
  483     ncprint(NCPRINT_ERROR, _("Invalid port specification: %s"), get_argv);
  484     exit(EXIT_FAILURE);
  485   }
Odpovězeno 28/12/2009 v 01:24
zdroj uživatelem

hlasů
2

Podle některých norem funkcí 600 řádek každého druhu je špatný nápad, ale není tam žádný důvod, proč hlavní by mělo být zacházeno jinak, než na jakoukoli jinou funkci.

Jediný důvod, proč mě napadá taková situace, která vzniká je místo, kde je program rychle rozvíjela, a jak to roste nikdo neobtěžuje rozdělit ji do více logických jednotek.

Odpovězeno 28/12/2009 v 01:11
zdroj uživatelem

hlasů
1

Téměř všechny funkce 600 řádky, které jsem viděl byly také blbě napsal. To nemusí být tak.

Nicméně v těchto případech šlo jen o selhání programátor představit nějaký oddálený pohled, a dát smysluplné názvy sekcí - jak vysoké úrovně (podobně Initialize ()) a low-level (něco, co má společného 3 -line vzor a schová ji pod jedním názvem, s parametry).

V případech krajní hloupost, oni byli optimalizaci výkonu funkce volání, pokud to nebylo nutné.

Odpovězeno 28/12/2009 v 13:34
zdroj uživatelem

hlasů
1

Můj osobní kódování styl je vyzkoušet a používat pouze hlavní funkci pro argument příkazového řádku analýzu a jakýkoliv inicializace velké vstupenek, že program potřebuje.

Odpovězeno 28/12/2009 v 02:05
zdroj uživatelem

hlasů
1

Řekl bych, že vaše rutiny by měla být tak dlouhá / krátká, jak to nezbytné, aby byly účinné a spolehlivé a automaticky testuje. 600-prohlášení rutina má pravděpodobně více cest přes něj a kombinací rutin mohl dostat velmi velké velmi rychle. Snažím se rozebrat funkce do someting, díky nimž je snadno čitelný. Funkce jsou buď „funkční“ nebo „příběh.“ Celou tu dobu, včetně jednotkové testy.

Odpovězeno 28/12/2009 v 01:47
zdroj uživatelem

hlasů
1

Co nejkratší. Obvykle, když je tu operaci mohu přiřadit jméno, vytvořit novou metodu pro něj.

Odpovězeno 28/12/2009 v 01:12
zdroj uživatelem

hlasů
0

main(), Stejně jako jakékoliv funkce, by měla být přesně tak velký, jak to musí být. „Když to musí být“ se bude značně lišit v závislosti na tom, co je třeba udělat. Z uvedeného vyplývá, že by nemělo mít být víc než pár stovek linek ve většině případů. 600 linek je trochu na statný straně, a některé, které by mohly / měly být pravděpodobně přepracován do samostatných funkcí.

Pro extrémní příklad, jeden tým jsem byl měl za úkol urychlit nějaký kód pro pohon 3D displej. Kód byl původně napsán wirehead, který byl očividně naučil programovat pomocí staré školy FORTRAN; main()bylo přes pět tisíc řádků kódu, s náhodnými kousky #includetu a tam ed. Namísto lámání kód ven do funkce, byl by prostě větví do podprogramu v rámci main()via goto(někde mezi 13 a 15 příkazem GOTOS, větvení oběma směry zdánlivě náhodně). Jako první krok jsme se prostě otočil na úrovni 1 optimalizaci; kompilátor okamžitě pohltila všechny dostupné paměti a odkládacího prostoru a zpanikařila jádro. Kód tak křehké, že jsme nemohli dělat žádné změny, aniž by byla poškozena něco. Nakonec jsme řekli zákazníkovi měli dvě možnosti: nám umožní přepsat celý systém od začátku, nebo koupit rychlejší hardware.

Koupili rychlejší hardware.

Odpovězeno 28/12/2009 v 15:22
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more