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

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

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


однако оказывается Неопределено ключем быть не может ... вот и не расстройся
   ДенисЧ
 
1 - 28.10.20 - 11:18
Странно, да?
   ДенисЧ
 
2 - 28.10.20 - 11:18
А ещё NULL ты не можешь туда впихнуть...
   mistеr
 
3 - 28.10.20 - 11:20
И слава БГ, что не можешь.
   fisher
 
4 - 28.10.20 - 11:21
Вообще - да. Странно. Неопределено и null - особые типы. Но иметь возможность использовать их в качестве ключей была бы удобной.
   Волшебник
 
5 - 28.10.20 - 11:21
(0) Продолжайте наблюдения.
   mistеr
 
6 - 28.10.20 - 11:24
(4) А еще ХранилищеЗначения и ДвоичныеДанные, да?
   fisher
 
7 - 28.10.20 - 11:24
(6) Нет.
   Йохохо
 
8 - 28.10.20 - 11:24
(4) они значения, а не типы
   vi0
 
9 - 28.10.20 - 11:25
(3) БГН!
   fisher
 
10 - 28.10.20 - 11:26
(8) Про null не помню, а Неопределено является ЕМНИП отдельным типом. Ну, чтобы корректно в полях составного типа отрабатывать.
   vi0
 
11 - 28.10.20 - 11:27
(10) и тип и значение
   fisher
 
12 - 28.10.20 - 11:28
(11) Ага. Единственное значение своего типа. Типа :)
   mistеr
 
13 - 28.10.20 - 11:33
(4) Есть СписокЗначений, там можно.
   fisher
 
14 - 28.10.20 - 11:38
(13) Я подозреваю, что это просто техническая фича. Структура и соответствие являются хэш-структурами и конкретный тип должен поддерживать генерацию хэша для этих целей. Ну а для Неопределено по каким-то соображениям решили этого не делать. Может, какой-то высокий смысл в этом и есть. Но мне отсюда его не видно. А список значений - обычная коллекция, не на хэшах.
   fisher
 
15 - 28.10.20 - 11:39
Тьфу ты. Для структуры же ключ - обычная строка. Т.е. вышенаписанное конкретно только для соответствия актуально.
   Волшебник
 
16 - 28.10.20 - 11:40
(8) Типы тоже. В этих типах по одному значению.
   Ненавижу 1С
 
17 - 28.10.20 - 11:40
Null нормально ключ, а неопределено нет
   Ненавижу 1С
 
18 - 28.10.20 - 11:40
Это же 1с. Любители пустых значений
   fisher
 
19 - 28.10.20 - 11:41
(18) Только хотел сказать, что главный ненавистник Неопределено в чате :) Еще один пункт в копилку ненависти :)
   Ненавижу 1С
 
20 - 28.10.20 - 11:43
(19) да мне уже пох.. Просто стоит обратить внимание на тот же Шарп, где справляются одними null
   vi0
 
21 - 28.10.20 - 11:44
(20) почему именно шарп?
   MishaD
 
22 - 28.10.20 - 11:45
Соответствие (Map)
Получить (Get)
Синтаксис:

Получить(<Ключ>)
Параметры:

<Ключ> (обязательный)

Тип: Произвольный.
Ключ значения.
Возвращаемое значение:

Тип: Произвольный.
Значение элемента соответствия.
Неопределено - если указанный ключ отсутствует.
   fisher
 
23 - 28.10.20 - 11:45
Мне сразу было пох :) Этот двуликий анус особо жить не мешает. Благо правила игры простые.
   fisher
 
24 - 28.10.20 - 11:46
(22) Браво! А слона-то никто и не заметил :)
   Конструктор1С
 
25 - 28.10.20 - 11:49
(0) всё намного проще. Не суй никаких пустых значений в соответствие. А если соответствие ничего не вернуло, считай будто бы вернуло "?"
   fisher
 
26 - 28.10.20 - 11:50
(20) А что в шарпе возвращают в качестве пустого результата поиска?
   ДенисЧ
 
27 - 28.10.20 - 11:52
(26) А в 1с что возвращают?
   Конструктор1С
 
28 - 28.10.20 - 11:54
(20) обходятся, только более дорогой ценой
   fisher
 
