Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как узнать есть ли у объекта метод? (число прочтений - 16329 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать