Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Примеры [ править ]

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

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 }

См. Также [ править ]

Ссылки [ править ]

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

[1]