Пирамида гибели (программирование) - Pyramid of doom (programming)

В компьютерное программирование, то пирамида гибели - распространенная проблема, возникающая, когда программа использует много уровней вложенных отступов для управления доступом к функции. Обычно это наблюдается при проверке нулевые указатели или обработка обратные вызовы.[1] Два примера термина относятся к определенному стилю программирования в JavaScript,[2] и гнездование если заявления что происходит в объектно-ориентированного программирования языки, когда один из объектов может быть нулевым указателем.[3][4]

Примеры

Самый современный объектно-ориентированные языки программирования используйте стиль кодирования, известный как точечная нотация, который позволяет записывать несколько вызовов методов в одной строке кода, причем каждый вызов разделяется точкой. Например:

ширина = окна("Главный").взгляды(5).размер().ширина();

Этот код содержит четыре разные инструкции; он сначала ищет в коллекции окон окно с именем "Main", затем ищет в коллекции представлений этого окна 5-е подпредставление внутри него, затем вызывает размер для возврата структуры с размерами представления и, наконец, вызывает ширина метод в этой структуре для получения результата, который присваивается имени переменной ширина.

Проблема с этим подходом заключается в том, что код предполагает, что все эти значения существуют. Хотя разумно ожидать, что окно будет иметь размер, а этот размер будет иметь ширину, совершенно неразумно предполагать, что окно с именем «Главное» будет существовать или что у него будет пять подвидов. Если одно из этих предположений неверно, один из методов будет вызываться при значении null, что приведет к ошибке нулевого указателя.

Чтобы избежать этой ошибки, программист должен проверять каждый вызов метода, чтобы убедиться, что он возвращает значение. Более безопасная версия того же кода:

если окна.содержит("Главный") {    если окна("Главный").взгляды.содержит(5) {        ширина = окна("Главный").взгляды(5).размер().ширина();        // больше кода, который работает с шириной    }}

Если программист желает использовать это значение в зависимости от того, существует оно или нет, то функциональный код внутри если все операторы сдвинуты вправо, что затрудняет чтение более длинных строк. Это часто приводит к попыткам «сгладить» код:

если окна.содержит("Главный") { окно = окна("Главный") }если окно != ноль && окно.взгляды.содержит(5) { вид = окно.взгляды(5) }если вид != ноль {    ширина = вид.размер().ширина();    // дополнительный код}

Или альтернативно:

если !окна.содержит("Главный") {    // обрабатываем ошибку} еще если !окна("Главный").взгляды.содержит(5) {    // обрабатываем ошибку} еще {    ширина = окна("Главный").взгляды(5).размер().ширина();    // больше кода, который работает с шириной}

Такая конструкция программирования очень распространена, и в ряде языков программирования добавлены какие-то синтаксический сахар чтобы решить эту проблему. Например, Apple Быстрый добавлена ​​концепция необязательная цепочка в операторах if[5] в то время как Microsoft C # 6.0 и Visual Basic 14 добавил null-условный операторы ?. и ?[ для доступа к членам и индексации соответственно.[6][7][8] Основная идея состоит в том, чтобы позволить строке вызовов методов немедленно возвращать null, если какой-либо из ее членов имеет значение null, например:

ширина = окна("Главный")?.взгляды(5)?.размер.ширина;

присвоит null ширина если отсутствует либо «Основное», либо пятое подпредставление, либо заполните инструкцию и верните ширину, если они оба действительны. Часто программист хочет выполнить разные действия в этих двух случаях, поэтому Swift добавляет еще одну форму синтаксического сахара для этой роли, если позволите заявление, также известное как «дополнительная привязка»:

если позволять вид = окна("Главный")?.взгляды(5) {    // делаем что-то, зная, что представление существует ...    ширина = вид.размер.ширина}

Смотрите также

Рекомендации

  1. ^ Дэйв Херман (14 декабря 2011 г.). «Почему сопрограммы не работают в сети». Маленький калькулятор. В архиве из оригинала от 06.03.2016.
  2. ^ «Пирамида судьбы: ловушка в стиле javaScript». 27 ноября 2012. Архивировано с оригинал на 2015-12-09.
  3. ^ Эберхард, Колин (8 декабря 2014 г.). "Разрушение необязательной пирамиды судьбы Свифта". В архиве из оригинала 31.07.2016.
  4. ^ «Новые языковые возможности в Visual Basic 14». 9 декабря 2014 г. В архиве из оригинала от 25.12.2014.
  5. ^ «Необязательная цепочка». яблоко.
  6. ^ «Нулевые условные операторы (C # и Visual Basic)». Microsoft.
  7. ^ «Что нового в Visual C #». Microsoft.
  8. ^ «Что нового в Visual Basic». Microsoft.
  9. ^ Джо Циммерман (28 марта 2013 г.). "В чем смысл обещаний?". telerik.com.

[1]