Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как узнать есть ли у объекта метод? (число прочтений - 17789 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как узнать есть ли у объекта метод?
15. Сентября 2006 :: 08:05
Печать  
В процедуру передаются объекты двух классов, у них названия методов немного различаются. Нужно как-то проверить наличие метода перед его вызовом. Можно ли так сделать?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #1 - 15. Сентября 2006 :: 08:10
Печать  
Код
Выбрать все
Если ТипЗначенияСтр(объект)="ПервыйОбъект" Тогда
    объект.Метод1();
Иначе
    объект.МетодОдин();
КонецЕсли;
 



Код
Выбрать все
Попытка
    объект.Метод1();
Исключение
    объект.МетодОдин();
КонецПопытки;
 

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #2 - 15. Сентября 2006 :: 08:56
Печать  
Но я давно планирую добавить спец.класс "Информер/Информатор", у которого будет данный метод.
Имхо он нужен.
Например, при работе с групповым контекстом, чтобы не пользоваться попыткой.
  

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #3 - 15. Сентября 2006 :: 10:13
Печать  
спасибо
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #4 - 15. Сентября 2006 :: 10:47
Печать  
es3000 писал(а) 15. Сентября 2006 :: 08:05:
В процедуру передаются объекты двух классов, у них названия методов немного различаются. Нужно как-то проверить наличие метода перед его вызовом. Можно ли так сделать?

А классический полиморфизм не подходит? Единый интерфейс классов сделать можно?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #5 - 15. Сентября 2006 :: 10:49
Печать  
artbear писал(а) 15. Сентября 2006 :: 08:56:
Но я давно планирую добавить спец.класс "Информер/Информатор", у которого будет данный метод.
Имхо он нужен.
Например, при работе с групповым контекстом, чтобы не пользоваться попыткой.

Может, просто доработать MetaInfoClasses::МетодСуществует(<стрИмяКласса>,<стрИмяМетода>)?
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #6 - 18. Сентября 2006 :: 08:16
Печать  
ИМХО
Если алгоритм подразумевает, что ему передается объект, поддерживающий метод "НекийМетод", и ему приходит объект, не поддерживающий этот метод, то такую ситуацию следут трактовать как ошибку, и добиваться того, что бы ситуация впредь не повторялась, путем правки консерватории, а не лепить заплатки, "здесь играем, здесь не играем, а здесь рыбу заворачивали".
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #7 - 18. Сентября 2006 :: 08:39
Печать  
Правильно, такая ситуация является ошибочной. И ее надо как-то обработать.
Например на C# такая ситуация вообще исключена, там проверка типов выполняется при компиляции.

А раз уж 1С позволяет обращаться к объектам без проверки типов, то такие ситуации надо обрабатывать самому, а не пытаться обратиться при помощи конструкции "Попытка / Исключение" неизвестно куда. А для этого хорошо бы определить что это за объект, и обеспечивает ли он ожидаемое поведение.

В технологии COM для этого используются интерфейсы. Я получаю указатель на интерфейс, и потом запрашиваю у него нужное мне поведение.

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


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #8 - 18. Сентября 2006 :: 11:12
Печать  
es3000
А чем, собственно, проверка типа не устраивает?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #9 - 18. Сентября 2006 :: 11:24
Печать  
А если несколько классов реализуют одно и тоже поведение? Проверка типов будет очень длинной. К тому же ее каждый раз придется дополнять при появлении нового класса с такой же функциональностью
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #10 - 18. Сентября 2006 :: 11:48
Печать  
Тут с дизайна бы начать...
  

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: Как узнать есть ли у объекта метод?
Ответ #11 - 18. Сентября 2006 :: 12:02
Печать  
es3000 писал(а) 18. Сентября 2006 :: 11:24:
А если несколько классов реализуют одно и тоже поведение? Проверка типов будет очень длинной. К тому же ее каждый раз придется дополнять при появлении нового класса с такой же функциональностью

А я вот не проверяю нифига. У меня тесты есть для этого.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #12 - 18. Сентября 2006 :: 12:22
Печать  
es3000 писал(а) 18. Сентября 2006 :: 08:39:
А раз уж 1С позволяет обращаться к объектам без проверки типов, то такие ситуации надо обрабатывать самому, а не пытаться обратиться при помощи конструкции "Попытка / Исключение" неизвестно куда. А для этого хорошо бы определить что это за объект, и обеспечивает ли он ожидаемое поведение.

Ты недопонял, что я хотел сказать.
Как раз и не надо никаких ПопытокИсключений, и Если ТипЗначения.
Я пишу
об.Метод();
и все.
Если вдруг оказалось, что пришел объект без Метод(), вывалится ошибка, и дальше уже надо разбираться, как так вышло, что пришел объект без Метод(), а не городить огород с попытками.
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #13 - 18. Сентября 2006 :: 14:08
Печать  
kms писал(а) 18. Сентября 2006 :: 11:48:
Тут с дизайна бы начать...


Поддерживаю.
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #14 - 18. Сентября 2006 :: 14:49
Печать  
Я вот тоже подумывал о реализации интерфейсов, но, похоже, 1С++ еще не дорос до этого уровня.

А пока я согласен с Орефковым. Если в коде объект.Метод() произошла ошибка, значит надо найти откуда она выросла.

И кстати, в качестве интерфейса достаточно определить пустой класс, наследовать от него и включить контроль типов. Тогда все эти ошибки и вылезут.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #15 - 19. Сентября 2006 :: 04:35
Печать  
Даже в приложении среднего уровня я думаю не обойтись наследованием от одного базового класса. Такая ситуация очень часто встречается, когда какие-то действия реализуются несколькими базовыми классами. Реализация интерфейсов или что-то подобное пригодилось бы.

Цитата:
Если в коде объект.Метод() произошла ошибка, значит надо найти откуда она выросла

То есть вы предлагаете запустить программу, протестировать эту ветку, и если есть ошибка, то исправлять. Но в каком виде мы получим ошибку? Опять же в виде исключения, которое будет отображаться в окне сообщений в 1С-ке. Это исключение может нарушить работу моей программы, и чтобы этого не произошло, надо опять таки обработать это исключение (Попытка/Исключение). А если учитывать, что программа может разрабатываться несколькими разработчиками, и мне может быть передан в качестве параметра любой класс, то получается что мне надо вызов каждого метода чужого класса заключать в обработчик исключения? Так мы далеко зайдем... Гораздо проще было бы проверить для этого класса "ты такой-то?", если "да", то "делай то что нужно"...

Цитата:
в качестве интерфейса достаточно определить пустой класс, наследовать от него и включить контроль типов. Тогда все эти ошибки и вылезут

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

То есть все таки было бы удобно определять какую функциональность реализует конкретный класс: или через механизм типа интерфейсов или просто через проверку наличия метода Улыбка
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #16 - 19. Сентября 2006 :: 05:20
Печать  
es3000
Хм... какова цель проверки?
Проверка в целях безопасности недавно обсуждалась.
Если же речь идет о Цитата:
В процедуру передаются объекты двух классов, у них названия методов немного различаются.
, выход один - проверять тип. Причем, зачастую, достаточно проверить базовый тип объекта.

  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #17 - 19. Сентября 2006 :: 07:21
Печать  
В моем конкретном случае - да.
Но коль уж речь зашла о более глобальных вещах, тогда проверки типов будет недостаточно
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #18 - 19. Сентября 2006 :: 08:08
Печать  
es3000 писал(а) 19. Сентября 2006 :: 07:21:
... тогда проверки типов будет недостаточно

Недостаточно для чего?

зы: Предположим, в проекте есть сотня классов с методом "Добавить()". В некоторых классах метод добавляет строку в табличную часть документа, в других - добавляет новый элемент справочника и т.п. Т.е. без информации о типе объекта невозможно гарантировать правильность алгоритма.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #19 - 19. Сентября 2006 :: 08:48
Печать  
Цитата:
Недостаточно для чего

Недостаточно для определения того, что делает класс.

Цитата:
Предположим, в проекте есть сотня классов с методом "Добавить()". В некоторых классах метод добавляет строку в табличную часть документа, в других - добавляет новый элемент справочника и т.п. Т.е. без информации о типе объекта невозможно гарантировать правильность алгоритма

Да, но разные типы могут делать одно и тоже. И если я делаю новый класс, который делает то же самое, он должен как-то сообщать о том что он делает.  Я не обязан его наследовать от уже готового класса с тем же поведением по многим причинам.
Ваше утверждение надо перефразировать так: "Т.е. без информации о поведении объекта невозможно гарантировать правильность алгоритма". Это "поведение объекта" называется интерфейсом. Можно придумать вместо интерфейса какой-нибудь идентификатор и т.д.
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #20 - 19. Сентября 2006 :: 09:09
Печать  
es3000
Цитата:
Но коль уж речь зашла о более глобальных вещах, тогда проверки типов будет недостаточно

Цитата:
Недостаточно для определения того, что делает класс

Это новость! Как же мы работали до сих пор? Подмигивание

В любом случае, метод не может быть определен отдельно от интерфейса (класса).
Т.е. только имя метода, без типа, не позволяет нам идентфицировать поведение объекта.
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #21 - 19. Сентября 2006 :: 09:23
Печать  
Цитата:
В любом случае, метод не может быть определен отдельно от интерфейса (класса).
Т.е. только имя метода, без типа, не позволяет нам идентфицировать поведение объекта.

Ну, есть такое понятие - Duck Interface
Крякаят - значит утка Улыбка
Как раз про 1С
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #22 - 19. Сентября 2006 :: 10:29
Печать  
orefkov
Я и подвожу автора к этой мысли Подмигивание

зы: хотя, сначала, речь шла, несколько, не об этом...
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #23 - 19. Сентября 2006 :: 10:48
Печать  
es3000 писал(а) 19. Сентября 2006 :: 04:35:
Цитата:
Если в коде объект.Метод() произошла ошибка, значит надо найти откуда она выросла

То есть вы предлагаете запустить программу, протестировать эту ветку, и если есть ошибка, то исправлять. Но в каком виде мы получим ошибку? Опять же в виде исключения, которое будет отображаться в окне сообщений в 1С-ке. Это исключение может нарушить работу моей программы, и чтобы этого не произошло, надо опять таки обработать это исключение (Попытка/Исключение). А если учитывать, что программа может разрабатываться несколькими разработчиками, и мне может быть передан в качестве параметра любой класс, то получается что мне надо вызов каждого метода чужого класса заключать в обработчик исключения?


Неправильная логика. Эта тема освещается в любой книжке, где описывается обработка исключений.

Если была ошибка, то нужно видеть, где она возникла. И своевременно принимать решения. Если программа выполнится до конца, не смотря на то, что возникла ошибка, то как можно быть уверенным в работе этой программы? В ее результатах.

Обработка исключений для того и задумывалась, чтобы программы можно было писать так, как будто при их работе не возникает ошибок. При этом не надо отслеживать возникновение ошибок ВЕЗДЕ. И каждый тип исключения должен обрабатываться на своем уровне. В данном случае ошибка должна быть обработана не на уровне программы, а на уровне программиста.

Цитата:
Так мы далеко зайдем... Гораздо проще было бы проверить для этого класса "ты такой-то?", если "да", то "делай то что нужно"...

То есть все таки было бы удобно определять какую функциональность реализует конкретный класс: или через механизм типа интерфейсов или просто через проверку наличия метода


Так интерфейсы - это и есть еще одна (или не одна) иерархия.

А пустые классы (в данном случае) - это и есть интерфейсы. Правда сейчас нельзя заставить класс, реализующий интерфейс иметь какой-то метод.  Печаль
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #24 - 19. Сентября 2006 :: 10:59
Печать  
Цитата:
Это новость! Как же мы работали до сих пор?


Согласен не совсем точно я выразился. 
Точнее будет так. Проверки типов будет недостаточно для написания универсальной обработки объектов, которые обеспечивают одинаковое поведение, но могут быть реализованы разными разработчиками и соотвественно могут иметь разные типы.
Опять же повторяю - тут придумывать нечего - для этого есть интерфейсы.

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


Цитата:
Ну, есть такое понятие - Duck Interface

В 1С++ уже столько всего полезного сделано, что можно еще чуть-чуть добавить, чтобы превратить из Duck Interface в нормальную систему.

  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #25 - 19. Сентября 2006 :: 11:04
Печать  
sedmin
В общем согласен насчет исключений, но создавать обработчик исключения с целью проверить наличие метода - это уже слишком

Цитата:
Так интерфейсы - это и есть еще одна (или не одна) иерархия

Да, иерархия, но иерархия поведения, не связанная с реализацией, что как раз и требуется
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #26 - 19. Сентября 2006 :: 11:39
Печать  
es3000

Цитата:
Проверки типов будет недостаточно для написания универсальной обработки объектов, которые обеспечивают одинаковое поведение, но могут быть реализованы разными разработчиками и соотвественно могут иметь разные типы.

Хех... Типы, значит, могут быть разными, а сигнатуры (не говоря уже о назначении) этих методов разными быть не могут? Подмигивание

Цитата:
... чтобы не привязываться к типам ..., я хотел пирвязаться ... к имени метода. Раз уж в 1С++ такой возможности нету...

Вот чудак-человек! Подмигивание Как нету?! Сам же пишешь про Duck Interface! Подмигивание

Ладно, резюмирую еще раз:
- если речь [все еще Подмигивание] идет о вопросе в начале ветки, то проверки типов не избежать. При этом проверять наличие метода уже не требуется.
- если речь идет об объектах, имеющих абсолютно одинаковые снаружи методы, проверять вообще ничего не требуется: Duck Interface в действии.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #27 - 19. Сентября 2006 :: 12:01
Печать  
Цитата:
Хех... Типы, значит, могут быть разными, а сигнатуры (не говоря уже о назначении) этих методов разными быть не могут?


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


Цитата:
Как нету?! Сам же пишешь про Duck Interface


Ну если я просто в коде вставлю вызов метода, которого нету, то получу ошибку что-то типа "не найден метод агрегатного объекта". А конструкцию "Попытка / Исключение" для определения наличия метода, я считаю не возможностью языка, а его так сказать извращением за неимением лучшего


Цитата:
если речь идет о вопросе в начале ветки, то проверки типов не избежать


Да, к сожалению не избежать. Хотя это большое ограничение, ну в 1С к этому не привыкать, я просто думал может 1С++ в этом как-то поможет
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #28 - 19. Сентября 2006 :: 12:08
Печать  
es3000
Да я в курсе про интерфейсы. Подмигивание
Только, какое они имеют отношение к 1С и 1С++?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как узнать есть ли у объекта метод?
Ответ #29 - 19. Сентября 2006 :: 12:42
Печать  
Ну пока никакого
Я говорил о том что везде уже есть для решения подобных задач
Но ведь все развивается, 1С++ тоже развивается, можно эти полезные идеи воплотить в этой библиотеке
А начать можно с чего-нибудь типа "МетодСуществует" Улыбка
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #30 - 19. Сентября 2006 :: 13:12
Печать  
es3000 писал(а) 19. Сентября 2006 :: 12:42:
А начать можно с чего-нибудь типа "МетодСуществует" Улыбка

Ты будешь долго смеяться, но такой метод уже есть - у класса MetaInfoClasses. Хотя и имеет ограниченную ценность: Цитата:
метод работает, только для тех методов, которые были определенных в файлах - определений классов (*.prm).
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #31 - 19. Сентября 2006 :: 13:56
Печать  
Если автор хочет, чтобы класс сам рассказывал о том, является ли он уткой или нет - наверное ему стоит подумать о внедрении в сам класс (во все его классы) метода (методов), которые и будут отвечать на поставленный вопрос. ЯУтка(), ЯСлон(), ЯХобот() и так далее.

Проблемы две.
1. Поскольку ответ может быть и отрицательным - нужно наследовать все классы от некоторого базового класса, который реализует ВСЮ тонну этих методов и возвращает ложь из каждого.
2. Даже положительный ответ на вопрос ЯУтка() не гарантирует наличия у класса метода Крякать(). Программист мог просто ошибиться и забыть про него.

Стоит ли городить весь этот огород ради сомнительного удовольствия сомнительной универсальности - решать каждому самостоятельно.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #32 - 19. Сентября 2006 :: 15:31
Печать  
es3000 писал(а) 19. Сентября 2006 :: 11:04:
sedmin
В общем согласен насчет исключений, но создавать обработчик исключения с целью проверить наличие метода - это уже слишком


Так таких исключений и не должно возникать. И обрабатывать их не надо. Потому что это не исключительные ситуации среды исполнения, а ошибки программиста. А если они возникли и ты их обработал - значит ты замазал ошибку толстым слоем краски, и она вылезет у тебя в другом месте.

Например, у тебя будут неверные результаты работы программы. И ты будешь долго искать, почему так получилось. Это разве лучше? Ошибка должна проявляться как можно раньше. Иначе отладка программы превращается в мучение.

Цитата:
Цитата:
Так интерфейсы - это и есть еще одна (или не одна) иерархия

Да, иерархия, но иерархия поведения, не связанная с реализацией, что как раз и требуется


Так пожалуйста. 1С++ поддерживает множественное наследование. Так что никто не мешает тебе реальные классы наследовать в том числе от пустых - интерфейсов.

PS. Кстати, совем недавно пол дня промучился с тем, что не мог выловить ошибку - не возникало исключения, хотя процесс исполнения прерывался. И я никак не мог найти, где  же возникает ошибка. Осложнялось еще все тем, что в классах нет отладки. Оказалось, что после того, как поймаешь исключение, возникшее в методе, вызванном через Делегат, следующие исключения генерируются, но с пустым сообщением. Вообщем, удовольствие еще то.

Вывод. Плохо, когда не возникает исключений там, где они должны быть.

PPS. О! Кстати! Сегодня не менее часа искал ошибку. Оказалость в вызове метода пропустил запятую. Стоило включить проверку типов - и ошибка как на ладони!
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #33 - 21. Сентября 2006 :: 11:17
Печать  
Народ, я считаю, что метод, который показывает наличие нужного метода у любого объекта, обязательно должен быть.
ООП здесь может и не участвовать.
Например, я сделал перехват событий формы группового контекста в какой-нибудь класс, обработал нужный вызов в классе, и теперь хочу перенаправить это событие в саму форму. Так вот, если в форме нет обработчика события, будет выдано тупое исключение "метод не найден".
И здесь речь именно об универсальном использовании для любых форм.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как узнать есть ли у объекта метод?
Ответ #34 - 21. Сентября 2006 :: 13:20
Печать  
Я не против метода. Я против неправильного его использования.

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #35 - 21. Сентября 2006 :: 13:41
Печать  
sedmin писал(а) 21. Сентября 2006 :: 13:20:
Я не против метода. Я против неправильного его использования.

+1

sedmin писал(а) 21. Сентября 2006 :: 13:20:
С другой стороны, чувствую, что есть подвох в твоем варианте использования, но пока не знаю какой.  Улыбка

Да нет тут никакого подвоха. Нормальное желание расширить стандартный обработчик события, если таковой имеется.

Подвох если и может спрятаться, то только опять же в неправильном использовании Улыбка
  
Наверх
www  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Как узнать есть ли у объекта метод?
Ответ #36 - 28. Сентября 2006 :: 11:32
Печать  
ИМХО, если метод проверки наличия метода Улыбка  будет - никому от этого хуже не станет. На сегодняшний момент "Попытка" является единственным гарантированным методом определения. К сожалению, введя обработку исключений, в 1С не озаботились определением типа возникшего исключения. Потому нельзя сказать, возникло ли исключение потому что метода нет, или в самом методе ошибка. Наверно, именно это имели в виду предыдущие ораторы, когда орали на попытку.

Чтоб реабилитировать попытку и утиные интерфейсы, приведу контр-пример (считаем, что 1С++/формэкс у нас нет): необходимо выполнять некие действия над справочником/документом, действия выбираются из меню, меню вызывается по кнопке на форме. При этом часть действий одинаковая для объектов разного типа, часть - различная (например, справочник провести нельзя). Кнопка может располагаться  в формах: документа, элемента справочника; а также в списках(журналах) - в  последнем случае должны вызываться действия над текущей записью. 
Так вот, логично было бы все это дело оформить как процедуру в ГМ, а в формы повставлять кнопку с ее вызовом с передачей контекста. Однако тут встает проблема определения допустимых действий: по типу-низя (ТипЗначения переданного контекста - ГрупповойКонтекст). Можно конечно еще одним параметром передать "что это" (но чем меньше параметров, тем лучше), или вообще сделать разные процедуры для разных форм (но тогда дублируем код для общих действий). Вот-тут то и подойдет "Попытка" как средство определения типа:
Код
Выбрать все
Попытка
    Конт.НачалоИнтервала();
	Объект=Конт.ТекущийДокумент;
	ЭтоДок=1;
	ЭтоСписок=1;
Исключение
	Попытка
	    Объект=Конт.ТекущийДокумент();
		ЭтоДок=1;
	Исключение
		Попытка
		    Объект=Конт.ТекущийЭлемент();
			ЭтоСпр=1;
		Исключение
			ЭтоКакаяТоФигня=1;
			Возврат;
		КонецПопытки;
		Попытка
		    Конт.ПолучитьОтбор();
			ЭтоСписок=1;
		Исключение
		КонецПопытки;
	КонецПопытки;
КонецПопытки;
 


Вот такая вот лесенка. Если ходит как утка и крякает, как утка - то это утка и есть. И значит плавать должна тоже.
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать