Programování permutací - Programming by permutation
Programování permutací, někdy nazývaný „programování náhodou“ nebo „programování podle pokusu“ nebo „brokovnice“, je přístup k vývoji softwaru, při kterém je programovací problém vyřešen iterativním provedením malých změn (obměny ) a testování každé změny, aby se zjistilo, zda se chová podle potřeby. Tento přístup se někdy zdá atraktivní, když programátor plně nerozumí kódu a věří, že jedna nebo více malých úprav může mít za následek správný kód.
Tato taktika není produktivní, pokud:
- Chybí snadno proveditelné automatizované regresní testy s významným pokrytím základny kódu:
- řada malých úprav může snadno zavést do kódu nové nezjištěné chyby, což povede k „řešení“, které je ještě méně správné než výchozí bod
- Bez Testovaný vývoj je zřídka možné empirickým testováním změřit, zda řešení bude fungovat pro všechny nebo významnou část příslušných případů
- Ne Systém pro správu verzí se používá (například GIT, Mercurial nebo SVN ) nebo se nepoužívá během iterací k resetování situace, kdy změna nemá žádný viditelný účinek
- k mnoha nesprávným začátkům a opravám obvykle dochází před dosažením uspokojivého koncového bodu
- v nejhorším případě může dojít k nenávratné ztrátě původního stavu kódu
Programování pomocí permutace poskytuje malou nebo žádnou jistotu o kvalitě vytvářeného kódu - je to pravý opak Formální ověření.
Programátoři jsou často nuceni programovat permutací, když API není dostatečně zdokumentováno. Tato nejasnost vede ostatní k kopírování a vkládání z referenčního kódu, o kterém se předpokládá, že je správný, ale byl sám napsán v důsledku programování permutací.
V některých případech, kdy programátor dokáže logicky vysvětlit, že právě jedna z malé sady variací musí fungovat, vede programování pomocí permutace ke správnému kódu (který lze následně ověřit) a zbytečně tak nemusí přemýšlet o dalších (nesprávných) variantách.
Příklad
Například následující ukázka kódu v C (určené k vyhledání a zkopírování řady číslic z většího řetězce) má několik problémů:
#zahrnout <stdio.h>#zahrnout <string.h>#zahrnout <ctype.h>int hlavní(prázdnota){ konst char* nárazník = „123abc“; char destinace[10]; int i = 0; int j = 0; int l = strlen(nárazník); zatímco (i < l) { -li (je číslice(nárazník[i])) { destinace[j++] = nárazník[i++]; } ++i; } destinace[j] = ' '; printf("% s", destinace);}
Za prvé nedává správnou odpověď. S daným počátečním řetězcem vytvoří výstup „13“, když je správná odpověď „123“. Programátor, který neuznává strukturální problémy, se může chopit jednoho tvrzení, když řekne „ach, je tu další přírůstek“. Řádek „++ i“ je odstraněn; ale testování kódu má za následek nekonečnou smyčku. „Jejda, chybný přírůstek.“ Bývalý příkaz se přidá zpět a řádek nad ním se změní, aby se odstranil přírůstek proměnné i:
-li (je číslice(nárazník[i])) { destinace[j++] = nárazník[i]; }
Testováním kódu nyní získáte správnou odpověď „123“. Programátor spokojeně povzdechne: „Tady, to se stalo. Všechno skončilo.“ Tento závěr potvrzuje další testování s různými dalšími vstupními řetězci.
Samozřejmě přetrvávají další problémy. Protože programátor si nedělá potíže s úplným porozuměním kódu, zůstává nerozpoznaný:
- Pokud vstup obsahuje několik čísel oddělených necifernými znaky, například „123ab456“, cíl obdrží všechny číslice spojené společně
- Pokud je vstupní řetězec větší než cílové pole, dojde k přetečení vyrovnávací paměti
- Pokud je vstupní řetězec delší než INT_MAX, chování není definováno, protože strlen () vrací hodnotu typu size_t, což je celé číslo bez znaménka a může být širší než int.
- Pokud je char typ se znaménkem a vstupní řetězec obsahuje znaky, které po celočíselné podpoře nejsou v rozsahu 0..UCHAR_MAX, má volání isdigit () nedefinované chování.
I když je řešení správné pro omezenou sadu vstupních řetězců, není zcela správné, a protože se programátor neobtěžoval porozumět kódu, chyby budou objeveny až v pozdější fázi testování, pokud vůbec.
Také známý jako „Pokus a chyba“, „Generovat a testovat“, „Poke and Hope“,[1] „Metoda Birdshot“ a „Programovací styl Million Monkeys“.
Reference
- ^ Matematika a počítačové vzdělávání. Michiganská univerzita. 21: 78. 1987. Chybějící nebo prázdný
| název =
(Pomoc)