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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Повторная передача параметра по умолчанию
23. Июня 2006 :: 16:43
Печать  
Не проходит такой тест. Имеется класс:
Код
Выбрать все
class тестыЗначенияПараметровПоУмолчанию = ЗначенияПараметровПоУмолчанию.txt : ТестовыйСлучай
{
	void Метод1_СПараметромПоУмолчанию(СписокЗначений Список="");
	void Метод2_СПараметромПоУмолчанию(СписокЗначений Список="");
}; 



Имеется реализация:
Код
Выбрать все
Процедура Тест_ПередачаПараметраПоУмолчанию() Экспорт
	миф.УстановитьТекУстановки(, 1,); //Проверка типов
	Сам().Метод1_СПараметромПоУмолчанию();
КонецПроцедуры

Процедура Метод1_СПараметромПоУмолчанию(Список) Экспорт
	Сам().Метод2_СПараметромПоУмолчанию(Список);
КонецПроцедуры

Процедура Метод2_СПараметромПоУмолчанию(Список) Экспорт
КонецПроцедуры

 



Тест падает при вызове Сам().Метод2_СПараметромПоУмолчанию(Список).

Считаю, что это ошибка.
« Последняя редакция: 24. Июня 2006 :: 07:50 - sedmin »  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #1 - 23. Июня 2006 :: 17:05
Печать  
Он "падает" как именно? Ругается на то, что тип не соответствует?
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Параметры по умолчанию
Ответ #2 - 23. Июня 2006 :: 17:45
Печать  
Да, говорит, что не соответствует тип.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Параметры по умолчанию
Ответ #3 - 23. Июня 2006 :: 18:23
Печать  
Ну так чего же ты хотел?
Тип значения во втором методе какой? Список значений.
А передаешь ты туда чего? Строку.
Совпадает? Нет.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Параметры по умолчанию
Ответ #4 - 24. Июня 2006 :: 07:49
Печать  
Ну я это, конечно, понимаю. Но я же специально такой тест написал, чтобы было видно откуда ноги растут.

Если я принял параметр как СписокЗначений, то почему я не могу его передать как СписокЗначений?

Не писать же мне такой код:

Код
Выбрать все
Процедура Метод1_СПараметромПоУмолчанию(Список) Экспорт
	Если ТипЗначенияСтр(Список)="" Тогда
		Сам().Метод2_СПараметромПоУмолчанию();
	Иначе
		Сам().Метод2_СПараметромПоУмолчанию(Список);
	КонецЕсли; 



Потому что в данном случае будет некорректным даже такой код:

Код
Выбрать все
Процедура Метод1_СПараметромПоУмолчанию(Список) Экспорт
	Если ПустоеЗначение(Список)=1 Тогда
		Сам().Метод2_СПараметромПоУмолчанию();
	Иначе
		Сам().Метод2_СПараметромПоУмолчанию(Список);
	КонецЕсли; 



fez писал(а) 23. Июня 2006 :: 18:23:
А передаешь ты туда чего? Строку.


И вовсе не строку я туда передаю, а ты_сам_знаешь_что.  Улыбка И с этим я тоже не согласен. Ну ты помнишь.  Улыбка
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #5 - 24. Июня 2006 :: 14:16
Печать  
Я считаю так. Если тебе нужен (Параметр со значением по умолчанию) И (Проверка типов), то надо засовывать в значение по умолчанию значение того же типа.

Вот если тебе НЕ нужна проверка типов, а нужен ТОЛЬКО параметр со значением по умолчанию, то тут попадос, ибо в 1С++ грамотно разрулить это нельзя.

А по поводу "я_сам_знаю_что" - там была какая-то косячина с тем, что пустая строка передается как пустое значение неопределенного типа, но Артур вроде бы ее исправлял.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #6 - 24. Июня 2006 :: 15:48
Печать  
Цитата:
Я считаю так. Если тебе нужен (Параметр со значением по умолчанию) И (Проверка типов), то надо засовывать в значение по умолчанию значение того же типа.


Если я тебя правильно понял, то ты предлагаешь описывать методы так:
Код
Выбрать все
class тестыЗначенияПараметровПоУмолчанию = ЗначенияПараметровПоУмолчанию.txt : ТестовыйСлучай
{
	void Метод1_СПараметромПоУмолчанию(СписокЗначений Список=СоздатьОбъект("СписокЗначений"));
	void Метод2_СПараметромПоУмолчанию(СписокЗначений Список=СоздатьОбъект("СписокЗначений"));
}; 


Но это же корявость. А если у меня несколько параметров, то тогда во что это превратится?

Цитата:
Вот если тебе НЕ нужна проверка типов, а нужен ТОЛЬКО параметр со значением по умолчанию, то тут попадос, ибо в 1С++ грамотно разрулить это нельзя.


Почему нельзя? Я отключаю проверку типов, и этот тест проходит.

Цитата:
А по поводу "я_сам_знаю_что" - там была какая-то косячина с тем, что пустая строка передается как пустое значение неопределенного типа, но Артур вроде бы ее исправлял.


Пустая строка в качестве параметра по умолчанию передается только, если тип параметра - строка.

Я предлагаю использовать пустое значение неопределенного типа (Nil, или еще как его называют) как походящее в качестве параметра любого типа.

В качестве примера могу сказать, что при обсуждении с АЛьФом параметров для ИсходнойТаблицы() обсуждались различия при передаче параметров, если параметр пропущен и если параметром передано ПолучитьПустоеЗначение(). Он тогда сказал, что, в принципе, эти случаи можно отличить в исходном коде компоненты, но не стоит этого делать. В этом вопросе я с ним согласен. Думаю, что в данном случае логично поступить так же.

