Вход | Регистрация
    1  2

Соответствие и "Неопределено"

Ø [Волшебник, 09.11.20 - 08:24]
Соответствие и "Неопределено"
Я
   RomaH
 
28.10.20 - 11:16
СоответсвиеПредставленияРезультата = Новый Соответствие;
    СоответсвиеПредставленияРезультата.Вставить(Перечисления.ОбнаруженоНеОбнаружено.ПустаяСсылка(),"?");
    СоответсвиеПредставленияРезультата.Вставить(Неопределено,"?");
    СоответсвиеПредставленияРезультата.Вставить(Перечисления.ОбнаруженоНеОбнаружено.Обнаружено,"+");
    СоответсвиеПредставленияРезультата.Вставить(Перечисления.ОбнаруженоНеОбнаружено.НеОбнаружено,"-");


однако оказывается Неопределено ключем быть не может ... вот и не расстройся
   dmpl
 
101 - 29.10.20 - 08:44
А вообще, надо смотреть, относится ли тип Неопределено к множеству типов "Произвольный". Судя по тому, что его нельзя добавить в качестве типа в ОписаниеТипов - нет.
   dmpl
 
102 - 29.10.20 - 08:50
(90) Это не баг, это фича. Чтобы приложение не падало, если вдруг в качестве ключа Неопределено пролезет.
   Стаканов
 
103 - 29.10.20 - 09:02
(102) Но если оно у тебя пролезет, ты об этом никогда не узнаешь. Может ли это быть критичным в определённых ситуациях?
   dmpl
 
104 - 29.10.20 - 09:09
(103) Если это критично - ставь проверку. Если не критично - пусть работает. Расчет на попоруких копрокодеров. Ну и, если посмотреть с прикладной точки зрения - если вдруг где-то пролезло Неопределено в качестве ключа - скорее всего и значение там будет тоже незаполненным, т.е. Неопределено.
   Ненавижу 1С
 
105 - 29.10.20 - 09:44
(104) как объяснение на уровне "сам дурак" подойдёт
   Стаканов
 
106 - 29.10.20 - 09:56
(104) Ну вот, например, пишешь ты в соответствие связку Заказ-ПТУ, Заказ получаешь какой-нибудь хитрой функцией, которая может вернуть Неопределено, если не проверять Заказ на Неопределено, ты потеряешь минимум одно ПТУ :) Так что склонен всё-же отнести такое поведение, и отсутствие его внятного описания в документации, к ошибкам. Но если об этом помнить, и проверять на Неопределено ключ соответствия, то никаких проблем, да.
   fisher
 
107 - 29.10.20 - 10:04
(100) Если ты при очевидном баге в программе не падаешь (не прерываешь работу приложения с сообщением об ошибке), то последствия для бизнеса будут гораздо более печальные. Потому что последствия некорректной работы программы непредсказуемы и плавающий баг проявляющийся далеко от места возникновения ты можешь поколениями программистов отлавливать.
   fisher
 
108 - 29.10.20 - 10:08
(100) Если ты обрабатываешь в коде конкретную ошибочную ситуацию - то все хорошо. Это уже не баг, а предусмотренная программистом ситуация с описанными вариантами ее разрешения. Проверка же входных параметров с эксепшнами - это последний защитный барьер на тот случай, если ты в коде натупил и допустил очевидные баги.
   fisher
 
109 - 29.10.20 - 10:15
(100) Банальный пример. Ты вызываешь метод с числовым параметром из недопустимого диапазона. Если ты хочешь мягко обработать некорректный ввод пользователя - ты должен сделать это до вызова метода. Если ты уже вызвал метод с некорректным параметром, значит ты этого не сделал и функция не сможет выдать корректный результат. Определять ошибку входных параметров по результату работы метода - это глупо. Во-первых, программист может забыть это сделать во всех местах использования метода (и получит тот самый плавающий баг). Во-вторых, в этот момент неудобно устанавливать конкретную причину. Либо ее надо пробрасывать в результат работы метода, либо программисту придется полностью воспроизводить ситуацию.
   fisher
 
110 - 29.10.20 - 10:35
В golang прикольнее решили. Ты выбрасываешь эксепшн не "куда-то туда", а прямо в результат работы метода. И принимать решение что с этим делать нужно не "где-то там", а сразу при обработке результата работы метода. Тут есть и минусы и плюсы. Я из лагеря тех, кто плюсов видит больше, чем минусов.
   fisher
 
111 - 29.10.20 - 10:45
(109) + При этом, даже если ты определяешь ошибку входных параметров по результату работы метода - то наиболее частый сценарий это все равно остановка работы программы с выдачей сообщения об ошибке. То есть ровно тоже самое что произойдет при выбросе либо вообще не обрабатываемого эксепшна, либо с глобальным перехватчиком эксепшнов (для "облагораживания" их отображения пользователю). Такую возможность, кстати, в последних релизах добавили (глобальный перехватчик эксепшнов).
   dmpl
 
