Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Набор специфических поведений класса (примеси) (число прочтений - 24663 )
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Набор специфических поведений класса (примеси)
02. Июня 2006 :: 08:19
Печать  
Вынесу в отдельную тему, пусть будет.

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

Теперь я понимаю, что
  • некоторые жуки не летают, а прыгают
  • некоторые жуки не жужжат, а свистят
  • некоторые жуки ночью не спят, а играют на рояле
  • некоторые жуки дают молоко

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

    2. дефолтная реализация интерфейса - по умолчанию жук ночью спит, а днем летает

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

    1. Наследование: Жук <- Жук летающий; Жук <- Жук свистящий и т.д
    С точки зрения ООП все в полном порядке.
    Но как быть с жуком прыгающим, свистящим и дающим молоко? А если признаков - сотня? Какая у меня будет иерархия классов?

    2. Агрегация: У жука есть: крылья - 2 шт., звуковой сигнал - свисток - 1 шт, музыкальный инструмент рояль - 1 шт., производственный цикл - 1 шт.
    В принципе, реализуемо. Но я хочу описывать _поведение_  жуков, а не составные части.
    Попробуйте описать человека в терминах агрегации, что получится?

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

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

    Вот я вышел на балкон и поймал жука. Взял микроскоп и рассмотрел его со всех сторон.
    Я его идентифицировал как неизвестного. Изучил его аспекты поведения.
    Теперь я беру свой общий класс жуков и список примесей и по списку ставлю галки:
  • летает
  • лает
  • ест овес

    Получается полностью описанный жук, с полностью реализованными аспектами поведения.
    И тут вопрос - как это сделать красиво и с минимальными затратами.
  •   

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


    #define sizeof(x) rand()

    Сообщений: 787
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Набор специфических поведений класса (примеси)
    Ответ #1 - 02. Июня 2006 :: 08:52
    Печать  
    Код
    Выбрать все
    interface IFlyingCreature
    {
      void Fly();
      void Land();
    }
    interface IJumpingCreature
    {
      void Jump();
    }
    class CommonBeetle
    {
      int Eat(Food f);
    }
    //-=skipped=-
    class SomeBeetle : CommonBeetle, IFlyingCreature, IJumpingCreature
    {
      void SomeSpecificFeature();
    } 
    
    

    при использовании интерфейсов в дальнейшем будет возможность написать
    Код
    Выбрать все
    class Raven: CommonBird, IFlyingCreature
    {
      .....
    } 
    
    

    Цитата:
    А если признаков - сотня?

    А если пугает обширная иерархия, то тогда - вариант 2.
    Вот написал, а потом подумал.....
    Интерфейс ведь не содержит реализации и придется описывать как прыгает каждый конкретный жук.
    Ну тогда все-таки множественное наследование.
      

    int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
    Наверх
     
    IP записан
     
    Pelmen
    Full Member
    ***
    Отсутствует



    Сообщений: 242
    Зарегистрирован: 01. Июня 2006
    Пол: Мужской
    Re: Набор специфических поведений класса (примеси)
    Ответ #2 - 02. Июня 2006 :: 09:51
    Печать  
    А чем предложенный вариант отличается от первого описанного в первом посте?
    Тем более что с точки зрения джавы мы можем описать только интерфейсы, а реализация для каждого класса будет своей для каждого класса.

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


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #3 - 02. Июня 2006 :: 10:02
    Печать  
    Давайте я еще вывешу свои размышления (даже практически предлагаемый механизм) из соседней ветки.

    Цитата
    Да, новые идеи всегда с трудом находят понимание у современников Печаль

    Что такое множественное наследование, ты понимаешь.
    Теперь переверни картинку вверх ногами. Что получилось?
    Это множественные наследники.

    В предлагаемой реализации:
    Цитата:
    класс А
    {
       virtual test1(Msg("A::test1"));
       virtual test2(Msg("A::test2"));
    };

    класс mix1
    {
       virtual test1(Msg("mix1::test1"));
    }

    класс mix2
    {
       virtual test2(Msg("mix2::test2"));
    }


    Теперь замещаем методы test1 и test2 методами классов mix1 и mix2:
    Цитата:
    класс = СоздатьКласс("А"); // это не объект, это шаблон класса, который мы строим
    класс.ДобавитьПодкласс("mix1"); // downmix
    класс.ДобавитьПодкласс("mix2");

    Сам = класс.СоздатьОбъект(параметры конструктора); // создание объекта класса А с замещенными аспектами
    Сам.test1();
    Сам.test2();


    Поскольку оба методы переопределены, причем разными подклассами, результат будет:
    Цитата:
    mix1::test1
    mix2::test2


    Т.е. я раздумываю, не строить ли шаблон класса динамически, добавляя суперклассы и наследников, которые выполняют некий downmix, заменяя функционал суперкласса.
    Но заменяют они реализацию не у себя, а в том классе, который я им указываю.
    И создаю я объекты не наследников, а сразу объекты суперкласса, но с уже переопределенными аспектами поведения.
    Моя задача решается идеально, но это не ООП, так ведь?

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

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    Pelmen
    Full Member
    ***
    Отсутствует



    Сообщений: 242
    Зарегистрирован: 01. Июня 2006
    Пол: Мужской
    Re: Набор специфических поведений класса (примеси)
    Ответ #4 - 02. Июня 2006 :: 10:09
    Печать  
    Но, поскольку я не могу найти реализации и обоснования подобных механизмов у классиков - пребываю в глубокой задумчивости.

    Да потому что каким ты видишь интерфейс производного класса в этом случае???
    Он у тебя получается динамическим.

    агрегация идеально решает проблему.
      
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #5 - 02. Июня 2006 :: 10:14
    Печать  
    Pelmen писал(а) 02. Июня 2006 :: 10:09:
    Да потому что каким ты видишь интерфейс производного класса в этом случае???

    Никаким. Нет производного класса.
    Более того, нет концепции производных классов - есть концепция замещения или реализации аспектов поведения.
    Т.е. до точки X есть производные классы и ООП - а далее downmix.

    Цитата:
    агрегация идеально решает проблему.

    Я знаю Улыбка
    И спасибо вам за ваши со Степаном предложения.
    Я конечно, это все уже реализовал или одним или другим способами.

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

    В конце концов, не все же время ходить протоптанными путями Улыбка
      

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


    I Love 1Cv8!

    Сообщений: 217
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #6 - 02. Июня 2006 :: 10:43
    Печать  
    kms
    Прошу прощения за офф...
    Я, кажется, начинаю понимать... в этой ветке зарождается новая банда. Банда четырёх.
    Первый уже есть Подмигивание

    all
    это намек для всех, если кто не понял Подмигивание
      
    Наверх
    ICQ  
    IP записан
     
    fez
    Forum Administrator
    1c++ power user
    Отсутствует


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

    Сообщений: 2712
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Набор специфических поведений класса (примеси)
    Ответ #7 - 02. Июня 2006 :: 10:59
    Печать  
    kms
    Более мененее ясно. Разъясни только вот чего.
    Правильно ли я понимаю, что подобные конструкции полезны в ситуации, когда в работе программы одновременно используется относительно небольшое количество объектов? Тогда как возможных вариантов этих самых разных объектов - очень много. И таким образом ты просто хочешь облегчить описание всех этих бесконечных возможных вариантов. Ага?

    Palytch
    Третьим будешь? Подмигивание
      
    Наверх
    www  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #8 - 02. Июня 2006 :: 11:07
    Печать  
    fez
    Абсолютно точно.
    Т.е. ведь сама концепция ООП - не самоцель, цель - это удобная и надежная разработка.
    А в ситуации, которую я описал, следуя концепции (чистого наследования, по крайней мере), пролетаешь мимо цели.

    Palytch, fez
    Ваше здоровье! Улыбка

    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: Набор специфических поведений класса (примеси)
    Ответ #9 - 02. Июня 2006 :: 11:15
    Печать  
    Я тебе щас умную вещь скажу, ты только не обижайся. Может быть не надо путать понятия "класс" и "объект"?

    Класс - это "Жук". У жука есть разные данные: как он перемещается, что он есть, когда спит, и т. д. по всему "набору аспектов поведения".

    Поймали конкретного жука - это объект. Создаем объект класса "Жук", в конструктор передаем параметры: Летает на 4-х крыльях, может прыгать, ест пыльцу, свистит в ля-миноре.

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



    Сообщений: 822
    Местоположение: Новосибирск
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Набор специфических поведений класса (примеси)
    Ответ #10 - 02. Июня 2006 :: 11:17
    Печать  
    Помоему, тут нужно копать в сторону шаблонов проектирования (патерны).  Подмигивание
      
    Наверх
    ICQ  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


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

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #11 - 02. Июня 2006 :: 11:18
    Печать  
    Скорость

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

    По крайней мере, в языках типа 1С, где нет логики указателей.

    Т.е. по нагрузочной способности, это абсолютно разные концепции.
    Если скорость создания агрегата будет линейно (а там, глядишь, и память закончится, экспонента пойдет)проседать с ростом числа аспектов поведения, то downmix потребует 1 раз создания шаблона и минимальное постоянное время на создание экземляров класса.


    P.S. ну ладно, ладно, ну можно, конечно что-то придумать с хранением по ссылке в 1С. А то щас наброситесь Улыбка
      

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


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

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

    Класс - это "Жук". У жука есть разные данные: как он перемещается, что он есть, когда спит, и т. д. по всему "набору аспектов поведения".

    Поймали конкретного жука - это объект. Создаем объект класса "Жук", в конструктор передаем параметры: Летает на 4-х крыльях, может прыгать, ест пыльцу, свистит в ля-миноре.

    Не катит?

    Катит. А дальше что. Мне нужна работающая модель жука в 1С!
    Т.е. у меня класс жук. У него в переменных записи "прыгает", "пляшет", "поет".

    А дальше что: либо RTTI на основе этих данных типа как в штатном 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: Набор специфических поведений класса (примеси)
    Ответ #13 - 02. Июня 2006 :: 11:30
    Печать  
    kms писал(а) 02. Июня 2006 :: 11:25:
    Либо агрегация - т.е. поет - это часть жука. Конечно, он же не весь поет - он поет... Да хз. чем он поет Улыбка

    Именно агрегация. Только часть жука - это не "поет", а "пелка". Орган, которым он поет. "Поет" - это метод "пелки".

    Описываем интерфейс "ПелкаЖука", наследуем от него много конкретных органов, которыми жуки могут петь, описываем в них, как именно эти органы поют. При создании конкретного жука в переменную "_Пелка" класса "Жук" записываем экземпляр конкретной пелки данного конкретного жука. Класс "Жук" делегирует выполенние метода "Петь()" переменной "_Пелка".

    Если переменная "_Пелка" пуста, то жук не поет вообще.

    Всо.
      
    Наверх
    www  
    IP записан
     
    Палыч
    1c++ power user
    Отсутствует


    I Love 1Cv8!

    Сообщений: 217
    Зарегистрирован: 19. Мая 2006
    Re: Набор специфических поведений класса (примеси)
    Ответ #14 - 02. Июня 2006 :: 11:36
    Печать  
    kms
    Вот spock намёк уловил Подмигивание
    Прислушайся...
      
    Наверх
    ICQ  
    IP записан
     
    Переключение на Главную Страницу Страницы: [1] 2 3 
    ОтправитьПечать