Пирамида гибели (программирование) - Pyramid of doom (programming)
Эта статья может быть слишком техническим для большинства читателей, чтобы понять. Пожалуйста помогите улучшить это к сделать понятным для неспециалистов, не снимая технических деталей. (Февраль 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
В компьютерное программирование, то пирамида гибели - распространенная проблема, возникающая, когда программа использует много уровней вложенных отступов для управления доступом к функции. Обычно это наблюдается при проверке нулевые указатели или обработка обратные вызовы.[1] Два примера термина относятся к определенному стилю программирования в JavaScript,[2] и гнездование если заявления что происходит в объектно-ориентированного программирования языки, когда один из объектов может быть нулевым указателем.[3][4]
Примеры
Эта секция написано как руководство или путеводитель.Июнь 2020 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Самый современный объектно-ориентированные языки программирования используйте стиль кодирования, известный как точечная нотация, который позволяет записывать несколько вызовов методов в одной строке кода, причем каждый вызов разделяется точкой. Например:
ширина = окна("Главный").взгляды(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) { // делаем что-то, зная, что представление существует ... ширина = вид.размер.ширина}
Смотрите также
- Обещания, способ избежать пирамиды гибели, например используется в JavaScript[9]
- Закон Деметры
- Оператор безопасной навигации, оператор языка программирования, который позволяет избежать пирамиды гибели
Рекомендации
- ^ Дэйв Херман (14 декабря 2011 г.). «Почему сопрограммы не работают в сети». Маленький калькулятор. В архиве из оригинала от 06.03.2016.
- ^ «Пирамида судьбы: ловушка в стиле javaScript». 27 ноября 2012. Архивировано с оригинал на 2015-12-09.
- ^ Эберхард, Колин (8 декабря 2014 г.). "Разрушение необязательной пирамиды судьбы Свифта". В архиве из оригинала 31.07.2016.
- ^ «Новые языковые возможности в Visual Basic 14». 9 декабря 2014 г. В архиве из оригинала от 25.12.2014.
- ^ «Необязательная цепочка». яблоко.
- ^ «Нулевые условные операторы (C # и Visual Basic)». Microsoft.
- ^ «Что нового в Visual C #». Microsoft.
- ^ «Что нового в Visual Basic». Microsoft.
- ^ Джо Циммерман (28 марта 2013 г.). "В чем смысл обещаний?". telerik.com.