Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ПолучитьТекущийОбъект() (число прочтений - 34396 )
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
ПолучитьТекущийОбъект()
02. Июня 2006 :: 08:40
Печать  

По следам ЗаменитьЭксзБазовогоКласса - 2.

А по поводу полиморфизма - так все очень просто.
У на явно не хватает механизма отсечения полиморфизма - вот это основная проблема.
И отсечения доступа к соседним суперклассам, кстати.

Для этого нужен метод получения текущего контекста без наследников.
Типа
Код
Выбрать все
_Сам = Сам.ПолучитьТекущийОбъект();
 


После этого _Сам.ПолучитьБазовыйОбъект() и _Сам.ЗаменитьБазовыйОбъект() будут выполняться в контексте текущего объекта, неполиморфно.

То же самое я могу делать для методов, которые у меня не являются полиморфными, но которые могут быть определены в наследниках.
Сейчас вместо метода текущего класса возможен вызов метода наследника через Сам(Контекст), если наследник определил вызываемый экспортный метод.
При добавлении наследников мой класс может начать работать неверно. Эта ситуация недопустима.
(я рассматриваю случай "нелегального" полиморфизма).

Таким образом для неполиморфных (невиртуальных) функций я явно использую Сам(Контекст).ПолучитьТекущийОбъект(), а для виртуальных - традиционный Сам(Контекст).

P.S. чуть орфографию исправил.
« Последняя редакция: 02. Июня 2006 :: 10:46 - kms »  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #1 - 02. Июня 2006 :: 08:47
Печать  

А, да, не сказал. Это предложение такое для внесения в 1с++ как один из механизмов усиления контроля и решения ситуаций повторного наследования. Такого метода пока нету.
« Последняя редакция: 02. Июня 2006 :: 10:46 - kms »  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #2 - 02. Июня 2006 :: 08:55
Печать  
Ой.
А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.
Тогда и полиморфизм будет работать, и ЗаменитьБазовыйОбъект() и ПолучитьБазовыйКласс() тоже.

Это лучший вариант?
« Последняя редакция: 02. Июня 2006 :: 10:47 - kms »  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #3 - 02. Июня 2006 :: 09:01
Печать  
Код
Выбрать все
Проведение			  Регистры				   Регистры
|					  |					    |
|				  Регистр_Товары			Регистр_Взаиморасчеты
|					  |					    |
---------------------------------------------------------------------
					   |
				    Док_Продажа
 


Т.е. находясь в классе Регистр_Взаиморасчеты нужно отсекать все контексты, кроме Регистры<- Регистр_Взаиморасчеты <- Док_Продажа.

И делать это нужно в лучшем случае - автоматически
В худшем - через вызов какого-то служебного метода.

Мы решим проблему и повторного наследования (ромбы) и полиморфизм не пострадает и доступ из суперкласса в суперкласс будет невозможен.

отредактировано:
P.S. Если делать автоматически - привет обратной совместимости.
Но делать можно - только флаг в настройки компоненты нужно добавить.

отредактировано 2:
Останется нарушение с доступом из суперкласса к членам (переменным) подкласса, но это уже цветочки.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #4 - 02. Июня 2006 :: 09:38
Печать  
Вот с этим я согласен, двумя руками за. Про это я и писал в последнем посте в старой ветке.

Только я не понял вот этого:
kms писал(а) 02. Июня 2006 :: 09:01:
Т.е. находясь в классе Регистр_Взаиморасчеты нужно отсекать все контексты, кроме Регистры<- Регистр_Взаиморасчеты <- Док_Продажа.

Как это можно НЕ отсечь Док_Продажа? Ты создашь объект, который пронаследован, но ущербно?

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

... и доступ из суперкласса в суперкласс будет невозможен.

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #5 - 02. Июня 2006 :: 09:45
Печать  
Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

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


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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ПолучитьТекущийОбъект()
Ответ #7 - 02. Июня 2006 :: 09:53
Печать  
orefkov писал(а) 02. Июня 2006 :: 09:45:
Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.

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

sedmin
Ну ты-то должен понять, я был уверен, ты первым поймешь.

Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

В точности, как сказал orefkov.

