Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [c++]gateway

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]gateway

    Ciao,
    Sto creando un importatore.
    L'importatore deve poter importare sia da db che da api.
    NEll'importatore ho 2 classi intermedie che ragruppano una funzionalità specifica dell'importatore(nel mio caso sezione carichi e sezione stress).
    Le due classi intermedie devono poter leggere dati sia da db che da api.
    quindi avro
    classeintermediaCarichibase e
    classeintermediaStressbase

    e per ognuna di queste
    classeintermediaCarichiApi:classeintermediaCarichi base
    classeintermediaCarichiDb:classeintermediaCarichib ase

    classeintermediaStressApi:classeintermediaStressba se
    classeintermediaStressDb:classeintermediaStressbas e

    db e api hanno delle proprie funzioni che servono per la lettura,la configurazione ecc.. dei 2 diversi sitemi(db e api)

    Sto quindi cercando un modo per ragruppare le 2 classi x db e le 2 classi x api.
    e di creare una classe base con tutte le funzioni relative al tipo di lettura usato.
    In modo da scrivere una volta sola queste fuunzioni anzichè replicare il codice ,sia per un fatore di refactoring(devo cambiare un funzione base)sia perchè il tipo di input potrebbe cresere (oltre a db e api ad es text o excel ecc..)
    Il problema è che queste due classi derivano da una classe base diversa anche se è lo stesso il itpo di lettura.
    Ho pensato al factory method ma non ci sono saltato fuori.
    Voi come fareste? anche al limite stravolgendo la mia analisi.
    ho provato a tentare di utilizzare il pattern gateway che mi stato consigliato:
    ad es:
    ho questa classe nelle api

    void CSapDataLoadIteratorApi::LoadTagLoadsTempConc(tagL oadDataTempLogic* tagData)
    {
    tagData->strLoadCase = GetStringValueSA(pSALoadCAse,m_nIndex);
    tagData->strFrameObj = GetStringValueSA(pSALineName,m_nIndex);
    int nIForceMoment = GetIntValueSA(pSATypeForceMoment,m_nIndex);
    tagData->strCoordSys = GetStringValueSA(pSACoordSys,m_nIndex);
    tagData->dDistA = GetDecimalValueSA(pSADist1,m_nIndex);

    tagData->dValOverLA = GetDecimalValueSA(pSAVal1,m_nIndex);
    CString strForceMoment;
    ( (nIForceMoment==1)?strForceMoment="Force" : strForceMoment="Moment" );

    tagData->strDir.Format("%d", GetIntValueSA(pSADir,m_nIndex),tagData->strDir);
    tagData->strType = strForceMoment;
    }

    che carica una struttura tagLoadDataTempLogic di questo tipo:

    typedef struct LoadDataTempLogic
    {
    CString strFrameObj,strFrameEl, strLoadCase, strCoordSys, strType, strDir, strJointI;
    double dDistA, dDistB, dValOverLB, dValOverLA;
    }tagLoadDataTempLogic;

    la funzione GetDecimalValueSA è comune a tutte le classi api e ritorna un valore dato un SAFEARRAY e un indice


    la funzione:
    void CSapDataLoadIteratorApi::LoadTagLoadsTempGravity(t agLoadDataTempLogic * loadDataTemp, double * dMultiplierX ,double * dMultiplierY ,double * dMultiplierZ , double * dLength ,double * dArea,double * dUnitWeight,CString *strSection,CString *PointI,CString *PointJ)
    {

    loadDataTemp->strLoadCase = GetStringValueSA(pSALoadCAseGrav,m_nIndex);
    CString strDir ="Gravity";

    loadDataTemp->strCoordSys = GetStringValueSA(pSACoordSysGrav,m_nIndex);

    /*leggo grazie al join con la tabella connectivity joint di
    inizio del beam , uilizzata nella funzione calclilj.*/

    loadDataTemp->strCoordSys = GetStringValueSA(pSALoadCAseGrav,m_nIndex);
    loadDataTemp->strFrameObj = GetStringValueSA(pSALineNameGrav,m_nIndex);

    *dMultiplierX = GetDecimalValueSA(pSAXGrav,m_nIndex);
    *dMultiplierY = GetDecimalValueSA(pSAYGrav,m_nIndex);
    *dMultiplierZ = GetDecimalValueSA(pSAZGrav,m_nIndex);


    BSTR strSectionOut;

    BSTR strSectionAuto;
    BSTR strMissing;
    long nMissing = 0;
    _bstr_t strEmpty_T;
    _bstr_t strNameSection;

    strEmpty_T = "";
    double dMissing = 0;

    // carico una stringa vuota nella BSTR
    strSectionOut = strEmpty_T.copy();
    strSectionAuto = strEmpty_T.copy();

    strMissing = strEmpty_T.copy();
    bstr_t strFrameObj=bstr_t(loadDataTemp->strFrameObj);
    HRESULT hr = m_pSapModel->FrameObj->GetSection(strFrameObj,&strSectionOut,&strSection Auto);

    strNameSection = bstr_t(strSectionOut);
    *strSection = CString(strNameSection.GetBSTR());

    BSTR bstrPointI;
    BSTR bstrPointJ;

    bstrPointI = strEmpty_T.copy();
    bstrPointJ = strEmpty_T.copy();

    hr = m_pSapModel->FrameObj->GetPoints(strFrameObj,&bstrPointI,&bstrPointJ);
    *PointI = CString(bstrPointI);
    *PointJ = CString(bstrPointJ);
    }
    usa anche lei la funzione GetDecimalValueSA e GetStringValueSA e ritorna in out vari dati (loaddatatemp,dMultiplierX ecc...)


    ecco se ho ben capito devo creare un wrapper attorno alla classe CSapDataLoadIteratorApi e a queste due funzioni.
    Il problema è che devo cambiare queste due funzioni in modo da eliminare le comuni GetDecimalValueSA e GetStringValueSA e
    metterle nel gateway , e far si che le funzioni(scusate la ripetizione) ritornino semplicemente dati grezzi(nel mio caso
    SAFEARRAY che altro non sono che array)
    quindi diventa

    1)leggo il SAFEARRAY nel gateway dalla clase api:
    SAFEARRAY pSACoordSysGravGateway = CSapDataLoadIteratorApi.getCoordSysGrav()

    2)uso le funzioni comuni messe nel gateway e l'array letto e ritornato dalla classe dell'api:
    loadDataTemp->strCoordSys = GetStringValueSAGateway(pSACoordSysGravGateway,m_n Index);

    e la logica la imlemento nella classe che contiene il gateway giusto?

    Il problema è che ho due classi che vanno a leggere dall' api :
    CSapDataLoadIteratorApi e CSapDataStressIteratorApi che usano ambedue le stesse funzioni comuni dell' api , ma hanno un interfaccia
    diversa , come posso fare?
    devo creare due gateway?
    se si' non ha senso!
    rimane la possibilità di creare una classe comune partendo dalle due interfacce .

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    formatta il codice tra i tag code altrimenti passa la voglia di leggerlo.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    hai ragione xwolverinex , ma forse il codice non è cosi' importante.
    Per riassumere tutto :
    ho una serie di funzioni uguali sparse in varie classi che hanno una logica diversa ma utilizzano le stesse funzioni per leggere,verificare e iterare dati.
    Vorrei estrapolare queste funzioni e renderle uniche e accessibili alle varie classi che le utilizzano.
    Grazie.

  4. #4
    Originariamente inviato da giuseppe500
    hai ragione xwolverinex , ma forse il codice non è cosi' importante.
    Per riassumere tutto :
    ho una serie di funzioni uguali sparse in varie classi che hanno una logica diversa ma utilizzano le stesse funzioni per leggere,verificare e iterare dati.
    Vorrei estrapolare queste funzioni e renderle uniche e accessibili alle varie classi che le utilizzano.
    Grazie.
    Magari ho capito male, ma non puoi utilizzare un'interfaccia ? Ogni classe la eredita e implementa la nuova logica.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie menphisx.
    Ma se uso un interfaccia non devo implementare nelle varie classi i metodi condivisi?
    Ho pensato che forse posso creare una classe con tutti i metodi condivisi e incapsularla nelle varie classi che la usano.
    Sbaglio?
    O forse creare una classe statica con tutti i metodi condivisi e richiamarla dalle classi che la usano.
    In questo caso , come si implementa in c++ una classe statica?

  6. #6
    Ho pensato a qualcosa del genere:
    codice:
    class VirtualBase {
    
       protected:
          void metodo_condiviso();
       public:
          VirtualBase() {}
          virtual ~VirtualBase() {}
          virtual void read() = 0; //Metodo puro
    
    };
    
    //Eredita metodo_condiviso, che rimane lo stesso
    class NuovaLogica : VirtualBase {
    
       public:
          NuovaLogica() : VirtualBase() {}
          ~NuovaLogica();
          void read(); //Nuova implementazione di read che segue la nuova logica
    
    };

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie menphisx sempre presente.
    Il problema è che la mia classe(la tua nuovalogica) eredita già da una classe CLogicabase.
    In pratica ho una classe base CStressBase da cui ereditano CStressDb e CStressApi.
    e una classe base CLoadsBase da cui ereditano CLoadsDb e CLoadsApi.

    utilizzo questa derivazione perchè nella mia struttura incapsulo in una classe di utilizzo una Variabile di tipo CStressBase e una di tipo CLoadsBase.
    A seconda della scelta dell'utente(se sceglie importazione da db o da api) runtime(per polimorfismo) in queste variabili ci sarà una Classe di tipo CStressDb o CStress api e cosi' via per i Loads.

    le classi CLoadsApi e CStressApi utilizzano una logica comune e
    le classi CLoadsDb e CStressDb utilizzano una logica comune .

    Tu come faresti?

  8. #8
    Non puoi postare il codice riguardante queste classi, anche solo l'intestazione e non l'implementazione ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.