Выход из цепочки Assigned () в Delphi - PullRequest
4 голосов
/ 19 июня 2020

Иногда я вижу в исходном коде длинную цепочку проверок с помощью Assigned () в глубине объекта, например

if Assigned (ASomeObj)
   and Assigned (ASomeObj.Session)
   and Assigned (ASomeObj.Session.UserInfo)
   and Assigned (ASomeObj.Session.UserInfo.SomeFactsList)
then
  // to do some actions

Это способ проверки nil всех промежуточных объектов. Может быть, кто-нибудь знает способ обрезки цепочки в части состояния?

По идее, на

try
  if Assigned (ASomeObj.Session.UserInfo.SomeFactsList)
  then
    // to do some actions
except

end;

Существуют ли пути для ее упрощения? Насколько понятно и легко читать исходный код?

Как я знаю в Csharp существуют "?" оператор для использования типа ASomeObj? .Session? .UserInfo? .SomeFactsList для проверки Null

1 Ответ

4 голосов
/ 19 июня 2020

TL; DR В языке Delphi такого оператора нет, и я не думаю, что он появится в ближайшее время. Но есть несколько хороших методов решения этой проблемы. Подробнее ...

Давайте начнем с нижней части вашего вопроса.

Как я знаю, в CSharp существует оператор ? для использования like
ASomeObj?.Session?.UserInfo?.SomeFactsList для проверки by null

Прежде всего, в C# нет оператора ?, но есть такие, в которых есть ?:

Вы, очевидно, имели в виду ?. aka оператор безопасной навигации или даже

Elvis operator

Такого оператора нет в Delphi язык, и я не думаю, что мы его получим в ближайшее время, учитывая, что еще нет даже истинного тернарного условного оператора:

  • RSP-12100 : Добавить тернарный оператор на Delphi язык
  • RSP-14621 : Предлагаемый синтаксис для тернарного оператора

Вы не единственный, кто это просит - есть открытый запрос функции добавить поддержку для условный оператор null (RSP-21323) .

FWIW: язык Oxygene от RemObjects Software (отказ от ответственности: нет отношения) имеет оператор двоеточия для этой цели.

* 1069. * Откуда мы go отсюда? Сначала я бы порекомендовал вам переосмыслить свой дизайн (как было указано в комментариях под вопросом).

Позвольте мне процитировать Просто скажи нет нулям (или рефакторингу своего пути к программисту) Bliss) :

Истина в том, что когда мы пробираемся через бесконечные иерархии объектов, подобные этой, возникает то, что мы называем запахом кода. И это довольно хороший признак того, что мы, возможно, захотим пересмотреть наш дизайн. Настоящий объектно-ориентированный дизайн состоит из хороших маленьких хорошо управляемых классов, которые предоставляют методы, которые мы можем использовать, чтобы они делали что-то за нас. Эти классы абстрагируют мельчайшие детали за кулисами и просто делают это (часто без необходимости вообще возвращать какое-либо значение).

dog.bark() не dog.getAnatomy().getVoiceBox().EmitSound("woof")

Другой вариант - сделать промежуточные объекты не nil, используя шаблон объекта Null . Это поможет вам избавиться от цепных проверок Assigned.

Дешевым и грязным решением было бы ввести сокращенное свойство SomeFactsList или помощник класса непосредственно на ASomeObj, чтобы, по крайней мере, вам не нужно было повторять

Для дальнейшего чтения:

...