Фабрика в процедурном языке

Тема в разделе "WASM.HEAP", создана пользователем osrootd, 17 апр 2009.

  1. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Стоит задача построить структуру, которая отражает некую объектную сущность.

    Допустим, есть состояния:
    State{
    ST_USER_AUTHORIZED,
    ST_USER_IS_HUMAN,
    ST_USER_IS_OWNER;

    } // ну и так далее.


    MyStruct { ... };

    Вот надо бы сделать нечто, работающее Только при ST_USER_AUTHORIZED, причем если USER_IS_HUMAN да еще и USER_IS_OWNER, то эта структура должна быть со свойством A, если же USER_IS_OWNER не выполняется, то теряем свойство A но добавляем B. Вроде бы просто, но состояний много и их комбинаций - тоже.

    Язык объктов не предусматривает - си
    По сути - здесь напрашивается такая штука как Factory - но как ее применить в данном отношении?
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    osrootd
    это ООП паттерн, а у тебя процедурный - болт Вам :)
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    полиморфизм делается указателями на функции или switch()
     
  4. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    wsd
    Да я в курсе.:))
    Может как-то есть способ множественного строительства?
    Ведь ООП - суть вариант понимания или восприятия процесса, сущности, системы. Я думаю, что размышляя с объектной точки зрения можно использовать функционал процедурного языка.

    Пусть некая сущность А есть ничто. Но создана из B по принципу C, который предусматривает метод M, чтобы изменить свойство P
    Вот скажите, в чем разница:

    //C.h
    Код (Text):
    1. typedef struct _B
    2. {
    3.   int *P;
    4. } B;
    5.  
    6. void M ( B, int );
    7.  
    8. ...
    9.  
    10. Struct _A
    11. {
    12.   B *b;
    13. }A;
    14. // Дальше, думаю понятно
    и
    Код (Text):
    1. -- На объектно-ориентированном языке
    2. package C is
    3.     type B is record
    4.         B :integer;
    5.     end record;
    6.  
    7.     Type A is new B with NULL RECORD;
    8. procedure M ( b: IN OUT B'Class, I: IN Integer);
    9. end C;
    Вот я и прошу, может как-то можно в такой нотации паттерн фабрики реализовать?

    Объясню человеческим языком: Надо построить человека.
    У него дофига свойств, сами знаете. Но не просто построить, а учесть, что если ему пару тиков назад оторвали ухо, то он уже человек, но иной, без уха. Труп - тоже человек, и его тоже надо построить, задав ему те или иные свойства. Уровень детализации высокий. И все это заказчик просит без ООП.
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    osrootd
    так в чем проблема?
    Код (Text):
    1. struct A {
    2.   int state;
    3.   union {
    4.     struct {
    5.        ... x
    6.     } state1;
    7.     struct {
    8.        ... y
    9.     } state2;
    10.     ...
    11. };
    12.  
    13. void foo(A* a) {
    14.   switch (a->state) {
    15.   case 1:
    16.    .... a->state1->x ...
     
  6. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    505
    В С можно даже ООП имитировать (наследование и полиморфизм) через вложенные структуры с полями-указателями на функции.
    Кармак в исходниках Quake1/2/3 часто юзал. Правда в Doom3 уже перешел на чистый ООП. =)
    Но тут немного другое, как я понимаю. Если свойства еще и надо "терять", то, имхо, map ( propertyName, propertyValue ) будут адекватны, хотя и в ущерб производительности.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    osrootd
    это всё изврат ;)
    к примеру, если делать умный UDP, то получится TCP .. почему тогда сразу не заюзать TCP?
    твой случай аналогичный