Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Параметры по умолчанию (число прочтений - 16238 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Параметры по умолчанию
24. Сентября 2007 :: 11:32
Печать  
Uzhast писал(а) 24. Сентября 2007 :: 06:32:
Во-первых. Например, раньше можно было писать ИндексированнаяТаблица.ВыбратьСтроку (). А теперь нельзя. Можно только, например, ИндексированнаяТаблица.ВыбратьСтроку (0). Так же видел, что кто-то еще жаловался на такое поведение с параметрами по умолчанию.

Этот метод и его поведение для совместимости соответствуют штатному от ТаблицаЗначений.ВыбратьСтроку, там нет параметров по умолчанию вообще !

Да, это баг, но мелкий.
Поправлю, это не проблема.
ЗЫ у родного метода ИТЗ.Показать этого недостатка нет Улыбка

С тем кодом, на который еще жаловались, уже также разобрались Улыбка

Uzhast писал(а) 24. Сентября 2007 :: 06:32:
Во-вторых, подобное поведение не соответствует стандартному. Если я пишу
Код
Выбрать все
Процедура ХитроеСложение (А = 2, Б = 3) 


То я могу вызывать ее как ХитроеСложение (3). И мне не надо писать ХитроеСложение (3,). А в 1С++ надо  Улыбка

-1 Улыбка
Лукавишь, ты не все варианты показал.
Стандартное поведение 1С очень и очень далеко от идеала и очень непонятно.
Я для проверки написал пару тестов.
1. в Глобальнике определил метод
Код
Выбрать все
Функция глШтатныеПараметрыПоУмолчанию_Сложение(А = 2, Б = 3) Экспорт
	Возврат А + Б;
КонецФункции
 



Вот его тест
Код
Выбрать все
Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию() Экспорт
	Сам=Сам();

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4);
	Сам.ПроверитьРавенство(Значение, 7); // 1

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение(,4);
	Сам.ПроверитьРавенство(Значение, 6); // 2

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);

	Сам.ПропуститьТест(0, "Штатные параметры по умолчанию неверно работают !!"+РазделительСтрок+
		"       Например, глоб. функция глШтатныеПараметрыПоУмолчанию_Сложение(4,) должна вернуть 7, "+РазделительСтрок+
		"       но 1С возвращает 4 :("+РазделительСтрок);
	// а вот и БАГ 1С - система возвращает 4, а нужно 7
	Сам.ПроверитьРавенство(Значение, 7); // 3
КонецПроцедуры
 



Т.е. получается, что 1С использует параметры по умолчанию для тех параметров, которые пропущены в начале списка параметров - 2 проверка теста
но не использует их для тех параметров, которые находятся в конце списка параметров - 3 проверка теста.

ИМХО очередное неявное и корявое поведение 1С Печаль , на которое никак нельзя полагаться

2. 1С++ этого недостатка лишен Улыбка
Полностью аналогичный тест для метода класса прекрасно проходит.
Кстати, в 1С++ проходит как ХитроеСложение (3), так и ХитроеСложение (3, )
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #1 - 24. Сентября 2007 :: 11:58
Печать  
Цитата:
Этот метод и его поведение для совместимости соответствуют штатному от ТаблицаЗначений.ВыбратьСтроку, там нет параметров по умолчанию вообще !

Не обманывай! Можно писать ТаблицаЗначений.ВыбратьСтроку() и всё будет нормально. Вот со СпискомЗначения такого не прокатит.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #2 - 24. Сентября 2007 :: 12:05
Печать  
JohnyDeath писал(а) 24. Сентября 2007 :: 11:58:
Цитата:
Этот метод и его поведение для совместимости соответствуют штатному от ТаблицаЗначений.ВыбратьСтроку, там нет параметров по умолчанию вообще !

Не обманывай! Можно писать ТаблицаЗначений.ВыбратьСтроку() и всё будет нормально. Вот со СпискомЗначения такого не прокатит.

Да, перепутал со СпискомЗначений.
Значит, просто баг Печаль
Исправлю.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #3 - 24. Сентября 2007 :: 12:21
Печать  
Uzhast писал(а) 24. Сентября 2007 :: 06:32:
Во-первых. Например, раньше можно было писать ИндексированнаяТаблица.ВыбратьСтроку (). А теперь нельзя. Можно только, например, ИндексированнаяТаблица.ВыбратьСтроку (0). Так же видел, что кто-то еще жаловался на такое поведение с параметрами по умолчанию.

Исправлено в 2.5
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #4 - 24. Сентября 2007 :: 12:22
Печать  
А что скажете по основной теме ветке, т.е. по неоднозначному поведению 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: Параметры по умолчанию
Ответ #5 - 24. Сентября 2007 :: 13:07
Печать  
artbear писал(а) 24. Сентября 2007 :: 12:22:
А что скажете по основной теме ветке, т.е. по неоднозначному поведению 1С?


Логика в подобном поведении 1С есть. Извращенная, конечно, но логика.

Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4);
Здесь типа используется значение по умолчанию.

Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);
А здесь - в параметр как бы явно передается значение. Пустое.

Не могу сказать, что мне такое поведение нравится. Но логика в этом есть. И сказать, что такое поведение "неоднозначное" я не могу.
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #6 - 24. Сентября 2007 :: 13:13
Печать  
fez писал(а) 24. Сентября 2007 :: 13:07:
Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);
А здесь - в параметр как бы явно передается значение. Пустое.

глШтатныеПараметрыПоУмолчанию_Сложение(,4);
А здесь - первый параметр как бы работает по умолчанию.
и где логика?
  