29 - 28.10.20 - 11:55
(27) Для массивов/соответствий - Неопределено. Поэтому отпадает вариант помещать в них это самое Неопределено.
   vi0
 
30 - 28.10.20 - 11:57
(22) так это значение, а не ключ
 
 Рекламное место пустует
   Волшебник
 
31 - 28.10.20 - 12:02
Вместо Неопределено вставляйте "У холмов есть глаза"
   mistеr
 
32 - 28.10.20 - 12:04
Тип (и значение) Неопределено есть в 1С потому, что есть составные типы. Для обозначения того, что нечто составного типа не только не содержит значения, то и конкретный тип не определен. Использование Неопределено для обозначения того, что функция/метод ничего не вернул, это уже вторично.
   fisher
 
33 - 28.10.20 - 12:11
Сам нашел.
Attempting to get a non-existent key
Java's HashMap will return null.
.NET's Dictionary will throw a KeyNotFoundException
Ну а для массивов все индекс возвращают. Отрицательное число - значит не нашел.
   fisher
 
34 - 28.10.20 - 12:31
(30) А ведь и действительно. Это значением в соответствие проблема Неопределено засунуть. Потому что не сможешь понять - это такое значение вернуло или ничего не нашло. На использование Неопределено в качестве это никак не влияет. В джава именно так и есть. Там можно null и в качестве ключа использовать и null возвращается, если ничего не нашло.
Так что вопрос, почему Неопределено нельзя использовать в качестве ключа соответствия остается открытым.
   fisher
 
35 - 28.10.20 - 12:33
"На использование Неопределено в качестве ключа это никак не влияет"
   Ненавижу 1С
 
36 - 28.10.20 - 12:44
(21) как пример такого же средства для корпоративных приложений
   MishaD
 
37 - 28.10.20 - 12:54
(35) а как ты поймешь у тебя там ключа нет, или Неопределено ?
   Ненавижу 1С
 
38 - 28.10.20 - 13:08
(28) с чего такой вывод?
   fisher
 
39 - 28.10.20 - 13:17
(37) Если Неопределено - это ключ, то по нему лежит какое-то значение (но не Неопределено - с ним непонятно как быть). Соответственно, если по ключу Неопределено я получаю не Неопределено - то я получил свое значение. Если получил Неопределено - значит нет такого ключа.
   RomanYS
 
40 - 28.10.20 - 13:31
(39) +1
На самом деле невозможность использовать Неопределено в качестве ключа - это баг. В документации такого запрета нет, исключения при вставке тоже нет <!>, теоретических препятствий тоже нет.
   Конструктор1С
 
41 - 28.10.20 - 13:39
(38) там приходится гораздо больше задрачиваться на эксепшены и проверки на null
   Волшебник
 
42 - 28.10.20 - 13:41
(41) Причём Exception бывает разного типа...
   Конструктор1С
 
43 - 28.10.20 - 13:45
(42) вот именно
   fisher
 
44 - 28.10.20 - 13:58
(41) Поэтому в го по своему прикольный подход. На обработку эксепшнов часто забивают на старте и потом это выходит боком. А го форсит сразу прописывать обработку ошибок.
   MishaD
 
45 - 28.10.20 - 14:16
(39) Логично. Торможу.
   Ненавижу 1С
 
46 - 28.10.20 - 15:58
(41) да конечно. Уж поменьше чем в 1с
   1Сергей
 
47 - 28.10.20 - 16:03
(24) там нет слона
   Конструктор1С
 
48 - 28.10.20 - 16:52
(46) ты шутишь?
   Ненавижу 1С
 
49 - 28.10.20 - 17:04
(48) я серьезно вполне
   Жан Пердежон
 
50 - 28.10.20 - 17:08
Соответствие (Map)
Вставить (Insert)
Синтаксис:
Вставить(<Ключ>, <Значение>)
Параметры:
<Ключ> (обязательный)

скорее всего Неопределено эту проверку не проходит
   Ненавижу 1С
 
51 - 28.10.20 - 17:15
(50) а null проходит
   RomanYS
 
52 - 28.10.20 - 17:18
(50) Тогда исключение должно быть, а его нет
   fisher
 
53 - 28.10.20 - 17:18
(47) Да. Уже потом понял.
   Конструктор1С
 
54 - 28.10.20 - 18:43
(49) ну-ну. Берём типичный приём, паттерн фабрика (Factory). Это что-то вроде составного типа в ихнем тру-программировании

пример

public class CarFactory {
    public static Car buildCar(CarType model) {
        Car car = null;
        switch (model) {
        case SMALL:
            car = new SmallCar();
            break; 
        case SEDAN:
            car = new SedanCar();
            break; 
        case LUXURY:
            car = new LuxuryCar();
            break; 
        default:
            throw new IllegalArgumentException("Incorrect car type");
        }
        return car;
    }
}

наверняка ты уже догадался, что где-то выше по стеку фабрику должен караулить try-catch? Скорее всего этот try будет отлавливать несколько эксепшенов. Вот так даётся "составной" тип данных в тру-программировании. Если не выбрасывать эксепшн из фабрики, то где-то дальше по коду легко можно схлопотать труднодиагностируемый NullPointerException. В 1с такие заморочки нафиг не нужны
   fisher
 
55 - 28.10.20 - 18:54
(54) В 1С в случае некорректного входного параметра я тоже буду выбрасывать эксепшн. А ты что предлагаешь делать?
   Конструктор1С
 
56 - 28.10.20 - 19:08
(55) зачем тебе эксепшн?

В 1с:
Неопределено как незаполненное значение составного типа
null как неудачно полученное из БД значение
ПустаяСсылка как пустое значение конктеного типа
и всё это прекрасно хаватеся методом ЗначениеЗаполнено()

В этих ихних джавах:
null как незаполненное значение составного типа
null как неудачно полученное из БД значение
null как пустое значение конктеного типа
но различать-то их между собой ой как хочется
   Ненавижу 1С
 
57 - 28.10.20 - 19:12
(54) сценариев много, аналог этого в 1с у тебя есть?
Да и паттерн фабрика тут так себе. Оно не так реализуется
   NorthWind
 
58 - 28.10.20 - 19:19
(0) почему-то я не удивлен. Наверно, потому что одна неопределенность не равна другой неопределенности, а раз нельзя сравнивать - то и нельзя юзать в качестве ключей.
   NorthWind
 
59 - 28.10.20 - 19:20
(40) см. (58). Нуллы и неопределенности нельзя сравнивать между собой.
   RomanYS
 
60 - 28.10.20 - 19:24
(59) А зачем их сравнивать?
(Неопределено = Неопределено) = Истина?
 
 Рекламное место пустует
   Ненавижу 1С
 
61 - 28.10.20 - 19:25
(59) так себе объяснил...
В запросах неопределено сравнивать можно
В соответствиях null вполне себе ключ
   NorthWind
 
62 - 28.10.20 - 19:33
(60) для того чтобы достать что-то по ключу, нужно сравнить переданный в функцию получения значения ключ с тем который в контейнере. А две неопределенности сравнить между собой абсурдно, хотя бы потому что они могут относиться к значениям разных типов. Значение типа дата может быть неопределено и типа число неопределено, это разные неопределенности.
   fisher
 
63 - 28.10.20 - 19:35
(56) Ну то есть ты по сути предлагаешь заменить эксепшн возвратом признака и описания ошибки. То есть обрабатывать ошибку передачи некорректного параметра во всех местах вызова метода. Это глупо. Если ты пропустил в метод некорректный параметр, то тебе нужно тупо падать. Ибо это баг программы.
   Конструктор1С
 
64 - 28.10.20 - 19:38
(57) в 1с фабрика не нужна.

"Оно не так реализуется"
Ну, фабрика может реализоваться через общий интерфейс, но тут чувствительность к null ещё сильнее.

Может приведёшь уже свои примеры? Как в шарпе доблестно и просто отбиваются одним null на все случаи жизни
   Конструктор1С
 
65 - 28.10.20 - 19:50
(63) "Ну то есть ты по сути предлагаешь заменить эксепшн возвратом признака и описания ошибки"

Ты про что вообще? Зачем возвращать признак и описание ошибки?
   Конструктор1С
 
66 - 28.10.20 - 19:52
(63) посмотри ещё раз внимательно пример. Это не некорректный параметр, это просто неучтённое значение, которое приведёт к null на выходе
   NorthWind
 
