Jump to content

Пирамида судьбы (программирование)

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

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

theWidth = windows("Main").views(5).size().width();

Этот код содержит четыре разные инструкции; сначала он ищет в коллекции окон окно с именем «Основное», затем ищет в коллекции представлений этого окна пятое подпредставление внутри него, а затем вызывает метод size метод для возврата структуры с размерами представления и, наконец, вызывает метод width метод этой структуры для получения результата, присвоенного имени переменной theWidth.

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

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

if windows.contains("Main") {
    if windows("Main").views.contains(5) {
        theWidth = windows("Main").views(5).size().width();
        //more code that works with theWidth
    }
}

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

if windows.contains("Main") { theWindow = windows("Main") }
if theWindow != null && theWindow.views.contains(5) { theView = theWindow.views(5) }
if theView != null {
    theWidth = theView.size().width();
    //additional code
}

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

if !windows.contains("Main") {
    // handle error
} else if !windows("Main").views.contains(5) {
    // handle error
} else {
    theWidth = windows("Main").views(5).size().width();
    //more code that works with theWidth
}

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

theWidth = windows("Main")?.views(5)?.size.width;

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

if let theView = windows("Main")?.views(5) {
    //do things knowing the view exists...
    theWidth = theView.size.width
}

Разрешение

[ редактировать ]

Pyramid of Doom обычно можно решить на любом языке, просто разбив код на несколько вложенных функций (или других групп). Например, вместо:

main() {
	aaaaa() {
		bbbbb() {

			ccccc() {
				ddddd() {
					// do something now
				}
			}

		}
	}
}

Вы можете разбить функциональность следующим образом:

doSomething() {
	// do something now
}

CC() {
	ccccc() {
		ddddd() {
			doSomething()
		}
	}
}

main() {
	aaaaa() {
		bbbbb() {
			CC()
		}
	}
}

Аналогичным образом структуры данных могут быть разбиты по уровням, когда возникают подобные пирамиды.

Пирамида Судьбы не только решена, но и лучше не использовать большие и сложные функции; меньшие легче понять, их легче прочитать и проверить работу. Выбор названий функций для каждого из этих уровней также поможет автору разъяснить читателям, что и где делается. Обычно каждому уровню не требуется много соединений с удаленными уровнями, поэтому их легко отделить. Если такие связи есть, автор может переосмыслить свою конструкцию на что-то более надежное, ведь это благодатный источник ошибок.

См. также

[ редактировать ]
  1. ^ Дэйв Херман (14 декабря 2011 г.). «Почему сопрограммы не работают в Интернете» . Маленький калькулятор . Архивировано из оригинала 6 марта 2016 г.
  2. ^ «Пирамида судьбы: ловушка в стиле JavaScript» . 27 ноября 2012 г. Архивировано из оригинала 9 декабря 2015 г.
  3. ^ Эберхардт, Колин (8 декабря 2014 г.). «Разрушение дополнительной пирамиды судьбы Свифта» . Архивировано из оригинала 31 июля 2016 г.
  4. ^ «Новые возможности языка в Visual Basic 14» . 9 декабря 2014 г. Архивировано из оригинала 25 декабря 2014 г.
  5. ^ «Необязательная цепочка» . Яблоко .
  6. ^ «Операторы с нулевым условием (C# и Visual Basic)» . Майкрософт . 7 марта 2024 г.
  7. ^ «Что нового в Visual C#» . Майкрософт . 21 мая 2024 г.
  8. ^ «Что нового в Visual Basic» . Майкрософт . 21 февраля 2023 г.
  9. ^ Джо Циммерман (28 марта 2013 г.). «В чем смысл обещаний?» . телерик.com .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 35b1f47f690a16d6f9f2723f99fe901e__1719275280
URL1:https://arc.ask3.ru/arc/aa/35/1e/35b1f47f690a16d6f9f2723f99fe901e.html
Заголовок, (Title) документа по адресу, URL1:
Pyramid of doom (programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)