Обобщение

Тема в разделе "WASM.BEGINNERS", создана пользователем blacktelecom, 8 ноя 2010.

  1. blacktelecom

    blacktelecom New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2010
    Сообщения:
    235
    Есть один вопрос.
    Вот стоит задача, написать программу по управлению разными объектами ( User, Company, Bank ) и так далее.
    Эти объекты лежат в Бд, программа должна с ней общаться.

    В процессе разработки вот что заинтересовало.

    Я писал так:

    Код (Text):
    1. typedef struct user
    2. {
    3. int *id;
    4. char *login;
    5. char *password;
    6. char *First_Name;
    7.  
    8.  
    9.  
    10. }user;
    11.  
    12. user * user_findById()
    13. {
    14. user *res = malloc (sizeof (user));
    15. ...
    16. //Общаемся с SQL..
    17. return res;
    18.  
    19. };
    И так куча функций;
    Но! У каждого объекта есть поле Id.
    Каждый объект можно исктать по ID, удалять, зная Id и модифицировать.
    Более того, есть таблица "Company", но Bank, Office - это тоже "Company"
    Тогда я решил попробовать создать обобщённую структуру, управляющую остальными:
    Код (Text):
    1. typedef struct Company_Common
    2. {
    3.  
    4. Company *(*createNew)(int Company_Type); // где-то описано
    5.  
    6. Bank *(*createBank)(Bank_Account *initial_account);
    7.  
    8. //и так далее с функциями БД
    9.  
    10.  
    11. }CommonObject;
    Но это тоже очень дофига.

    Вопрос: Как мне сделать Некую конструкцию, которая объединяла бы свойства и банка, и офиса и прочих вариантов?
    Я так понял, надо мутить что-то с вложенной структурой вроде

    struct a{
    int id;

    struct a *parent;
    }

    но как тогда устанавливать значения полей у parent, я запутался.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    сделайте так, чтобы все "элементы" наследовались от одного класса и манипулируйте ими как указателями на класс родителя...
     
  3. blacktelecom

    blacktelecom New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2010
    Сообщения:
    235
    А как?
    В структуре ссылку на родителя пробовать делать?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Си не очень хорошо ложится под данную задачу.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    blacktelecom

    Такие задачи на си никто не решает. Шарп и дотнет.
     
  6. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    А кто сказал что он на чистом Си пишет?
     
  7. blacktelecom

    blacktelecom New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2010
    Сообщения:
    235
    Я сказал.

    Требуется именно на си, таковы условия ТЗ.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    blacktelecom
    Что так? Мы не против, просто интересно зачем понадобилось использовать малоподходящий язык.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    blacktelecom

    Нет наследования - воспользуйся агрегацией.

    Код (Text):
    1. struct company_info
    2. {
    3.     // адрес и название
    4. };
    5.  
    6. struct bank_info
    7. {
    8.     company_info company;
    9.  
    10.     // свойства, характерные для банка
    11. };
    12.  
    13. struct office_info
    14. {
    15.     company_info company;
    16.  
    17.     // свойства, характерные для офиса
    18. };
     
  10. blacktelecom

    blacktelecom New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2010
    Сообщения:
    235
    _Den_
    Это мысль, однако.
    Попробую расписать процедуры сохранения объектов в базу на этой основе.

    А CompanyBuildel тогда будет строить объекты на базе CompanyInfo, а для всех этих объектов тупо определим общие функции (create, find, update),
     
  11. blacktelecom

    blacktelecom New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2010
    Сообщения:
    235
    А ещё вопрос: Так делают?

    some1.h:

    #define SOME1_H

    #define MY_CONSTANT "My value"


    some2.h
    #define SOME2_H

    #define MY_CONSTANT "next val"


    app.c
    #include "some1.h"
    #include "some2.h"

    somevoid (char *);
    #undef SOME2_H
    #ifdef SOME_H
    somevoid ( MY_CONSTANT);
    #endif

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

    Это я для того делаю, что пробую связать код и данные в одно целое, то есть пусть у объекта есть формат описания, где не только структура с полями, но и таблица в бд, и Sequences и ERP ( one2one, one2many...)
    Я хочу чтоб в зависимости от ситуации генерился SQL запрос