67 - 28.10.20 - 19:52
(60) (Неопределено = Неопределено) = Истина?

Ну а я вот несогласный. (Неопределено=Неопределено) = Ложь.
Переубедите меня :)

Шутка. На самом деле я полагаю что такое сравнение не имеет смысла.
Скорее всего это ложь, потому что неопределенности могут быть разной природы.
А может, и нет. А может, да.
   PR
 
68 - 28.10.20 - 20:04
Закинул ТС небольшой странный пятничный тупнячок и пропал
А в ветку продолжали и продолжали писать личности, не имеющие доступа к конфигуратору и реальных задач
   Стаканов
 
69 - 28.10.20 - 20:08
(68) А тут пришёл Рома, но так как он не лесник, то тихо пукнул в лужу...
   fisher
 
70 - 28.10.20 - 20:24
(65) Ты привел пример "плохого" кода из шарпов, который выкидывает эксепшн в случае передачи методу неправильного параметра.
А я ответил - что в 1С нужно делать тоже самое и точно так же. А то, что это почти никто не делает - из той же серии почему в 1С почти никто тестов не пишет.
   PR
 
71 - 28.10.20 - 20:26
(69) Дружок, про всякие соответствия, Неопределено и NULL и на ИТС уже все давно расписано и в интернете вагон инфы
Но постоянно находятся особо одаренные, которые не умеют читать СП и в итоге постоянно какие-то споры о том, Неопределено = Неопределено или нет, NULL = Неопределено или нет и прочая пурга
   Ненавижу 1С
 
72 - 28.10.20 - 20:30
(71) все тут прекрасно понимают как ЭТО работает
вопрос тут ближе к теме - зачем породили столько разных сущностей, вот собственно и все
   Стаканов
 
73 - 28.10.20 - 20:32
(71) Да я не против, в общем, нравится тебе из себя пузырики выпускать - ну что уж тут поделать, старого пса новым трюкам не научишь.
   RomanYS
 
74 - 28.10.20 - 20:34
(71) Раз хорошо знаком с документацией, опровергни (40) и закроем вопрос :)
   Стаканов
 
75 - 28.10.20 - 20:37
(74) Рома сможет объяснить только, почему ты дурак, а он дартаньян :)
   fisher
 
76 - 28.10.20 - 20:38
Потому что он соответствия соответствовал, когда вы еще пешком под стол ходили!
У нас субординация и выслуга лет!
   Ненавижу 1С
 
77 - 28.10.20 - 20:38
(54) плохой код, хрупкий...
его придется дописывать при добавлении каждого нового вида
действительно, нужно опираться на интерфейс

а иначе вырастают такие вот монстры как в типовых а-ля методов ОбработатьСтрокуТЧ
   PR
 
78 - 28.10.20 - 20:44
(72) Каких сущностей-то?
Ты опять сейчас начнешь тянуть зеленую соплю о том, что множество разнообразных незаполненных значений взрывают твой мозг?
А то так-то все просто
Неопределено — это когда переменная есть, а тип значения не установлен, в итоге Неопределено
NULL — это вообще из запросов тянется, ситуация, когда вообще ничего нет, то есть пусто, вакуум то бишь
Про соответствие вообще не понял, что тут лишнего
   Ненавижу 1С
 
79 - 28.10.20 - 20:45
(78) "Про соответствие вообще не понял, что тут лишнего"
Ну не понял и не понял, идем дальше
   PR
 
80 - 28.10.20 - 20:55
(74) А что тут опровергать-то?
Неопределено в качестве ключа использовать нельзя, пусть даже это не написано в явном виде в СП
Так-то вообще до кучи вещей можно доДДСиться, было бы желание
Проверка примитивная

С1 = Новый Соответствие;
С1.Вставить(1, "Зн1");
С1.Вставить(2, "Зн2");

Сообщить("Ответ " + С1.Получить(1));
Сообщить("Ответ " + С1.Получить(3));
Сообщить("Ответ " + С1.Получить(Неопределено));

С2 = Новый Соответствие;
С2.Вставить(Неопределено, "Н");
С2.Вставить(1, "Зн1");
С2.Вставить(2, "Зн2");