1&&2&&3
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Параметры по умолчанию
Ответ #7 - 24. Сентября 2007 :: 13:20
Печать  
Еще в 1С можно не указывать параметры, даже если для них не задано умолчание.
Код
Выбрать все
Процедура Тест(а, б)
КонецПроцедуры

Тест(,);
 


Как вам такая возможность?
  

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #8 - 24. Сентября 2007 :: 13:23
Печать  
trad писал(а) 24. Сентября 2007 :: 13:13:
fez писал(а) 24. Сентября 2007 :: 13:07:
Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);
А здесь - в параметр как бы явно передается значение. Пустое.

глШтатныеПараметрыПоУмолчанию_Сложение(,4);
А здесь - первый параметр как бы работает по умолчанию.
и где логика?


Здесь параметр по умолчанию указан перед параметром, в который передается значение. Поскольку это единственный способ - очевидно, что он работает так, как ожидалось.
Тогда как параметр по умолчанию ПОСЛЕ параметра, в который значение передано, можно описать двумя способами. С запятой и без. В 1С решили, что вариант с запятой не имеет права на тщательное тестирование. Поэтому-то он работает так, как работает.

Мне даже интересно. Если определить вот такую функцию:

Код
Выбрать все
Функция МножественноеСложение(_1 = 1, _2 = 2, _3 = 4, _4=8, _5 = 16)
  Возврат _1+_2+_3+_4+_5;
КонецФункции 



И вызвать ее

Значение = МножественноеСложение(0,,);
То в Значение окажется 24?
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #9 - 24. Сентября 2007 :: 13:25
Печать  
kms писал(а) 24. Сентября 2007 :: 13:20:
Еще в 1С можно не указывать параметры, даже если для них не задано умолчание.
Код
Выбрать все
Процедура Тест(а, б)
КонецПроцедуры

Тест(,);
 


Как вам такая возможность?


ВО!!! Это еще раз подтверждает, что 1С рассматривает запятую прежде всего как ПустоеЗначение(). И где-то сбоку, костыликом прикручена проверка: "а не параметр ли это по умолчанию, после которого есть параметр со значением?"
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Параметры по умолчанию
Ответ #10 - 24. Сентября 2007 :: 13:29
Печать  
Отсюда следует вывод: не ходите дети в Африку гулять.

Поэтому, мне кажется, что в 1С++ лучше сделать также, как в 1С. (Помните, винду сделали совместимой с СимСити?) Потому что иначе один и тот же код будет работать по-разному (что и наблюдалось раньше, стало чуть получше).

Или оставить так, как есть. Как ни сделай - все равно будет плохо.  Печаль
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #11 - 24. Сентября 2007 :: 13:38
Печать  
Не, ну самый правильный способ давно известен.
1. Делаем настройку: "правильная обработка параметров по умолчанию в классах 1С++".
2. По умолчанию включаем ее в режим совместимости с 1С.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #12 - 24. Сентября 2007 :: 13:44
Печать  
Не, я лично против подобной совместимости методов 1С++ с 1С.

Если у метода нет параметров по-умолчанию и если разработчик хочет передать в метод пустое/неопределенное значение, пусть делает это явно, Тест("", "") .

Если параметры по умолчанию есть, при пропущенном параметре должны использоваться именно указанные параметры по умолчанию, а не так, как выберет 1С - нафига я должен помнить, что в разных случаях могут быть разные значения!
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #13 - 24. Сентября 2007 :: 13:51
Печать  
fez писал(а) 24. Сентября 2007 :: 13:23:
Мне даже интересно. Если определить вот такую функцию:

Код
Выбрать все
Функция МножественноеСложение(_1 = 1, _2 = 2, _3 = 4, _4=8, _5 = 16)
  Возврат _1+_2+_3+_4+_5;
КонецФункции 



И вызвать ее

Значение = МножественноеСложение(0,,);
То в Значение окажется 24?

Есть у меня и подобный тест Улыбка
Код
Выбрать все
 //В глобальнике
Функция Метод_ШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(А = 2, Б = 3, Ц = 5) Экспорт
	Возврат А + Б + Ц;
КонецФункции
 



Тест
Код
Выбрать все
Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию_3Параметра() Экспорт
	Сам=Сам();

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4);
	Сам.ПроверитьРавенство(Значение, 12);

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
	Сам.ПроверитьРавенство(Значение, 11);

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
	Сам.ПроверитьРавенство(Значение, 12); // ПАДАЕТ !!
КонецПроцедуры
 


Падает на последней строке, т.к. 1С возвращает 9, что вообще непонятно !!!!
  

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: Параметры по умолчанию
Ответ #14 - 24. Сентября 2007 :: 13:52
Печать  
artbear писал(а) 24. Сентября 2007 :: 13:51:
Есть у меня и подобный тест Улыбка
Код
Выбрать все
 //В глобальнике
Функция Метод_ШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(А = 2, Б = 3, Ц = 5) Экспорт
	Возврат А + Б + Ц;
КонецФункции
 



Тест
Код
Выбрать все
Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию_3Параметра() Экспорт
	Сам=Сам();

	Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
	Сам.ПроверитьРавенство(Значение, 12); // ПАДАЕТ !!
КонецПроцедуры
 


Падает на последней строке, т.к. 1С возвращает 9, что вообще непонятно !!!!


Ну почему непонятно. Как раз понятно. Во втором параметре - пустое значение. Третий параметр берется из умолчания. 4+5 = 9
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать