Опрос
Опрос Тема Опроса: Разделим инициализацию строк и объектов?
bars   pie

Да    
  3 (30.0%)
Нет    
  0 (0.0%)
Все равно    
  6 (60.0%)
Другое    
  1 (10.0%)




Всего голосов: 10
« Создано: kms : 27. Июня 2006 :: 08:16 »
Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Инициализация параметров методов класса (число прочтений - 10648 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Инициализация параметров методов класса
26. Июня 2006 :: 18:36
Печать  
Соседняя тема sedmina разрослась, а я вижу продолжение вопроса.

ADirks писал(а) 26. Июня 2006 :: 12:16:
небольшая поправка по поводу
void Метод1_СПараметромПоУмолчанию(Неопределенный Парам="");

эксперимент показал, что
1) когда Парам = ""  , в самом методе мы получим значение типа ""
2) Парам = "111" - в методе опять же пустое значение с типом ""
3) Парам = 111 - в методе получим число 111
4) Парам = ПолучитьПустоеЗначение("Справочник") - в методе получим пустое значение типа "Справочник"
5) Парам = ПолучитьПустоеЗначение("СписокЗначений") - в методе получим пустое значение типа ""


документация
Цитата:
Значение по умолчанию – задается после имени параметра и должно быть одного того же типа, что и тип для данного параметра. Возможные типы: Строка Пар1 = «Значение по умолчанию»; Число Пар1 = 100; Дата Пар1 = ’01.01.2002’, а также КОП и агрегатные объекты 1С:Предприятия задаются с заключением их в кавычки, например МойКласс ПарКласс = «МойКласс» - по умолчанию параметр ПарКласс будет содержать в теле метода значение экземпляра класса «МойКласс». Значением по умолчанию может быть простое выражение языка 1С, например – значения констант, перечислений, функций без параметров. Например, Дата дПарДата = РабочаяДата(), параметр «дПарДата» примет значение по умолчанию, возвращенное из метода  РабочаяДата(). Внимание: при указании в качестве значения по умолчанию “” – тип значения не учитывается. Значения по умолчанию возможно задать только в последних параметрах метода.


Для меня очевиден конфликт неоднозначности для типа "неопределенный".
Переданная строка может символизировать как инициализацию строки, так и инициализацию объекта.

К примеру
Код
Выбрать все
void _ТестПарам2(Неопределенный парам="СписокЗначений");
 


инициализирует парам списком значений. а мне, возможно, нужна строка "СписокЗначений".

Отсюда и невыполнение интуитивных ожиданий в п.1 и п.2, упомянутых Алексеем Дирксом.

Предложения?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Инициализация параметров методов класса
Ответ #1 - 26. Июня 2006 :: 19:09
Печать  
Кроме того, акцентирую вот этот момент:

Цитата:
Внимание: при указании в качестве значения по умолчанию “” – тип значения не учитывается.

Что имел в виду Deb? Где не учитывается? В проверке типов? Сейчас это не выполняется.
Баг? Или неточная формулировка?
« Последняя редакция: 27. Июня 2006 :: 09:42 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Инициализация параметров методов класса
Ответ #2 - 27. Июня 2006 :: 04:40
Печать  
Чтобы такое найти надо документацию с лупой изучать.  Печаль

Предложение: изменить запись, писать так:

Код
Выбрать все
  void Метод(СписокЗначений Список=%СписокЗначений%); 


знак можно выбрать по вкусу.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Инициализация параметров методов класса
Ответ #3 - 27. Июня 2006 :: 08:14
Печать  
Примерно так же представляю себе.
Тут будет вопрос обратной совместимости - так что, кто против, прошу высказываться.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #4 - 28. Июня 2006 :: 05:17
Печать  
А мне всё равно Улыбка

На самом деле значения по умолчанию использую редко, и уж вообще никогда не использую агрегатные объекты в качестве значений по умолчанию. Когда передаётся значение агрегатного типа, то там м.б. либо нормальный объект с нужной информацией, либо пустое значение. В таких случаях на пустое значение и проверяю, неважно какого оно там типа.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Инициализация параметров методов класса
Ответ #5 - 28. Июня 2006 :: 06:10
Печать  
Вот и я с этим согласан.

Только не всегда можно проверить на пустоту объекта. Например, для КОП.

Поэтому и прошу сделать возможность передачи NULL.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #6 - 28. Июня 2006 :: 07:18
Печать  
sedmin писал(а) 28. Июня 2006 :: 06:10:
Только не всегда можно проверить на пустоту объекта. Например, для КОП.