Каждый раз я получаю рекомендации как нужно правильно использовать параметры по умолчанию. Я не утвержаю, что настоящая реализация не пригдна к использованию. Можно, конечно, писать код с ее использованием и обходить все тонкие моменты, возникающие при этом. В принципе, можно совсем не пользоваться параметрами по умолчанию.
Я всего лишь говорю о том, что в настояшем виде параметры по умолчания НЕ УДОБНЫ.

Еще небольшой вопрос. Почему-то против моих предложений изменить использование параметров по умолчанию высказываешься только ты. У тебя много кода завязано на использование их в существующем виде? Или на форуме разработчиков все пришли к единому мнению, и ты его озвучиваешь?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #7 - 25. Июня 2006 :: 05:40
Печать  
sedmin писал(а) 24. Июня 2006 :: 15:48:
Еще небольшой вопрос. Почему-то против моих предложений изменить использование параметров по умолчанию высказываешься только ты.

Я не считаю, что я высказываюсь против твоих предложений. Я плохо понимаю суть самих предложений Улыбка

Нет, честно, я может быть плохо смотрю, но в твоих вопросах по значениям по умолчанию я вижу только "если сделать так и так, то будет вот так", и при этом не вижу "а хочу, чтобы было вот так".

А такой "багрепорт" не может не вызвать традиционного отторжения Улыбка)
  
Наверх
www  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #8 - 25. Июня 2006 :: 07:45
Печать  
sedmin
Зачем, вообще, использовать проверку типов?
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #9 - 26. Июня 2006 :: 06:32
Печать  
fez писал(а) 25. Июня 2006 :: 05:40:
Я не считаю, что я высказываюсь против твоих предложений. Я плохо понимаю суть самих предложений Улыбка


Я же написал: Я предлагаю использовать пустое значение неопределенного типа (Nil, или еще как его называют) как походящее в качестве параметра любого типа.

Еще бы был удобный вариант корректной проверки опущенного параметра, например
Код
Выбрать все
Если Параметр=Nil Тогда 


Но, в крайнем случае можно создать такую глобальную переменную.

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #10 - 26. Июня 2006 :: 06:43
Печать  
Палыч писал(а) 25. Июня 2006 :: 07:45:
Зачем, вообще, использовать проверку типов?


Это ты меня спрашиваешь как пауэр юзер пауэр юзера?  Улыбка

Я думал, что для проверки типов.
Может я чего не понимаю, но для чего она, вообще, сделана?
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #11 - 26. Июня 2006 :: 08:39
Печать  
sedmin
Вопрос был риторический Подмигивание
Проверка типов - дело хорошее,  только существующий механизм не позволяет
   - использовать перегрузку методов;
   - передавать параметры различных типов, связанных наследованием;
   - передавать пустое значение вместо значения требуемого типа.
Т.е. практически бесполезна.

зы: или я что-то упустил?
  
Наверх
ICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #12 - 26. Июня 2006 :: 08:48
Печать  
sedmin писал(а) 26. Июня 2006 :: 06:32:
Хотя в целом я ставлю вопрос не так. Я привел ситуацию, в которой, как я считаю, не должно возникать ошибки, а она возникает. Один из вариантов решения я привел выше. Но, может быть, у вас есть другие варианты. Или вы все же убедите меня в том, что ошибка возникает вполне корректно. Но тогда я бы хотел увидеть ваш вариант решения приведенной проблемы. Возможно, он окажется лучше того, что предлагаю я.

Мне кажется, что более логичным (с точки зрения существующей концепции 1С++) было бы отвязать значения параметров по умолчанию от их типизации.
Просто сейчас мы синтаксически не можем написать просто
Код
Выбрать все
Метод1_СПараметромПоУмолчанию(Список=СоздатьОбъект("СписокЗначений")); 


нам обязательно нужно типизировать как сам метод, так и его параметры.

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #13 - 26. Июня 2006 :: 09:01
Печать  
Палыч писал(а) 26. Июня 2006 :: 08:39:
Проверка типов - дело хорошее,  только существующий механизм не позволяет
  - использовать перегрузку методов;
  - передавать параметры различных типов, связанных наследованием;
  - передавать пустое значение вместо значения требуемого типа.


Перегрузка методов и параметры по умолчанию - два (почти) альтернативных способа решения одной проблемы.

При реализации п. 3 никаких проблем возникнуть не должно. (Как я себе это представляю.)

П. 2 реализовать посложнее, но возможно. Мне, например, в паре мест уже пришлось это сделать самому.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #14 - 26. Июня 2006 :: 09:07
Печать  
fez писал(а) 26. Июня 2006 :: 08:48:
Ведь если в параметре может быть и строка и список значений, то это как раз тот случай.

Ну вот. О чем я и говорил ранее. Существующий способ описания параметров ввоздит в заблуждение.

Не может параметр быть строкой - только списком или пустым значением. "" я написал потому, что нельзя написать:
Код
Выбрать все
	void Метод1_СПараметромПоУмолчанию(СписокЗначений Список=);
 



Посему еще одно предложение: Предлагаю реализовать возможность использования приведенной выше записи.

И еще одно, для более отдаленного будущего: Если в описании параметра по умолчания написано ="", то он должне принимать значение <пустая строка>.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 8
ОтправитьПечать