Эта статья может быть слишком технической, чтобы ее могло понять большинство читателей . Февраль 2017 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
В компьютерном программировании , то пирамида гибели является общей проблемой , которая возникает , когда программа использует много уровней вложенности отступов для контроля доступа к функции. Обычно это наблюдается при проверке нулевых указателей или обработке обратных вызовов . [1] Два примера этого термина относятся к определенному стилю программирования в JavaScript , [2] и вложенности операторов if, которые встречаются в объектно-ориентированных языках программирования, когда один из объектов может быть нулевым указателем. [3] [4]
Примеры [ править ]
Этот раздел написан как руководство или путеводитель . ( Июнь 2020 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Большинство современных объектно-ориентированных языков программирования используют стиль кодирования, известный как точечная нотация, который позволяет записывать несколько вызовов методов в одной строке кода, причем каждый вызов разделяется точкой. Например:
theWidth = windows ( «Главное» ). просмотров ( 5 ). размер (). ширина ();
Этот код содержит четыре разные инструкции; он сначала ищет в коллекции окон окно с именем "Main", затем ищет в коллекции представлений этого окна 5-е подпредставление внутри него, затем вызывает size
метод для возврата структуры с размерами представления и, наконец, вызывает width
метод в этой структуре, чтобы получить результат, который присваивается имени переменной theWidth
.
Проблема с этим подходом заключается в том, что код предполагает, что все эти значения существуют. Хотя разумно ожидать, что окно будет иметь размер, а этот размер будет иметь ширину, совершенно неразумно предполагать, что окно с именем «Главное» будет существовать или что у него будет пять подвидов. Если какое-либо из этих предположений неверно, один из методов будет вызываться с нулевым значением, что приведет к ошибке нулевого указателя.
Чтобы избежать этой ошибки, программист должен проверять каждый вызов метода, чтобы убедиться, что он возвращает значение. Более безопасная версия того же кода:
если windows . contains ( "Main" ) { if windows ( "Main" ). просмотров . содержит ( 5 ) { theWidth = windows ( "Main" ). просмотров ( 5 ). размер (). ширина (); // дополнительный код, который работает с шириной } }
Если программист желает использовать это значение в зависимости от того, существует оно или нет, то функциональный код внутри if
операторов сдвигается вправо, что затрудняет чтение более длинных строк. Это часто приводит к попыткам «сгладить» код:
если windows . содержит ( "Main" ) { theWindow = windows ( "Main" ) }, если theWindow ! = null && theWindow . просмотров . содержит ( 5 ) { theView = theWindow . views ( 5 ) }, если theView ! = null { theWidth = theView . размер (). ширина (); // дополнительный код }
Или альтернативно:
если ! окна . contains ( "Main" ) { // обработка ошибки } else if ! windows ( «Главное» ). просмотров . contains ( 5 ) { // обработка ошибки } else { theWidth = windows ( "Main" ). просмотров ( 5 ). размер (). ширина (); // дополнительный код, работающий с шириной }
Такая конструкция программирования очень распространена, и ряд языков программирования добавили своего рода синтаксический сахар для решения этой проблемы. Например, Apple Swift добавила концепцию необязательного связывания в операторы if [5], в то время как Microsoft C # 6.0 и Visual Basic 14 добавили условные операторы NULL?.
и ?[
для доступа к членам и индексации соответственно. [6] [7] [8] Основная идея состоит в том, чтобы позволить строке вызовов методов немедленно возвращать null, если какой-либо из ее членов имеет значение null, например:
theWidth = windows ( "Main" ) ? . просмотры ( 5 ) ? . размер . ширина ;
присвоит значение null, theWidth
если отсутствует «Main» или пятое подвид, либо завершит оператор и вернет ширину, если они оба допустимы. Часто программист хочет выполнить разные действия в этих двух случаях, поэтому Swift добавляет еще одну форму синтаксического сахара для этой роли, if let
утверждение, также известное как «необязательная привязка»:
если пусть theView = windows ( "Main" ) ? . views ( 5 ) { // делаем что-то, зная, что представление существует ... theWidth = theView . размер . width }
См. Также [ править ]
- Обещания , метод, позволяющий избежать пирамиды гибели, например, используемый в JavaScript [9]
- Закон Деметры
- Оператор безопасной навигации, оператор языка программирования, позволяющий избежать пирамиды гибели
Ссылки [ править ]
- ↑ Дэйв Херман (14 декабря 2011 г.). «Почему сопрограммы не работают в сети» . Маленький калькулятор . Архивировано 6 марта 2016 года. CS1 maint: обескураженный параметр ( ссылка )
- ^ «Пирамида судьбы: ловушка в стиле javaScript» . 27 ноября 2012 года Архивировано из оригинала на 2015-12-09. CS1 maint: обескураженный параметр ( ссылка )
- Рианна Эберхардт, Колин (8 декабря 2014 г.). «Разрушение необязательной пирамиды судьбы Свифта» . Архивировано 31 июля 2016 года. CS1 maint: обескураженный параметр ( ссылка )
- ^ «Новые языковые возможности в Visual Basic 14» . 9 декабря 2014. Архивировано 25 декабря 2014 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Необязательная цепочка» . Apple .
- ^ «Нулевые-условные операторы (C # и Visual Basic)» . Microsoft .
- ^ «Что нового в Visual C #» . Microsoft .
- ^ «Что нового в Visual Basic» . Microsoft .
- ↑ Джо Циммерман (28 марта 2013 г.). "В чем смысл обещаний?" . telerik.com .
[1]