Сообщить("Ответ " + С2.Получить(1));
Сообщить("Ответ " + С2.Получить(3));
Сообщить("Ответ " + С2.Получить(Неопределено));


выдает

Ответ Зн1
Ответ
Ответ
Ответ Зн1
Ответ
Ответ
   Cyberhawk
 
81 - 28.10.20 - 20:58
(15) Структура начиная с 8.2 тоже хешируется, т.е. является полностью аналогом соответствия (ну только ограничения на значение ключа наложено)
   Ненавижу 1С
 
82 - 28.10.20 - 21:01
   RomanYS
 
83 - 28.10.20 - 21:11
(80)
проверку то я делал, и гораздо проще и понятнее:  
С2 = Новый Соответствие;
С2.Вставить(Неопределено, "Н");
Сообщить(С2.Количество());

И мой вывод, что это баг. А ты пришёл с рассказами, что на ИТС и в СП всё расписано.
   PR
 
84 - 28.10.20 - 22:05
(83) Ну так удали в (40) "не" в тексте "На самом деле невозможность использовать" и будет сразу понятнее
А то сейчас звучит так, что типа невозможно использовать и это баг, должно быть возможно
А по факту у тебя получается, что невозможно, а баг — это то, что строка вставки с ключом Неопределено хоть и не добавляет записи, но не выдает исключения
   RomanYS
 
85 - 28.10.20 - 22:15
(84) Под "использовать" естественно имелось в виду в том числе и получение по ключу, что по факту невозможно.
И естественно предполагалось, что читающий это сообщение в данной ветке знает о фактическом поведении системы. Предположение понятно в общем случае ложно, но для заинтересованных - верно.
   PR
 
86 - 28.10.20 - 22:16
(85) Ну так я и говорю, что невозможность получения — это не баг, а нормально, так и должно быть
А ты говоришь, что баг
   Стаканов
 
87 - 28.10.20 - 22:18
(85) Самый главный вывод - чтобы избежать неопределённого поведения, надо при добавлении ключ соответствия проверять на Неопределено :)
   RomanYS
 
88 - 28.10.20 - 22:18
(86) Почему нормально? В документации такое поведение не указано, теоретических преград - я не вижу.
   Стаканов
 
89 - 28.10.20 - 22:20
(88) Да давай уже, признайся, что дурак, а то он ведь от тебя не отстанет.
   PR
 
90 - 28.10.20 - 22:22
(88) Потому что баг в данном случае — это невыдача исключения при выполнении такой строке
Ну а то, что не описано в доке — я же говорю, недоработка, в СП полно таких недоработок, че ж теперь
   PR
 
91 - 28.10.20 - 22:23
(89) Ты же понимаешь, что дураком здесь выглядишь только ты?
   Ненавижу 1С
 
92 - 28.10.20 - 22:25
(90) недоработка это тоже баг
(91) ты неправ
   RomanYS
 
93 - 28.10.20 - 22:25
(90) Баг - в целом такое поведение.
Ты ожидаешь исключения, а я ожидаю нормальной работы с ключом Неопределено.
Любой из этих вариантов был бы нормальным.
   Стаканов
 
94 - 28.10.20 - 22:27
(92) Рома никогда в жизни не признается, что не прав, не по пацански это :))
   PR
 
95 - 28.10.20 - 22:27
(93) Ну, так-то ты прав, на мой взгляд логичнее было бы запретить Неопределено в качестве ключа
   PR
 
96 - 28.10.20 - 22:28
(94) Иди говна поешь :))
   PR
 
97 - 28.10.20 - 22:29
(92) Недоработка это тоже баг — какая глубокая мысль, даже нечего возразить
Еще жук по-английски тоже баг, да
   Ненавижу 1С
 
98 - 28.10.20 - 23:06
(96) кого это высказывание характеризует?
   Стаканов
 
99 - 29.10.20 - 06:59
(96) Рома, я охотно верю, что ты это практикуешь, и что тебе это помогает, но нет, откажусь, пожалуй.
   dmpl
 
100 - 29.10.20 - 08:36
(63) Бизнес-приложение падать не должно - из-за этого теряются бабки. Оно должно работать, максимум лепетать что-то про некорректность.
  1  2   

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