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


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

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

С этого места поподробнее. Что за проблема?
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

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

С этого места поподробнее. Что за проблема?


В ранних языках использовался механизм параметров по умолчания. После появления механизма перегрузки методов эти два механизма стали конфликтовать.

В "продвинутых" языках отключены параметры по умолчанию. Вместо них рекомендуется определить разные методы с одним наименованием, но разным количеством параметров. А в них - хочешь вызывай более длинный вариант с каким угодоно значением, хочешь - пиши вообще что угодно.

На эту тему предлагаю не заморачиваться. Если нужна реальная перегрузка - используй неопределенные типы параметров.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #17 - 26. Июня 2006 :: 10:21
Печать  
fez писал(а) 24. Июня 2006 :: 14:16:
Вот если тебе НЕ нужна проверка типов, а нужен ТОЛЬКО параметр со значением по умолчанию, то тут попадос, ибо в 1С++ грамотно разрулить это нельзя.

Можешь напомнить почему? Сейчас нельзя или в принципе нельзя?

Цитата:
В "продвинутых" языках отключены параметры по умолчанию.

Да ладно тебе, ты все яву с шарпом в пример приводишь. Бери реально продвинутые языки.
Вот в 1С, к примеру, параметры по умолчанию есть, а перегрузки - нет  Смех

И по существу.
1. Я никак не возьму в толк, зачем нужен неопределенный пустой?
Если ты указал, что у тебя параметр типа СписокЗначений, причем тут неопределенный?
ИМХО при вызове 1cpp должен создать СписокЗначений и передать его в метод.

Если нужен неопределенный, так и нужно писать - неопределенный.
В этом случае 1СPP просто создаст неопределенную переменную и передаст ее в метод.

Или я чего-то не понимаю?

2.
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию(СписокЗначений Список=);
 


Такая запись не нравится мне, если честно.
СписокЗначений Список="" - вполне нормальная запись, должна означать необходимость 1cpp при вызове создать новый объект типа СписокЗначений.

Твоя запись ну как-то вообще в семантике общеизвестных языков не применяется.

P.S.
Разговор не о том, как есть, а о том, как могло бы быть и как было бы правильно.
А то щас скажете, что в действительности все не так, как на самом деле.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #18 - 26. Июня 2006 :: 10:52
Печать  
Хорошо. Давайте сделаем такую запись:
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию(СписокЗначений Список=Nil); 



Можно Nil по-другому обозвать. Только не надо предлагать сделать СписокЗначений Список=ПолучитьПустоеЗначение(). К тому же такой вариант все равно не прокатит.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #19 - 26. Июня 2006 :: 11:03
Печать  
Нет, подожди.

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

Какое отношение Nil имеет к типу СписокЗначений?
Указывая Nil мы отказываемся от проверки типов?
Тогда и надо писать

Код
Выбрать все
void Метод1_СПараметромПоУмолчанию([b]Неопределенный[/b] Парам="");
 



"" - это не строка и не пустое значение. Это директива интерпретатору на создание переменной указанного типа (в данном случае - 'неопределенный') при вызове без явного указания параметра.

Если нужна пустая строка, должно быть
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию([b]Строка[/b] Строка="");
 



Если нужно значение объекта, должно быть
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию([b]Общие.Форма.Привязка[/b] офп="");
 


В этом случае офп должно инициализироваться значением класса (сконструированное по умолчанию). Но это уже не пустое значение.
  

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: Повторная передача параметра по умолчанию
Ответ #20 - 26. Июня 2006 :: 12:10
Печать  
kms писал(а) 26. Июня 2006 :: 11:03:
Если нужно значение объекта, должно быть
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию([b]Общие.Форма.Привязка[/b] офп="");
 


В этом случае офп должно инициализироваться значением класса (сконструированное по умолчанию). Но это уже не пустое значение.


Я так думаю, что в ситуации, когда мы в параметре указываем тип значения - "Общие.Форма.Привязка", а в значении по умолчанию - строку (""), то в языке без строгой типизации (каковым безусловно является 1С) нужно произвести приведение типов. То есть мы должны Строку "" привести к типу "Общие.Форма.Привязка".
То есть это я к тому, чтобы можно было передавать как значения по умолчанию не только объекты, сконструированные по умолчанию. Чтобы запись
Код
Выбрать все
void Метод1_СПараметромПоУмолчанию(СписокЗначений офп="{VL,1,""Один""}"); 


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

А уж как быть в аналогичной ситуации со встроенными объектами (с тем же списком значений) - не представляю вдвойне.
  
Наверх
www  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #21 - 26. Июня 2006 :: 12:16
Печать  
небольшая поправка по поводу
void Метод1_СПараметромПоУмолчанию(Неопределенный Парам="");

эксперимент показал, что
1) когда Парам = ""  , в самом методе мы получим значение типа ""
2) Парам = "111" - в методе опять же пустое значение с типом ""
3) Парам = 111 - в методе получим число 111
4) Парам = ПолучитьПустоеЗначение("Справочник") - в методе получим пустое значение типа "Справочник"
5) Парам = ПолучитьПустоеЗначение("СписокЗначений") - в методе получим пустое значение типа ""
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #22 - 26. Июня 2006 :: 12:20
Печать  
ADirks писал(а) 26. Июня 2006 :: 12:16:
эксперимент показал, что...