112 - 29.10.20 - 15:11
(106) Как ты его потеряешь? Ты же сравнишь то, что привязалось к заказам, и то, что нет - и выдашь список непривязанного. Выведешь сообщение вида "К заказу Не определено нет ПТУ".
   dmpl
 
113 - 29.10.20 - 15:13
(107) Ну да, конечно. Лучше бизнесу вообще ничего не делать, потому что программа не работает, чем делать бизнес и ВОЗМОЖНО что-то потерять.
   Стаканов
 
114 - 29.10.20 - 15:32
(112) Ничего я не сравниваю в общем случае, просто заполняю соответствие, чтобы дальше там что-то с этим соответствием делать. Пример же утрированый, может быть этот заказ получается веб-сервисом из внешней базы, например :) Но в общем не суть, хороший стиль программирования должен включать в себя проверку соответствия входных параметрам типам принимаемых параметров.
   dmpl
 
115 - 29.10.20 - 15:33
(109) В бизнес-логике редко когда передается один параметр. При этом каждый из параметров по отдельности может иметь допустимое значение, но их сочетание может быть недопустимым. Поэтому вызываемая функция один фиг должна проверять сочетание параметров на корректность. Так что единичный баг будет достаточно быстро выловлен.
   Стаканов
 
116 - 29.10.20 - 15:49
(115) Этак мы сейчас до модульного тестирования договоримся :)
   dmpl
 
117 - 29.10.20 - 15:59
(116) Ну, если бизнес пойдет вширь - к этому все равно рано или поздно придется обратиться ;) А пока бизнес мелкий - он может сэкономить на квалификации исполнителей.
   Стаканов
 
118 - 29.10.20 - 16:03
(117) С какого уровня бизнес перестаёт быть мелким? Завод с 1000 работникам, торговая сеть с 1000 магазинов? Оптовик с 5000 клиентами? Каковы критерии?
   ДенисЧ
 
119 - 29.10.20 - 16:10
(118) Как только автотестирование становится необходимым - бизнес можно считать крупным...
   Стаканов
 
120 - 29.10.20 - 16:17
(119) О, точно, офигенный критерий :)))
   osa1C
 
121 - 29.10.20 - 16:32
(119) Про Сонар куб? ... .да прикольно
   ДенисЧ
 
122 - 29.10.20 - 16:41
(121) Сонар - не панацея
   Стаканов
 
123 - 29.10.20 - 16:53
(121) Сонар куб  - это статический анализ, этого для качества программного продукта недостаточно.
   dmpl
 
124 - 29.10.20 - 21:33
(118) Когда потери от копрокода станут больше сопоставимы или больше затрат на нормальную разработку ;)
   RomaH
 
125 - 30.10.20 - 12:22
вот
в развитие темы - а как в табличной части найти строки с незаполненным составным типом?

т.е. есть строка в ТЧ со значением реквизита =  неопределено

ТЧ.Найти(Неопределено,"Результат") = Неопределено;
   Стаканов
 
126 - 30.10.20 - 13:04
(124) Ну так это не от размера бизнеса зависит, если что.
   ДенисЧ
 
127 - 30.10.20 - 13:07
(125) ЗАпросом
   Ненавижу 1С
 
128 - 30.10.20 - 13:28
(125) разве не работает?
Ну или найтистроки
   RomanYS
 
129 - 30.10.20 - 13:34
(125)
Отбор = Новый Структура("ТвойРеквизит", Неопределено)//пустые ссылки в отбор не попадут!

СтрокиСНеопределено = ТЧ.НайтиСтроки(Отбор);
   ДедМорроз
 
130 - 31.10.20 - 17:03
Если в функцию не передан параметр,то значение будет Неопределенно,другими словами,система считает,что параметр не передали
 
 Рекламное место пустует
   RomanYS
 
131 - 31.10.20 - 18:51
(130) Тогда исключение должно быть, параметр же обязательный.
   Cyberhawk
 
132 - 02.11.20 - 14:10
(131) Почему исключение, в 1С любой параметр можно пропустить, независимо от того, задано для него в сигнатуре значение по умолчанию или не задано
   dmpl
 
133 - 02.11.20 - 14:20
(126) У мелкого бизнеса потери в абсолютном выражении меньше, а затраты на правильную разработку имееют явно выраженную постоянную часть, а потому у них порог случается гораздо позже ;) Если вообще случается.

(127) С запросом еще веселее: Неопределено при проверке условия "Неопределено В (&Параметр)", дает истину даже если в списке явно нет значения Неопределено.
   Ненавижу 1С
 
134 - 04.11.20 - 17:42
(133) " Неопределено В (&Параметр)", дает истину даже если в списке явно нет значения Неопределено "

Сам придумал?
   Ненавижу 1С
 
135 - 04.11.20 - 17:44
(132) " в 1С любой параметр можно пропустить "