Остается 2 проблемы:
  • возможность вызова методов подкласса без объявления интерфейса в суперклассах
  • доступ к свойствам подкласса из суперклассов

    Но, согласись, уровень этих проблем - совсем другой.
  •   

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #8 - 02. Июня 2006 :: 09:55
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 09:48:
    Ведь потом можно вызвать виртуальный метод, который будет пользоваться как раз отсеченной функциональностью.  Озадачен


    Вот это как раз исключительно правильная реализация будет.
    Полностью соответствует концепции ООП.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #9 - 02. Июня 2006 :: 10:31
    Печать  
    Странно это как-то.

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

    Только не нравится мне автоматическое преобразование. Уж лучше пойти по пути Smalltalk - запрещать все на этапе компиляции.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #10 - 02. Июня 2006 :: 10:38
    Печать  
    Не понял. Преобразование чего? Речь идет о поиске, этого достаточно.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #11 - 02. Июня 2006 :: 10:40
    Печать  
    kms писал(а) 02. Июня 2006 :: 09:53:
    sedmin
    Ну ты-то должен понять, я был уверен, ты первым поймешь.

    Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
    Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

    В точности, как сказал orefkov.

    Остается 2 проблемы:
  • возможность вызова методов подкласса без объявления интерфейса в суперклассах
  • доступ к свойствам подкласса из суперклассов

    Но, согласись, уровень этих проблем - совсем другой.


  • Да какой другой. Это все про то же самое.

    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект.ВиртуальныйМетод()?
      
    Наверх
     
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #12 - 02. Июня 2006 :: 10:40
    Печать  
    kms писал(а) 02. Июня 2006 :: 09:53:
    sedmin
    Ну ты-то должен понять, я был уверен, ты первым поймешь.

    Если мы создаемРегистр_Взаиморасчеты как самостоятельный объект, то ни о каком Док_Продажа речи нет.
    Но если мы вызываем метод класса Регистр_Взаиморасчеты из объекта Док_Продажа, тогда нам должны быть доступны публичные методы суперклассов, методы класса Регистр_Взаиморасчеты и методы класса Док_Продажа, реализующие виртуальные методы указанных суперклассов и реализующие полиморфное поведение.

    В точности, как сказал orefkov.

    Остается 2 проблемы:
  • возможность вызова методов подкласса без объявления интерфейса в суперклассах
  • доступ к свойствам подкласса из суперклассов

    Но, согласись, уровень этих проблем - совсем другой.


  • Да какой другой. Это все про то же самое.

    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект().ВиртуальныйМетод()?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #13 - 02. Июня 2006 :: 10:43
    Печать  
    orefkov писал(а) 02. Июня 2006 :: 09:45:
    Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.


    Цитата:
    Остается 2 проблемы:

    1. возможность вызова методов подкласса без объявления интерфейса в суперклассах
    2. доступ к свойствам подкласса из суперклассов


    А эти проблемы - проще не придумаешь. Решения:

    1. поиск методов вести только среди виртуальных, определенных в текущем контексте исполнения (с учетом интерфейсов суперклассов) - т.е. только в пределах интерфейса текущего контекста.
    2. поиск свойств вести только от текущего контекста исполнения вниз.

    чуть отредактировал
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #14 - 02. Июня 2006 :: 10:46
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 10:40:
    Ответь на простой вопрос:
    Что будет выдавать ТипЗначенияСтр(Сам.ПолучитьТекущийОбъект())?

    И еще на один вопрос, посложнее:
    Что будет выдавать ТипЗначенияСтр(Сам()), если его вызвать из виртуального метода наследника, если в родителе была выполнена строка Сам.ПолучитьТекущийОбъект().ВиртуальныйМетод()?

    sedmin, не тормози! сникерсни!

    Никаких ПолучитьТекущийОбъект() не будет, смотри все, начиная с поста 2 (который начинается с Ой).

    P.S.
    Первый пост зачеркиваю.
      

    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: ПолучитьТекущийОбъект()
    Ответ #15 - 02. Июня 2006 :: 10:53
    Печать  
    kms писал(а) 02. Июня 2006 :: 08:55:
    Ой.
    А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.
    Тогда и полиморфизм будет работать, и ЗаменитьБазовыйОбъект() и ПолучитьБазовыйКласс() тоже.

    Это лучший вариант?


    Насколько я понимаю, это то же самое, что сказано вот тут: http://www.1cpp.ru/forum/YaBB.pl?num=1149163670 , только другими словами.
    Цитата:
    ПолучитьБазовыйКласс() не обеспечивает неполиморфности в модуле самого класса.
    Если бы была возможность написать что-то вроде Сам(Контекст).ПолучитьБазовыйКласс(Сам(Контекст)), с тем, чтобы получить такой же Сам(Контекст), но неполиморфный, тогда коллизию удалось бы избежать.


    Разве нет? Так что я похоже за. Улыбка
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #16 - 02. Июня 2006 :: 10:57
    Печать  
    Нет, это не то же самое.
    Все методы остаются полиморфными, но ровно настолько, насколько это допустимо.

    Но, Федор. Какая, блин, разница. С удовольствием принимаю тебя в соавторы. Подмигивание
    Собственно, если бы не ты, я бы обо всем не стал бы думать.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #17 - 02. Июня 2006 :: 11:06
    Печать  
    1. Я за явное преобразование.

    2. Ответь на мои вопросы, просто замени явное преобразование на неявное.

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


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

    Сообщений: 2712
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: ПолучитьТекущийОбъект()
    Ответ #18 - 02. Июня 2006 :: 11:07
    Печать  
    kms писал(а) 02. Июня 2006 :: 08:55:
    О
    А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.


    Я не стал выделять новый метод, а попытался расширить возможность существующего. Типа чтобы через ПолучитьБазовыйКласс() можно было передать получить не только базовый класс, но и текущий тоже. С отсеченными остальными ветками, кроме текущей.

    А дальше - если нам нужен обратносовместимый полиморфизм - пользуемся Сам(Контекст). Если нам нужна только текущая ветка иерархии - пользуемся Сам(Контекст).ПолучитьТекущийКласс(). Ага?
      
    Наверх
    www  
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #19 - 02. Июня 2006 :: 11:21
    Печать  
    fez писал(а) 02. Июня 2006 :: 11:07:
    Я не стал выделять новый метод, а попытался расширить возможность существующего. Типа чтобы через ПолучитьБазовыйКласс() можно было передать не только базовый класс, но и текущий тоже. С отсеченными остальными ветками, кроме текущей.


    Эта фраза неоднозначна. Причем в обоих вараинтах есть недостатки. Поясни, что ты хотел сказать.

    Цитата:
    А дальше - если нам нужен обратносовместимый полиморфизм - пользуемся Сам(Контекст). Если нам нужна только текущая ветка иерархии - пользуемся Сам(Контекст).ПолучитьТекущийКласс(). Ага?


    Зачем изобрететь велосипед? При ПолучитьТекущийКласс() тоже остаются проблемы.
    Надо просто реализовать dynamic_cast.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #20 - 02. Июня 2006 :: 11:28
    Печать  
    sedmin
    Нет. Это ты ответь. Что такое Сам(). Вопрос полностью серьезный и важный для понимания.
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #21 - 02. Июня 2006 :: 11:30
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 11:06:
    1. Я за явное преобразование.

    2. Ответь на мои вопросы, просто замени явное преобразование на неявное.

    3. Получается Сам() будет выдавать разный результат  при вызове из одного и того же метода наследника в зависимости от того, откуда был вызван этот виртуальный метод?

    Пока ты думаешь, отвечу.

    1. Это твое право.
    2. Вопросы задавай заново, как я буду отвечать на конкретные вопросы, когда условия изменились.
    3. Нет, не будет.

    п. 1 изложу так: это твое право, для других - необходимо обоснование
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #22 - 02. Июня 2006 :: 11:32
    Печать  
    Добавлю, чтоб было понятно.

    Ни о каких преобразованиях типов речь не идет. Я где о преобразованиях типов писал?
    Они не нужны. Абстрагируйся от идеи dynamic_cast или объясни, зачем он тебе нужен.

    Открой Страуструпа, посмотри его примеры и назначение dynamic_cast.
    Посмотри его реализацию в С++ и объясни, зачем он нужен в 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: ПолучитьТекущийОбъект()
    Ответ #23 - 02. Июня 2006 :: 11:45
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 11:21:
    fez писал(а) 02. Июня 2006 :: 11:07:
    Я не стал выделять новый метод, а попытался расширить возможность существующего. Типа чтобы через ПолучитьБазовыйКласс() можно было передать не только базовый класс, но и текущий тоже. С отсеченными остальными ветками, кроме текущей.


    Эта фраза неоднозначна. Причем в обоих вараинтах есть недостатки. Поясни, что ты хотел сказать.

    Я ошибся. Поправил одно слово, старое оставил зачеркнутым.

    Цитата:
    При ПолучитьТекущийКласс() тоже остаются проблемы.

    Какие?

    Цитата:
    Надо просто реализовать dynamic_cast.

    Я не знаю, что это означает.
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #24 - 02. Июня 2006 :: 11:48
    Печать  
    fez
    Пусть сначала sedmin ответит, зачем ему dynamic_cast.
    Явно преобразовывать один супер в другой? Нахуа?
    Тем более, что есть полноценный механизм type_info.

    Вообще, без ответов на поставленные мной вопросы, дальше разговаривать тяжело, т.е. нет согласования реальностей.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #25 - 02. Июня 2006 :: 12:01
    Печать  
    kms писал(а) 02. Июня 2006 :: 11:28:
    sedmin
    Нет. Это ты ответь. Что такое Сам(). Вопрос полностью серьезный и важный для понимания.


    Сам() для меня this или self. Указатель на текущий объект. И ТипЗначенияСтр(Сам()) всегда должен быть равен ТипЗначенияСтр(СоздатьОбъект()). Ну за исключением тех случаев, когда ты его (объект) намеренно во что-то преобразовал.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #26 - 02. Июня 2006 :: 12:02
    Печать  
    fez писал(а) 02. Июня 2006 :: 11:07:
    kms писал(а) 02. Июня 2006 :: 08:55:
    О
    А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.


    Я не стал выделять новый метод, а попытался расширить возможность существующего. Типа чтобы через ПолучитьБазовыйКласс() можно было передать получить не только базовый класс, но и текущий тоже. С отсеченными остальными ветками, кроме текущей.

    А дальше - если нам нужен обратносовместимый полиморфизм - пользуемся Сам(Контекст). Если нам нужна только текущая ветка иерархии - пользуемся Сам(Контекст).ПолучитьТекущийКласс(). Ага?

    Давай еще раз внесу ясность, как должно быть.

    ПолучитьБазовыйКласс() - это полностью виртуальный метод. ЗаменитьБазовыйОбъект() - тоже.
    Они определены в каждом классе.
    Любой экспортный метод суперкласса - виртуальный и может быть переопределен в подклассах.
    Набор виртуальных методов определяет интерфейс класса.

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

    Как мы осуществляем поиск метода в подклассе сейчас? Мы начинаем с самого верхнего уровня и идем вниз.
    Как мы осуществляем поиск метода в суперклассе сейчас? Также.

    В этом проблема.
    Так вот, единственное, что нам нужно сделать - это изменить алгоритм поиска при выполнении в контекстах суперклассов.
    Мы снова начинаем с самого верхнего уровня, но принимаем во внимание только ветки, которые приводят нас к контексту текущего исполнения (контекст суперкласса), проходим его и идем дальше вниз.

    То же самое, для методов ПолучитьБазовыйКласс() и ЗаменитьЭксзБазовогоКласса().
    Поскольку мы не видим из одного супера объекты и методы других суперов, они продолжают работать корректно.

    Понял? Оцени красоту идеи.
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #27 - 02. Июня 2006 :: 12:03
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:01:
    kms писал(а) 02. Июня 2006 :: 11:28:
    sedmin
    Нет. Это ты ответь. Что такое Сам(). Вопрос полностью серьезный и важный для понимания.


    Сам() для меня this или self. Указатель на текущий объект. И ТипЗначенияСтр(Сам()) всегда должен быть равен ТипЗначенияСтр(СоздатьОбъект()). Ну за исключением тех случаев, когда ты его (объект) намеренно во что-то преобразовал.

    Ну, правильно. Так и будет.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #28 - 02. Июня 2006 :: 12:05
    Печать  
    fez писал(а) 02. Июня 2006 :: 11:45:
    Цитата:
    При ПолучитьТекущийКласс() тоже остаются проблемы.

    Какие?


    Сначала ты ответь на вопрос: Что вернет ТипЗначенияСтр(Сам().ПолучитьТекущийКласс()), если его вызвать в родителе? "Родитель" или "Потомок"?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #29 - 02. Июня 2006 :: 12:07
    Печать  

    sedmin

    Завязывай с некорректными вопросами.
    Я же сказал, никаких ПолучитьТекущийКласс() не будет.
    Врубись, пожалуйста, и не будем обсуждать то, чего нет!
      

    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: ПолучитьТекущийОбъект()
    Ответ #30 - 02. Июня 2006 :: 12:08
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:02:
    Понял? Оцени красоту идеи.

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

    Мое предложение вот в чем: давайте дадим разработчику приложения свободу выбора. Захочет - воспользуется старым механизмом поиска метода в иерархии (вызвав метод через Сам(Контекст)). Захочет - воспользуется твоим новым поиском с помощью некоторого нового метода Сам(Контекст).ПолучитьТекущуюВеткуИерархии().
      
    Наверх
    www  
    IP записан
     
    fez
    Forum Administrator
    1c++ power user
    Отсутствует


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

    Сообщений: 2712
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: ПолучитьТекущийОбъект()
    Ответ #31 - 02. Июня 2006 :: 12:10
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:05:
    fez писал(а) 02. Июня 2006 :: 11:45:
    Цитата:
    При ПолучитьТекущийКласс() тоже остаются проблемы.

    Какие?


    Сначала ты ответь на вопрос: Что вернет ТипЗначенияСтр(Сам().ПолучитьТекущийКласс()), если его вызвать в родителе? "Родитель" или "Потомок"?


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


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

    Сообщений: 2712
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: ПолучитьТекущийОбъект()
    Ответ #32 - 02. Июня 2006 :: 12:11
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:07:

    sedmin

    Завязывай с некорректными вопросами.
    Я же сказал, никаких ПолучитьТекущийКласс() не будет.
    Врубись, пожалуйста, и не будем обсуждать то, чего нет!


    Эта. Не рви мне шаблон, пожалуйста. И седмину тоже Улыбка
    Сегодня моя очередь оффтопить в твоей ветке.
      
    Наверх
    www  
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #33 - 02. Июня 2006 :: 12:11
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:02:
    Понял? Оцени красоту идеи.


    Будут разные результаты работы одного и того же метода потомка в зависимости от стека вызовов.
    Наверное, правильно сделать так, чтобы методы текущего родителя былы лишь БОЛЕЕ ПРИОРИТЕТНЫ, чем методы другого родителя. Иначе потомок совсем не сможет вызватьв виртуальных методах НИКАКИХ методов других родителей.

    ОФФ: Почему здась такой хреновый радактор? Без откатов и т.д.?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #34 - 02. Июня 2006 :: 12:12
    Печать  
    fez писал(а) 02. Июня 2006 :: 12:11:
    kms писал(а) 02. Июня 2006 :: 12:07:

    sedmin

    Завязывай с некорректными вопросами.
    Я же сказал, никаких ПолучитьТекущийКласс() не будет.
    Врубись, пожалуйста, и не будем обсуждать то, чего нет!


    Эта. Не рви мне шаблон, пожалуйста. И седмину тоже Улыбка
    Сегодня моя очередь оффтопить в твоей ветке.

    Черт рыжий. Ладно, оффтопь. Смех
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #35 - 02. Июня 2006 :: 12:15
    Печать  
    fez писал(а) 02. Июня 2006 :: 12:10:
    sedmin писал(а) 02. Июня 2006 :: 12:05:
    fez писал(а) 02. Июня 2006 :: 11:45:
    Цитата:
    При ПолучитьТекущийКласс() тоже остаются проблемы.

    Какие?


    Сначала ты ответь на вопрос: Что вернет ТипЗначенияСтр(Сам().ПолучитьТекущийКласс()), если его вызвать в родителе? "Родитель" или "Потомок"?


    "Родитель". Ну то есть мне бы хотелось, чтобы так было.


    Вот с этим я согласен. И тогда ему не доступны никакие методы потомков. И тогда этот объект обрезан со всех сторон и у него нет никаких потомков.  Так я согласен.

    Пусть у себя меняет каких хочет родителей, и вообще, делает что хочет.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #36 - 02. Июня 2006 :: 12:21
    Печать  
    Отвечу обоим сразу.

    Конечно, я вижу проблему обратной совместимости. Механизм контроля предлагаю включать по запросу.
    Цитата:
    Ибо сейчас я пользуюсь методами других суперклассов, а после реализации твоей идеи мне придется строить ромбы

    Ну нельзя этого делать, пойми, пожалуйста. Нельзя.
    Если тебе нужны конкретные данные из подкласса - пользуйся полиморфными функциями.
    Определяй интерфейс в супере и получай данные из переопределенного метода подкласса.
    Это будет правильно.
    Нужны тебе данные документа - вызови метод подкласса - наследника РКО, заполни тз и верни ее в суперкласс.
    И делай с ними, что хочешь. И это будет правильно.

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

    Не будут.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #37 - 02. Июня 2006 :: 12:28
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:21:
    Цитата:
    Будут разные результаты работы одного и того же метода потомка в зависимости от стека вызовов.

    Не будут.


    Вот такой код:

    Процедура ВиртуальныйМетод() Экспорт
      Метод_ПервогоРодителя();
      Метод_ВторогоРодитея();
    КонецПроцедуры

    И как он себя поведет при вызовах из текущего модуля и при вызовах из модуля ПервогоРодителя через Сам().ВиртуальныйМетод()?

    Или после того, как вызов пройдет Сам() нормализуется (в твоем первом варианте)?

    А если Сам() не портится, то стек вызовов не будет влиять на работу ВиртуальногоМетода (в твоем втором варианте)?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #38 - 02. Июня 2006 :: 12:29
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:15:
    "Родитель". Ну то есть мне бы хотелось, чтобы так было.


    Цитата:
    Вот с этим я согласен. И тогда ему не доступны никакие методы потомков. И тогда этот объект обрезан со всех сторон и у него нет никаких потомков.  Так я согласен.

    Пусть у себя меняет каких хочет родителей, и вообще, делает что хочет.


    А зачем вам нужен этот метод, кстати. С практической точки зрения.
    Ну обрезали потомков, а смысл? Может, я тороплюсь, отказывась от него?
    Для вызова оригинала переопределенной в потомках функции?

    Родители, кстати, (объекты суперклассов, ты это имел в виду?), у обрезанного и необрезанного общие будут.
    Т.е. заменив в одном месте, заменишь и в другом. Это же один объект, независимо от преобразований.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #39 - 02. Июня 2006 :: 12:33
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:29:
    Родители, кстати, (объекты суперклассов, ты это имел в виду?), у обрезанного и необрезанного общие будут.
    Т.е. заменив в одном месте, заменишь и в другом. Это же один объект, независимо от преобразований.


    То есть добъешься одинакового (неполиморфного) поведения нужных методов.
    То есть ЗаменитьБазовыйОбъект() после этого всегда будет работать одинаково.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #40 - 02. Июня 2006 :: 12:36
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:28:
    Вот такой код:

    Процедура ВиртуальныйМетод() Экспорт
      Метод_ПервогоРодителя();
      Метод_ВторогоРодитея();
    КонецПроцедуры

    И как он себя поведет при вызовах из текущего модуля и при вызовах из модуля ПервогоРодителя через Сам().ВиртуальныйМетод()?

    Вызываем из текущего модуля - тут все обычно - выполняем оба метода.
    Вызываем из модуля суперкласса ПервыйРодитель.
  • Находим метод - здесь ничего не мешает, он в пределах ветки Первого Родителя.
  • Запускаем Метод_ПервогоРодителя(), при это поиск выполняется во всем дереве, т.к. контекст исполнения перешел в подкласс.
  • Выполняем Метод_ПервогоРодителя(), при этом внутри метода поиск (если он есть) идет в пределах ветки Первого Родителя
  • Запускаем Метод_ВторогоРодителя(), при это поиск выполняется во всем дереве, т.к. контекст исполнения перешел в подкласс.
  • Выполняем Метод_ВторогоРодителя(), при этом внутри метода поиск (если он есть) идет в пределах ветки Второго Родителя

    Как видишь, никаких проблем нет. Отличий нет.
    Добавлена изоляция суперклассов, но схема предельно проста и надежна.
  •   

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #41 - 02. Июня 2006 :: 12:38
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 12:33:
    То есть добъешься одинакового (неполиморфного) поведения нужных методов.
    То есть ЗаменитьБазовыйОбъект() после этого всегда будет работать одинаково.

    Ну да, я тебя понял. Я ведь с этого начал. Кроме того, ты тоже вчера это предлагал.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #42 - 02. Июня 2006 :: 12:41
    Печать  
    Выглядит заманчиво. Но чувствую, что где-то лежат грабли.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #43 - 02. Июня 2006 :: 12:42
    Печать  
    Думай. Если найдешь, скажи мне.
    Но помни: обходя грабли ты теряешь драгоценный опыт!  Смех
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #44 - 02. Июня 2006 :: 12:44
    Печать  
    Продублирую, а то если кто с конца читает ветки, так им неудобно в начало смотреть:

    orefkov писал(а) 02. Июня 2006 :: 09:45:
    Образно говоря, поиск методов нужно осуществлять только в тех подобъектах, до которых можно добраться из вызывающего контекста, спускаясь только вниз по дереву иерархии.


    Цитата:
    Остается 2 проблемы:
    1. возможность вызова методов подкласса без объявления интерфейса в суперклассах
    2. доступ к свойствам подкласса из суперклассов


    А эти проблемы - проще не придумаешь. Решения:

    1. поиск методов вести только среди виртуальных, определенных в текущем контексте исполнения (с учетом интерфейсов суперклассов) - т.е. только в пределах интерфейса текущего контекста.
    2. поиск свойств вести только от текущего контекста исполнения вниз.
      

    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: ПолучитьТекущийОбъект()
    Ответ #45 - 02. Июня 2006 :: 12:45
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:21:
    Ну нельзя этого делать, пойми, пожалуйста. Нельзя.

    Угу, и любовь тоже нельзя купить. И суслика я не вижу.

    Цитата:
    Механизм контроля предлагаю включать по запросу.

    Как быдет выглядеть этот запрос?
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #46 - 02. Июня 2006 :: 12:48
    Печать  
    fez
    Не унывай! Все будет хорошо.

    orefkov писал(а) 01. Июня 2006 :: 11:44:
    kms писал(а) 01. Июня 2006 :: 11:38:
    Проблемы 2:
    1. Проблема реализации, которая по умолчанию позволяет это делать.
    2. Проблема квалификации кадров, котроые пользуются такой реализацией и пребывают в счастливом неведении.

    Исправляя первую проблему, ты наткнешся на жестокое сопротивления второй Улыбка

    У меня много было мыслей по грамотной реализации ООП с учетом накопленного в 1С++ опыта.
    Однако все они упирались в "обратную совместимость".

    Я думаю, Саня не про тебя писал, нет?

    Цитата:
    Как быдет выглядеть этот запрос?

    Ну сделаем кнопку, как сейчас "оптимизация" или "проверка типов".
    И метод добавим, типа "Сервис.ВключитьКонтрольИерархии()". ОК?
      

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


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #47 - 02. Июня 2006 :: 12:49
    Печать  
    Че вы паритесь?
    В-принципе, это уже есть в исходниках, только наружу не торчит.
    Смотрим
    CSetOfHierarchy::GetComponentClassCurExModule
    К этому методу как-раз и обращается ПолучитьБазовыйКласс, для исключения полиморфности при поиске.
      
    Наверх
     
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #48 - 02. Июня 2006 :: 12:51
    Печать  
    Тесты для наследования кое-какие имеются. Для Орефкова тоже парутестов можно написать. Если у кого что отвалится - добавим тестов.
    Так что дерзай!
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #49 - 02. Июня 2006 :: 12:51
    Печать  
    orefkov писал(а) 02. Июня 2006 :: 12:49:
    Че вы паритесь?

    У нас традиция - каждый год 31 числа мы с друзьями... Улыбка

    Ну по реализации - это мы все равно тебя будем спрашивать.
    А по концепции - ты что думаешь?
      

    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: ПолучитьТекущийОбъект()
    Ответ #50 - 02. Июня 2006 :: 12:54
    Печать  
    kms писал(а) 02. Июня 2006 :: 12:48:
    Цитата:
    Как быдет выглядеть этот запрос?

    Ну сделаем кнопку, как сейчас "оптимизация" или "проверка типов".
    И метод добавим, типа "Сервис.ВключитьКонтрольИерархии()". ОК?

    Неа. Ибо это потребует одновременной переработки ВСЕЙ конфигурации. Переходный период будет невозможен.
    Поэтому я и предлагаю сделать через доп. метод. Чтобы можно было одни и те же методы в одном и том же классе вызывать по-разному.
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #51 - 02. Июня 2006 :: 12:57
    Печать  
    Ну, давай я подумаю. Может быть, это удастся включать в пределах класса?
    Но это ведь детали уже, придумаем что-нибудь.

    P.S.
    Может, я это декларатором сделаю. Все равно надо отключение кеширования добавлять.
    Значит, все равно разбираться придется.
      

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


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #52 - 02. Июня 2006 :: 15:12
    Печать  
    Цитата:
    А по концепции - ты что думаешь?

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

    Может, просто пропустил.

    Итак, давайте начнем от печки.

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

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

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

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

    Рассмотрим имеющуюся проблему подробнее:
    Итак, обсуждаем мы как я понял
    Код
    Выбрать все
    Сам(Контекст).ВызовМетода();
     
    
    

    (Со свойствами я пока еще даже связываться боюсь).
    Сейчас:
    При написании такой конструкции мы получаем вот что - взять объект класса, (когда самого себя, а когда какого-то неизвестно наследника), и найти среди составляющих его подобъектов первый, имеющий метод с совпадающим именем и вызвать этот метод этого объекта. При этом поиск идет снизу-верх слева-направо, начиная от конечного (того, который был создан в СоздатьОбъект) объекта.
    Плюсы:
    - организация вызова из метода базового объекта методов его объектов-наследников (виртуальность).
    - легкость реализации "подмешивания"
    Минусы:
    - Нет средств указать вариант поиска метода, и в результате при совпадении ключей(имен) методов - вызов метода не того подобъекта, которого планировалось.

    Что хотим:
    При вызове методов гарантированно обращаться только к методам либо своих предков, либо своих прямых потомков.
    Плюсы:
    - организация вызова из метода базового объекта методов его объектов-наследников (виртуальность).
    - Большая безопасность в использовании классов и изолированность реализаций друг от друга.
    Минусы:
    - не сделать подмешивания.
    - многий ранее написанный код по такой схеме не заработает.

    Плохо ли текущее поведение, хорошо ли, правильно, неправильно, менять его мы не можем. Не имеем права даже, если мы уважаем пользователей компоненты. Ведь наверняка существуют ПРАКТИЧЕСКИЕ РАБОТАЮЩИЕ решения, основанные на этом поведении.

    Рассмотрим вариант с
    Код
    Выбрать все
    Сам(Контекст).ТекущийКласс()
     
    
    

    То есть метод получить в методе объекта "настоящую" ссылку на самого себя, вместо ссылки на конечный класс.
    Справедливости ради отмечу, что в первых версиях 1С++ (oxy.dll), Сам(Контекст) так и работал.
    Плюсы:
    - При вызове методов мы гарантированно обращаемся к методам планируемых объектов.
    Минусы:
    - Нет возможности виртуального вызова.
    Этот минус сводит всё на нет.

    ЭТО ВСЕ ПРЕАМБУЛА и словесный понос.
    Теперь по делу.
    КОНКРЕТНЫЕ АНИТИКРИЗИСНЫЕ ПРЕДЛОЖЕНИЯ.

    Упираемся мы в реализацию алгоритма поиска метода по имени. Иногда нам нужен поиск, как сейчас есть, а иногда - "правильный" поиск.
    Алгоритм поиска задается объектом, от которого начинается поиск, и учитывая, что никаких флагов городить мы не хотим, один объект имеет один алгоритм поиска. Следовательно, либо нам надо для поиска использовать другой объект, либо как-то менять семантику вызова метода, что-бы задействовать другой алгоритм для того-же объекта.
    Решение по первому пути: объект-прокси.
    что-то типа
    Код
    Выбрать все
    Сам(Контекст).ПолучитьПравильныйОбъект().ВызовМетода();
     
    
    

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

    Решение по второму пути:
    Код
    Выбрать все
    ВызовМетода();
    // либо
    ИмяКласса__класс__ВызовМетода();
     
    
    

    то есть прямой вызов метода, разрешаемый еще на этапе компиляции.
    Сложнее с синтакс-контролем, зато дикое увеличение перформанса (за счет того, что поиск метода делается ОДИН раз при компиляции, а не каждый раз при вызове)

    Думаем, господа.
      
    Наверх
     
    IP записан
     
    fez
    Forum Administrator
    1c++ power user
    Отсутствует


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

    Сообщений: 2712
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: ПолучитьТекущийОбъект()
    Ответ #53 - 02. Июня 2006 :: 15:27
    Печать  
    Я все это время говорил о первом варианте с объектом-прокси.
    Насколько я понимаю - на данном этапе это самый легкореализуемый вариант. Вдобавок он мне кажется синтаксически наиболее прозрачным.

    По поводу "дикого увеличения перформанса" для второго варианта. Лично мое мнение непоколебимо: по сравнению с обращением к данным - это слезы и крохи.
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #54 - 02. Июня 2006 :: 16:16
    Печать  
    orefkov
    По порядку.

    Идею ты понял правильно.
    Я выступаю и выступал изначально за вариант, который ты предлагаешь делать через прокси.
    Только я хочу, чтобы этот объект возвращался непосредственно через Сам(Контекст).

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

    Объясни мне, чем ввод нового объекта - прокси, лучше флагов?
    Это абсолютно то же самое. Разве нет?

    Приведет к тому же, чего ты опасаешься: разномастный код, разные принципы ООП, разные подходы к разработке, разные проблемы.
    Нет, я этого не хочу.
    Мы должны 1 раз сделать правильно, объяснить свою позицию людям, и обеспечить нормальный переходный период, когда работают обе технологии. Для этого и нужен глобальный флаг.

    По поводу прокси/не прокси.
    Я думаю, что мы в состоянии оптимизировать процедуры поиска.
    Кроме того, ты правильно сказал, нужно контролировать доступ к свойствам и методам в пределах интерфейса.
    Кроме того, есть еще "проблемные" методы типа НазначитьБазовыйКласс(), по которым я еще как-нибудь выскажусь.

    Главное: я за то, чтобы 1 раз сделать хорошо.
    Если ставить костыли, на них можно всю жизнь ходить.
    Я не вижу проблем - пусть старые проекты работают по старой схеме, но новые пишутся по новой.
    Тем более, что все возможно реализовать без этих "удобных" нарушений концепции ООП, пользуясь легальными механизмами обеспечения полиморфизма.
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #55 - 02. Июня 2006 :: 21:54
    Печать  
    Мне хотелось бы выяснить еще несколько вопросов. Надеюсь, они будут полезны и для вас.

    Речь пойдет о текщем положении дел, не о планах.
    Результатом выполнения выражения
    Код
    Выбрать все
    ТипЗначенияСтр(Сам().ПолучитьБазовыйКласс("БазовыйКласс"))  
    
    

    будет "БазовыйКласс".

    А на самом ли деле результатом вызова ПолучитьБазовыйКласс() будет объект типа "БазовыйКласс"? Или это будет прокси-объект?

    Ведь если это будет на самом деле БазовыйКласс, то тогда вызовы Сам.ПолучитьБазовыйКласс("БазовыйКласс").МетодБазы() и Сам.БазовыйКласс::МетодБазы() приведут к разным результатам. Ведь если МетодБазы() производит вызов виртуального метода, то произойдет вызов родительского виртуального метода, а не дочернего.

    Но, мне помнится, я уже пользовался таким вызовом и вызовы виртуальных методов проходили верно  (ручаться не буду). Поэтому есть подозрение, что Сам().ПолучитьБазовыйКласс() возвращает некий прокси-объект, который во время вызова его методов преобразуется в в объект реального класса.

    Если же возращается объект родительского класса, то что следует написать, чтобы получился вызов  Сам.БазовыйКласс::МетодБазы()?
      
    Наверх
     
    IP записан
     
    orefkov
    1c++ developer
    1c++ moderator
    Отсутствует


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #56 - 03. Июня 2006 :: 04:14
    Печать  
    kms писал(а) 02. Июня 2006 :: 16:16:
    Я выступаю и выступал изначально за вариант, который ты предлагаешь делать через прокси.
    Только я хочу, чтобы этот объект возвращался непосредственно через Сам(Контекст).

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

    kms писал(а) 02. Июня 2006 :: 16:16:
    Объясни мне, чем ввод нового объекта - прокси, лучше флагов?

    Тем, что во-первых точность определения используемого алгоритма поиска увеличивается до конкретного места вызова. Любой вариант с флагами будет ограничен с разным уровнем - до всей  конфигурации, либо до отдельного класса, не более.
    Во-вторых, у нас будет просто CComponentClass::FindMethod и CProxyClass::FindMethod, две совершенно независящие ни друг от друга, ни от флагов реализации.
      
    Наверх
     
    IP записан
     
    orefkov
    1c++ developer
    1c++ moderator
    Отсутствует


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #57 - 03. Июня 2006 :: 04:36
    Печать  
    sedmin писал(а) 02. Июня 2006 :: 21:54:
    Мне хотелось бы выяснить еще несколько вопросов. Надеюсь, они будут полезны и для вас.


    Попытаюсь внести ясность.
    То, что мы сейчас называем наследованием в 1С++, на внутреннем уровне реализовано агрегацией нескольких объектов (базовые классы, конечный класс) с автоделегированием их методов.

    Поиск метода осуществляется всегда от контекста (подобъекта класса), к которому применен вызов метода, снизу-вверх слева-направо вверх по иерархии строения класса. Вниз по иерархии поиск никогда не идет. Обращение же из базового класса к методам наследникам происходит за счет того, что модулю каждого подобъекта класса назначается контекст - ссылка на конечный объект.
    Поэтому Сам(Контекст) - в любом из модулей подобъектов всегда указывает на конечный класс.

    Делая же База=Сам(Контекст).ПолучитьБазовыйКласс(), мы получаем из конечного объекта ссылку на подобъект базового класса. Если теперь вызвать метод переменной База, поиск метода осуществляется не от конечного объекта, а от подобъекта базового класса, те только среди его методов и методов его предков. То есть таким образом мы гарантированно обращаемся к методу базового класса. Если же в этом методе базовый класс делает Сам(Контекст), он опять получит ссылку на конечный класс, и поиск метода опять пойдет с самого низа иерархии класса.

    То есть вот три ключа к пониманию текущего роутинга методов:
    1. Поиск всегда идет от объекта, к которому применен вызов метода, снизу-вверх слева-направо по иерархии строения объекта.
    2. Сам(Контекст) всегда возвращает самый нижний по иерархии подобъект класса, имя которого было в СоздатьОбъект.
    3. ПолучитьБазовыйКласс всегда возращает ссылку на подобъект базового класса.
      
    Наверх
     
    IP записан
     
    orefkov
    1c++ developer
    1c++ moderator
    Отсутствует


    I Love YaBB 2!

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

    вирт() - возвращает контекст конечного класса (как Сам(Контекст))
    я() - возвращает контекст самого класса (типа как предлагали Сам(Контекст).ТекущийОбъект())

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

    Таким образом получается так:
    Код
    Выбрать все
    вирт().ВызовМетода(); // Полностью как Сам(Контекст).ВызовМетода();
    я().ВызовМетода(); // Гарантированный поиск только в базовых классах
    иерархия().ВызовМетода(); // Правильный поиск по иерархии класса, начиная с конечного
     
    
    

    Может, это даже лучше сделать предопределенными свойствами, только надо проверять, как там с подсчетом ссылок будет. Типа
    Код
    Выбрать все
    вирт.ВызовМетода(); // Полностью как Сам(Контекст).ВызовМетода();
    я.ВызовМетода(); // Гарантированный поиск только в базовых классах
    иерархия.ВызовМетода(); // Правильный поиск по иерархии класса, начиная с конечного
     
    
    

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #59 - 03. Июня 2006 :: 07:43
    Печать  
    orefkov
    Я с тобой согласен.

    Цитата:
    Да как ты это сделаешь, если при этом старый клиентский код перестанет работать так, как работал? Ты согласен с предложенным мною принципом - где ты хочешь использовать новый функционал, ты должен писать по-новому?

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

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

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

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

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

    Я могу согласиться с тобой и Федором. Но мое мнение - надо оперировать более крупными блоками.
    Это уменьшит наш головняк, да и людям, в конечном итоге, станет лучше.


    В остальном тебя поддерживаю.

    По поводу предопределенных процедур: Чтобы быть до конца последовательным:

    вирт() или вирт. - это будет удобно. Надо только кроме ссылок, еще как-то его кешировать с оглядкой на возможность перестроения иерархии (НазначитьБазовыйКласс). Чтобы не строить каждый раз заново (скорость), но чтобы можно было это сделать при необходимости.

    я() - я сам начал с этого, но сейчас я в задумчивости, 50/50. А оно надо? Ну я понимаю, разрешение базовых классов - мы дополняем методы базы. А здесь зачем? В этом случае поведение суперклассов будут не соответствующим ожиданиям подклассов. Может, для новой схемы, это и не нужно?

    вирт() пускай возвращает объект по старым или по новым правилам - в зависимости от настроек класса.

    Тогда "иерархия" не нужна будет, и все будет прозрачно.
    Принял правила - выполняй. Не принял - тоже хорошо, пользуйся нарушениями на здоровье.
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #60 - 03. Июня 2006 :: 07:54
    Печать  
    А реализацию по-любому надо делить на CComponentClass и CProxyClass.

    И в последний можно добавить кроме поиска еще и контроль доступа к свойствам, поиск в подклассе только среди методов, объявленных в суперклассе, и все же требовать явного переопределения функции в подклассе, которая определена во множестве суперклассов разных веток.
      

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


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #61 - 03. Июня 2006 :: 08:06
    Печать  
    Для чего нужен я() ?

    Полно случаев, когда  я хочу гарантировать, что вызывая метод, я точно получу вызов метода из базового класса, независимо от того, что там наследники напишут. Сейчас для этого приходится делать ПолучитьБазовыйКласс("Какой-то").ВызовМетода(). И именно поэтому ПолучитьБазовыйКласс работает неполиморфно.
    Здесь же можно просто писать я().ВызовМетода(), и быть уверенным, что поиск метода не уйдет в наследников.

    Это как в С++
    Можно написать:
    ptr->SomeFunc(),
    а можно
    ptr->SomeClass::SomeFunc()

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #62 - 03. Июня 2006 :: 08:13
    Печать  
    Да это я понял.
    Цитата:
    Сейчас для этого приходится делать ПолучитьБазовыйКласс("Какой-то").ВызовМетода(). И именно поэтому ПолучитьБазовыйКласс работает неполиморфно.
    Здесь же можно просто писать я().ВызовМетода(), и быть уверенным, что поиск метода не уйдет в наследников.

    Как я понимаю, первый раз ты вызываешь метод суперкласса, а я().ВызовМетода() - это вызов текущего класса.
    Насчет базового класса - это-то понятно, часто используется при дополнении методов базовых классов.
    Непонятно, зачем вызывать метод текущего класса, отрезая наследников.

    добавлено:
    Или ты хочешь, не переопределяя метод в своем классе, т.е. зная, что его нет, а в суперклассе он есть, вызывать свой класс, зная, что выполнится метод суперкласса?
    Это я могу понять, но это неочевидное решение, лучше явно квалифицировать суперкласс, так, как ты сделал в примере на C++.

    чуть добавил
      

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


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #63 - 03. Июня 2006 :: 08:17
    Печать  
    kms писал(а) 03. Июня 2006 :: 07:43:
    orefkov
    Цитата:
    Да как ты это сделаешь, если при этом старый клиентский код перестанет работать так, как работал? Ты согласен с предложенным мною принципом - где ты хочешь использовать новый функционал, ты должен писать по-новому?

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

    Еще раз объясни.
    Как сделать чтобы везде было написано одно и то же: Сам(Контекст),
    но чтобы в одних местах конфигурации все работало по старому, а в других - по новому?
    Писать в заголовке вместо "класс" "правильныйкласс" что ли?
    Как быть когда в иерархии надо смешать "правильные" и "неправильные" классы?

    Допустим, я решил потихоньку переходить на "правильные классы".
    Как мне быстро определить, не глядя в реализацию, что вот этот класс я могу
    объявить как "правильный" и не нарушу никак его работу?

    Как много было вопросов от пользователей, связанных с тонкостями реализации ООП, за последний год на итлэнде?
      
    Наверх
     
    IP записан
     
    orefkov
    1c++ developer
    1c++ moderator
    Отсутствует


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #64 - 03. Июня 2006 :: 08:21
    Печать  
    kms писал(а) 03. Июня 2006 :: 08:13:
    Да это я понял.
    Как я понимаю, первый раз ты вызываешь метод суперкласса, а я().ВызовМетода() - это вызов текущего класса.
    Насчет базового класса - это-то понятно, часто используется при дополнении методов базовых классов.
    Непонятно, зачем вызывать метод текущего класса, отрезая наследников.

    Если мне надо вызвать метод МОЕГО класса, я просто пишу ВызовМетода(), он блин в этом же модуле.
    А я().ВызовМетода - в текущем модуле не найдет метода, и пойдет искать в моих базовых классах. Просто сравни длину записи:

    Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();
    и
    я().ВызовМетода();

    А результат один и тот же. А если не видно разницы, зачем писать длиннее?
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #65 - 03. Июня 2006 :: 08:31
    Печать  
    Цитата:
    Как много было вопросов от пользователей, связанных с тонкостями реализации ООП, за последний год на итлэнде?

    Хм. Да уж.

    Да, именно декларатором типа "класс правильный Документ_РКО {}".
    Если смешать правильные и неправильные, тогда при вызове из правильного будет использоваться CProxyClass, а при вызове из обычного - CComponentClass. Это потенциальный источник проблем, но позволит переводить классы в рабочем порядке.
    Честно говорю, полностью список проблем еще не обдумывал - поэтому есть предложение применять декларатор ко всей конкретной иерархии сразу.

    Цитата:
    Как мне быстро определить, не глядя в реализацию, что вот этот класс я могу

    Саня, ну, конечно, никак. Ну это не вопрос, а подколы какие-то.
    А по-серьезному, нужно посмотреть:
    1. Для каждого суперкласса: какие методы, не входящие в декларацию интерфейса, вызываются?
    Это сделать просто. Это могут быть методы подкласса - тогда их просто нужно внести в интерфейс.
    Это могут быть методы других суперклассов - тогда это нужно переписать на доступ через подкласс.
    2. Сделать контроль доступа к свойствам подклассов и других суперов.
    3. Сделать контроль определения методов подкласса со множественными определениями в суперклассах.

    Т.е. сделать нормальный рефакторинг класса, и все.
    Либо не переводить старые классы, а начинать переводить с новых.

    И юнит-тестирование должно помочь. Но тут меня совсем щас в утописты запишут.
      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #66 - 03. Июня 2006 :: 08:33
    Печать  
    Цитата:
    А я().ВызовМетода - в текущем модуле не найдет метода, и пойдет искать в моих базовых классах.

    А, ну тогда понятно. Я как-то полагал, что я() включает контекст текущего модуля.
      

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


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #67 - 03. Июня 2006 :: 08:37
    Печать  
    То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?

    Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #68 - 03. Июня 2006 :: 08:40
    Печать  
    Цитата:
    Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();
    и
    я().ВызовМетода();

    А результат один и тот же. А если не видно разницы, зачем писать длиннее?

    Я бы все же явно квалифицировал:
    Цитата:
    база("Документ.РКО").ВызовМетода();

    А то сделай ромб, и все равно будешь писать
    Цитата:
    Сам(Контекст).ПолучитьБазовыйКласс().ВызовМетода();

      

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #69 - 03. Июня 2006 :: 08:47
    Печать  
    [quote author=orefkov link=1149237614/60#67 date=1149323836]То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?
    [/quote]
    Нет, конечно, не должен. Можешь перелопачивать, можешь - нет. Разве это не свобода выбора?

    [quote]
    Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp[/quote]
    Да ладно тебе, нам же сроки никто не ставит. Ну, буду разбираться потихоньку.

    И потом, декларатор отмены кеширования все равно надо делать.
    И падение в CComponentClass:
    [quote]
    [I] EXH: Handled exception in CComponentClass::DecrRef(void) {1 occurrence}
    Exception address: [KERNEL32.dll ip=0x67E41ACE]
    Handler: CComponentClass::DecrRef(void) [ComponentClass.cpp:950]
    }
    catch(...) // artbear
    {
    => }[/quote]
    Все равно надо переделывать.

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

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #70 - 03. Июня 2006 :: 09:01
    Печать  
    orefkov писал(а) 03. Июня 2006 :: 08:37:
    То есть из-за твоей любви к "чистым" принципам ООП я должен буду перелопачивать весь свой старый код?

    Теперь представь, сколько работы надо будет переделать, чтобы реализовать работу "правильных" классов. Доделывать разбор заголовков классов, процедуру создания КОПов, да много чего еще. А вот вирт() и я() я сегодня добавил в ветку в репозитарии, изменив пяток строк в componentclass.cpp

    Вижу печать в голосе. И Федор примерно теми же словами.
    Да нет проблем,  давайте сделаем еще один метод для возврата правильной иерархии.
    Только в суппорт меня не пишите, у меня здоровья не хватит. Подмигивание
      

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


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #71 - 04. Июня 2006 :: 20:44
    Печать  
    Функция вирт() - это хорошо. Давно надо было такую ввести. Только как к ней отнесется синтакс-контроль конфигуратора? Правда лучше было бы ноазвать ее Сам(). А еще лучше было бы сделать предопределенную переменную Сам.

    И еще предлагаю написать тесты для тех случаев, которые хотелось бы решить. Тесты дадут возможность быстро обнаружить недостатки идей, которые возникают в головах.  Улыбка
    По опыту: тесты легко модифицируются на ту или иную реализацию механизма, поэтому в качестве первого этапа достаточно написать тесты на текущей реализации методов работы с наследованием.
      
    Наверх
     
    IP записан
     
    orefkov
    1c++ developer
    1c++ moderator
    Отсутствует


    I Love YaBB 2!

    Сообщений: 896
    Зарегистрирован: 20. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #72 - 05. Июня 2006 :: 04:51
    Печать  
    sedmin писал(а) 04. Июня 2006 :: 20:44:
    Функция вирт() - это хорошо. Давно надо было такую ввести. Только как к ней отнесется синтакс-контроль конфигуратора? Правда лучше было бы ноазвать ее Сам(). А еще лучше было бы сделать предопределенную переменную Сам.

    Если в глобальнике написать
    Функция вирт() Экспорт КонецФункции
    то нормально синтакс-контроль относится.
    Конечно лучше такую функцию назвать Сам, только притомит везде исправлять Сам(Контекст) на Сам().
    Сделать переменной - не знаю, надо разбираться,  с подсчетом ссылок, возможны косяки.
      
    Наверх
     
    IP записан
     
    sedmin
    1c++ developer
    Отсутствует


    I Hate Fat YaBB 2!

    Сообщений: 862
    Зарегистрирован: 24. Мая 2006
    Re: ПолучитьТекущийОбъект()
    Ответ #73 - 05. Июня 2006 :: 05:17
    Печать  
    orefkov писал(а) 05. Июня 2006 :: 04:51:
    Конечно лучше такую функцию назвать Сам, только притомит везде исправлять Сам(Контекст) на Сам().


    А разве нельзя в модуле переопределить функцию?

    Кстати, многие уже пользуются таким вариантом:
    Код
    Выбрать все
    Функция Конт(Конт) Возврат Конт; КонецФункции
    Функция Сам() Возврат Конт(Контекст); КонецФункции 
    
    


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


    Не переменной, а свойством. Типа
    Код
    Выбрать все
    Функция Get_Сам()
        Возврат Сам();
    КонецФункции 
    
    
      
    Наверх
     
    IP записан
     
    Переключение на Главную Страницу Страницы: [1] 
    ОтправитьПечать