полный бардак Улыбка
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #23 - 26. Июня 2006 :: 12:23
Печать  
Не, Федор, чуть не о том речь.

Я имею в виду, что записывая
Цитата:
void Метод1_СПараметромПоУмолчанию(Общие.Форма.Привязка офп="");

речи о передачи строки вообще не идет.

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

Т.е. простой вызов
Цитата:
Метод1_СПараметромПоУмолчанию()
приведет к инициализации офп значением нового объекта класса Общие.Форма.Привязка, созданного конструктором по умолчанию.

Другое дело, что должен делать интерпретатор при таком вызове
Цитата:
Метод1_СПараметромПоУмолчанию("")
или
Метод1_СПараметромПоУмолчанию(0)

Здесь возможны 3 варианта:
1. Можно считать, что переданное пустое значение равносильно неуказанию параметра.
В этом случае должна произойти стандартная инициализация переменной офп новым значением класса

2. Можно пытаться приводить значения, но я не представляю себе, как можно привести строку в объект.
Нет, конечно, можно выполнить поиск конкретного конструктора объекта с указанным параметром (типа строка в данном случае). Но если честно, я не сторонник подобных неявных решений, от них одни проблемы.
Если тебе нужен конкретный офп, созданный из строки - будь любезен, вызови явно нужный конструктор и явно передай его в метод.

3. Можно обламывать сразу на несоответствии типов.

Собственно, мне представляются п. 1 и п. 3. вполне адекватными.
  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #24 - 26. Июня 2006 :: 12:26
Печать  
Да, чё-то тут не то....
и ещё вдогонку
6) Строка Парам = "" - в методе получим пустое значение с типом "Строка"
7) Число Парам = '01.01.2006' - в методе получим эту самую дату
8) Число Парам = "321" - в методе получим строку "321"

на мой взгляд всё правильно, кроме вариантов 1) и 2) - т.е. в значение по умолчанию попадает то чего написали, независимо от заявленного типа. Контроль типов вещь вообще опциональная, но почему такая странность с типом Неопределенный?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

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


Действительно, это труднопонимаемо. Улыбка

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

Единственно, я даже не смотрел, как реализовано сейчас.
Сначала бы определиться как должно быть.
  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #26 - 26. Июня 2006 :: 12:35
Печать  
и ещё вдогонку
9) Неопределенный П1 = ПолучитьПустоеЗначение("Строка")  - в методе наконец-то получим пустое значение типа "Строка"

Насколько я понимаю, в 1С++ нет строгой типизации, а есть лишь контроль типов - и он опционален. Хочешь включил, а хочешь не включил.  В обоих случаях параметры по умолчанию должны вести себя совершенно одинаково.

Да и какая нафик типизация в языке, изначально нетипизированном? Только рантайм контроль, и ничего более.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #27 - 26. Июня 2006 :: 12:37
Печать  
kms писал(а) 26. Июня 2006 :: 12:23:
Я имею в виду, что записывая
Цитата:
void Метод1_СПараметромПоУмолчанию(Общие.Форма.Привязка офп="");

речи о передачи строки вообще не идет.

Я рассматриваю эту запись, именно как семантику инициализации значения по умолчанию значением конкретного типа.

Мне не нравится такая семантика. Уж лучше Nil определить. Хотя Nil мне тоже не нравится.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Повторная передача параметра по умолчанию
Ответ #28 - 26. Июня 2006 :: 12:38
Печать  
А просветите меня, плз

это так сейчас в объявлении класса можно писать, да? я просто никогда так не писал.
Цитата:
4) Парам = ПолучитьПустоеЗначение("Справочник") - в методе получим пустое значение типа "Справочник"
5) Парам = ПолучитьПустоеЗначение("СписокЗначений") - в методе получим пустое значение типа ""


А для непустых значений как писать?
Скажем, я хочу получить пустую IndexedTable, мне как писать?

Я думал, вот так нормально будет
Цитата:
void Метод1_СПараметромПоУмолчанию(IndexedTable ит="");

На семантике ит="" я не настаиваю, но это не Nil, а директива создания объекта.
Т.е. можно так сделать
Цитата:
void Метод1_СПараметромПоУмолчанию(IndexedTable ит=ИндексированнаяТаблица(парам1), Число парам1);

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

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Повторная передача параметра по умолчанию
Ответ #29 - 26. Июня 2006 :: 12:38
Печать  
kms писал(а) 26. Июня 2006 :: 12:29:
ADirks писал(а) 26. Июня 2006 :: 12:16:
небольшая поправка по поводу
void Метод1_СПараметромПоУмолчанию(Неопределенный Парам="");

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


Действительно, это труднопонимаемо. Улыбка

А почему труднопонимаемо?  Всё, что имеет ТипЗначения(Значение) < 100 - можно подсовывать в параметры по умолчанию. А ежели ТипЗначения(Значение) == 100  - то такие типы не подсунешь.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 8
ОтправитьПечать