Да откуда такое? Я про 8-ку
   RomanYS
 
136 - 04.11.20 - 17:48
(132) А как тогда трактовать термин "обязательный"?
   mistеr
 
137 - 04.11.20 - 18:30
(132) Вечно ты путаешь 1С с какими-то другими языками.
   Стаканов
 
138 - 04.11.20 - 20:45
(133) Тогда вернёмся к вопросу - С какого уровня бизнес перестаёт быть мелким? Завод с 1000 работникам, торговая сеть с 1000 магазинов? Оптовик с 5000 клиентами? Каковы критерии?
   Конструктор1С
 
139 - 04.11.20 - 21:06
(138) законодательно после over 250 сотрудников и/или 2 млрд оборота
   Стаканов
 
140 - 04.11.20 - 21:11
(139) Тогда всё вышеперечисленное крупный бизнес, но вполне себе работает без тестирования ПО. В чём-то другом причина применения тестирования, точно не в размере бизнеса, значит.
   Cyberhawk
 
141 - 04.11.20 - 21:20
(135) И я
   Cyberhawk
 
142 - 04.11.20 - 21:21
(136) Без значения по умолчанию
   RomanYS
 
143 - 04.11.20 - 21:29
(142) Почему тогда все остальные функции дают исключение. Попробуй СокрЛП()
   Cyberhawk
 
144 - 05.11.20 - 08:54
(143) А, мы про "системные" методы. Я про прикладные говорил.
Но в системные вместо пропуска обязательно параметра достаточно передавать "Неопределено" в явном виде и тогда исключение уже не возникает.
   RomanYS
 
145 - 05.11.20 - 09:34
(144) Изначально речь была про 
  Соответсвие.Вставить(Неопределено, ЧегоТо)
Мой опыт тоже говорит, что неопределено вполне себе параметр, а в (130) предполагается иное
   Ненавижу 1С
 
146 - 05.11.20 - 10:26
(144) прикладные точно также работают, проверяйте вначале
   Cyberhawk
 
147 - 05.11.20 - 22:48
(146) Ошибаешься
   Вафель
 
148 - 05.11.20 - 23:05
пропуск параметра и передача неопределено - это разные вещи
   Ненавижу 1С
 
149 - 06.11.20 - 10:26
(147) зачем ты откровенно говоришь ложь?

Недостаточно фактических параметров
{ВнешняяОбработка.ПримерПропускаПараметра.Форма.Форма.Форма(4)}:    ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму();
   Волобуев
 
150 - 06.11.20 - 11:20
(149) Ни одного не указывать точно нельзя, да.
   Cyberhawk
 
151 - 06.11.20 - 12:45
(149) Приведенный тобою фрагмент не имеет никакого отношения к пропуску параметра / параметров
   Ненавижу 1С
 
152 - 06.11.20 - 13:13
(151) давай свой
   Cyberhawk
 
153 - 06.11.20 - 14:37
(152) ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму(,);
   Ненавижу 1С
 
154 - 06.11.20 - 14:43
(153) интересное поведение, а если бы там был все-таки один параметр?
   Cyberhawk
 
155 - 06.11.20 - 14:46
(154) Пропустить единственный обязательный параметр не получится, в этом случае эквивалентного эффекта можно добиться через передачу значения Неопределено.
И тоже никаких исключений не будет.
   Ненавижу 1С
 
156 - 06.11.20 - 14:48
(155) хех, это описанный эффект в языке7
   Cyberhawk
 
157 - 06.11.20 - 15:13
(156) Конечно. На ИТС в абзацах где про "опущенные" параметры. В свое время этот термин вызывал у меня улыбку.
   Ненавижу 1С
 
158 - 06.11.20 - 15:26
(157) спасибо, как-то пропустил этот момент, действительно:

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

Но довольно сомнительное свойство языка
   Конструктор1С
 
159 - 06.11.20 - 16:20
(140) тестирование применяют в основном серьёзные конторы. Обычно это холдинги от нескольких десятков тысяч человек, у которых ИТ-департаменты. Конторы численностью до 2-3 тысяч могут применять ларёчные подходы
   Cyberhawk
 
160 - 06.11.20 - 16:57
(158) Это откуда цитата?
 
 Рекламное место пустует
   Cyberhawk
 
161 - 06.11.20 - 17:00
(160) Нашел в разделе по 8.2.
Там устаревшие и неполные / неточные формулировки. Смотри в 8.3.
   Ненавижу 1С
 
162 - 06.11.20 - 17:37
(160) СП
   Ненавижу 1С
 
163 - 06.11.20 - 17:39
И на ИТС рекомендация: "7. При вызове функций не следует пропускать обязательные параметры. В противном случае, в параметр будет передано значение Неопределено, на которое функция может быть не рассчитана. Если же значение Неопределено является допустимым, то нужно или его передавать в функцию явно, или сделать этот параметр необязательным со значением по умолчанию Неопределено."
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.