Pyramid of doom (programování) - Pyramid of doom (programming)

v programování, pyramida zkázy je běžný problém, který vzniká, když program používá mnoho úrovní vnořeného odsazení k řízení přístupu k funkci. To je běžně vidět při kontrole nulové ukazatele nebo manipulace zpětná volání.[1] Dva příklady termínu souvisí s konkrétním stylem programování v JavaScript,[2] a hnízdění pokud prohlášení který se vyskytuje v objektově orientované programování jazyky, když jedním z objektů může být nulový ukazatel.[3][4]

Příklady

Nejmodernější objektově orientované programovací jazyky použijte styl kódování známý jako tečkový zápis, který umožňuje zapsat více volání metod v jednom řádku kódu, přičemž každé volání je odděleno tečkou. Například:

šířka = Okna("Hlavní").pohledy(5).velikost().šířka();

Tento kód obsahuje čtyři různé pokyny; nejprve vyhledá v kolekci oken okno s názvem „Main“, poté vyhledá v kolekci zobrazení daného okna pátý subview v něm a poté zavolá velikost metoda pro vrácení struktury s rozměry pohledu a nakonec volá šířka metoda na této struktuře k vytvoření výsledku, který je přiřazen k názvu proměnné šířka.

Problém tohoto přístupu spočívá v tom, že kód předpokládá, že všechny tyto hodnoty existují. I když je rozumné očekávat, že okno bude mít velikost a tato velikost bude mít šířku, není vůbec rozumné předpokládat, že okno s názvem „Main“ bude existovat, ani že má pět dílčích náhledů. Pokud je některý z těchto předpokladů nesprávný, bude jedna z metod vyvolána na null, což způsobí chybu nulového ukazatele.

Aby se zabránilo této chybě, musí programátor zkontrolovat každé volání metody, aby se ujistil, že vrací hodnotu. Bezpečnější verze stejného kódu by byla:

-li Okna.obsahuje("Hlavní") {    -li Okna("Hlavní").pohledy.obsahuje(5) {        šířka = Okna("Hlavní").pohledy(5).velikost().šířka();        // více kódu, který pracuje s theWidth    }}

Pokud si programátor přeje použít tuto hodnotu na základě toho, zda existuje nebo není platná, funkční kód uvnitř -li všechny příkazy jsou tlačeny doprava, takže je obtížné číst delší řádky. To často vede k pokusům o „zploštění“ kódu:

-li Okna.obsahuje("Hlavní") { okno = Okna("Hlavní") }-li okno != nula && okno.pohledy.obsahuje(5) { pohled = okno.pohledy(5) }-li pohled != nula {    šířka = pohled.velikost().šířka();    // další kód}

Nebo alternativně:

-li !Okna.obsahuje("Hlavní") {    // chyba rukojeti} jiný -li !Okna("Hlavní").pohledy.obsahuje(5) {    // chyba rukojeti} jiný {    šířka = Okna("Hlavní").pohledy(5).velikost().šířka();    // více kódu, který pracuje s theWidth}

Tento druh programovacího konstruktu je velmi běžný a řada programovacích jazyků přidala nějaký druh syntaktický cukr řešit to. Například Apple Rychlý přidal koncept volitelné řetězení v prohlášení if[5] zatímco Microsoft C# 6,0 a Visual Basic 14 přidal null-podmíněné operátory ?. a ?[ pro přístup členů a indexování.[6][7][8] Základní myšlenkou je umožnit řetězci volání metod okamžité vrácení hodnoty null, pokud některý z jejích členů má hodnotu null, takže například:

šířka = Okna("Hlavní")?.pohledy(5)?.velikost.šířka;

by přiřadil null šířka pokud chybí buď „Hlavní“, nebo pátý dílčí pohled, nebo vyplňte příkaz a vraťte šířku, pokud jsou obě platné. Existuje mnoho případů, kdy programátor chce v těchto dvou případech provést různá opatření, takže Swift přidává pro tuto roli další formu syntaktického cukru, pokud nechám prohlášení, známé také jako „volitelná vazba“:

-li nechat pohled = Okna("Hlavní")?.pohledy(5) {    // dělat věci s vědomím, že pohled existuje ...    šířka = pohled.velikost.šířka}

Viz také

Reference

  1. ^ Dave Herman (14. prosince 2011). „Proč nebudou coroutiny na webu fungovat“. Malý kalkulačka. Archivováno z původního dne 2016-03-06.
  2. ^ „The Pyramid of Doom: a JavaScript Style Trap“. 27. listopadu 2012. Archivovány od originál dne 09.12.2015.
  3. ^ Eberhardt, Colin (8. prosince 2014). „Strhávání Swiftovy volitelné pyramidy zkázy“. Archivováno z původního dne 2016-07-31.
  4. ^ „Nové jazykové funkce v jazyce Visual Basic 14“. 9. prosince 2014. Archivováno z původního dne 2014-12-25.
  5. ^ „Volitelné řetězení“. Jablko.
  6. ^ "Null-conditional Operators (C # and Visual Basic)". Microsoft.
  7. ^ „Co je nového ve Visual C #“. Microsoft.
  8. ^ „Co je nového v jazyce Visual Basic“. Microsoft.
  9. ^ Joe Zimmerman (28. března 2013). „Jaký je smysl slibů?“. telerik.com.

[1]