Кстати наверняка это как-то можно попробовать реализовать. По типу как с сериализацией КОПов. Только для этого надо Сашу Орефкова потеребить Улыбка
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #7 - 28. Июня 2006 :: 07:20
Печать  
kms писал(а) 27. Июня 2006 :: 08:14:
Примерно так же представляю себе.
Тут будет вопрос обратной совместимости - так что, кто против, прошу высказываться.

С одной стороны, отсутствие обратной совместимости - это всегда очень плохо. Иногда даже фатально. С другой стороны - момент действительно редкоиспольуемый.
Так что может быть сделать это поведение переключаемым?
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #8 - 28. Июня 2006 :: 08:05
Печать  
fez писал(а) 28. Июня 2006 :: 07:18:
sedmin писал(а) 28. Июня 2006 :: 06:10:
Только не всегда можно проверить на пустоту объекта. Например, для КОП.

Кстати наверняка это как-то можно попробовать реализовать. По типу как с сериализацией КОПов.

А как вы это себе представляете?
Подробнее можно?
ИМХО объект КОП либо создается, либо нет. Если создается, вызывается конструктор, и объект не пуст. Если объект не создан, у него нет типа. Других состояний объекта я не знаю.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #9 - 28. Июня 2006 :: 08:54
Печать  
artbear писал(а) 28. Июня 2006 :: 08:05:
Если создается, вызывается конструктор, и объект не пуст.

По-хорошему, объект сам должен уметь отвечать на вопрос: пуст он или нет. Точно так же, как сейчас КОП может отвечать, сериализуется он в строку или нет.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #10 - 28. Июня 2006 :: 09:14
Печать  
Вот именно, что именно объект должен говорить, пуст он или нет.
У нас в 1С++ нет такой возможности - объект всегда создан и значит, не пуст.
Т.е. для КОП на самом деле нет вариации пуст или не пуст.
ЗЫ хотя что и какого типа вернет ПолучитьПустоеЗначение(ИмяКОП) не знаю Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #11 - 28. Июня 2006 :: 09:45
Печать  
Понятно, что в текущей реализации 1C++ этого нельзя сделать. Я же не зря упомянул Орефкова. Улыбка

Вот например признаком сериализуемости КОПа является единица на выходе метода IsSerialisable(). Сам вывод в строку реализуется внутри SaveToString(), но вызывается этот метод штатным 1С-вым ЗначениеВСтрокуВнутр(). Сама ли 1С вызывает вышеназванные методы, или это просто deb перехватил вызов ЗначениеВСтрокуВнутр() - я не знаю. Но предполагаю, что аналогичный фортель можно проделать и с ПустоеЗначение().
  
Наверх
www  
IP записан
 
Deb
1c++ developer
Отсутствует


Sex, drugs and 1C

Сообщений: 41
Зарегистрирован: 21. Мая 2006
Re: Инициализация параметров методов класса
Ответ #12 - 28. Июня 2006 :: 10:24
Печать  
fez писал(а) 28. Июня 2006 :: 09:45:
Понятно, что в текущей реализации 1C++ этого нельзя сделать. Я же не зря упомянул Орефкова. Улыбка

Вот например признаком сериализуемости КОПа является единица на выходе метода IsSerialisable(). Сам вывод в строку реализуется внутри SaveToString(), но вызывается этот метод штатным 1С-вым ЗначениеВСтрокуВнутр(). Сама ли 1С вызывает вышеназванные методы, или это просто deb перехватил вызов ЗначениеВСтрокуВнутр() - я не знаю. Но предполагаю, что аналогичный фортель можно проделать и с ПустоеЗначение().

Никакого шаманства, 1С делает это сама...
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инициализация параметров методов класса
Ответ #13 - 28. Июня 2006 :: 11:01
Печать  
Deb писал(а) 28. Июня 2006 :: 10:24:
Никакого шаманства, 1С делает это сама...

Ну вот, значит "осталось" найти, какой метод объекта вызывает 1С при работе ПустоеЗначение() Улыбка
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Инициализация параметров методов класса
Ответ #14 - 28. Июня 2006 :: 15:15
Печать  
Что-то не помню я такого в технологии создания внешних компотанет для ПустоеЗначение().
С другой стороны, можно сделать и без 1С, но нах#р надо ИМХО.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать