Che cos'è un buon design API C ++ per i registri HW?

2

Sto progettando un'API per un driver che manipola HW. Ho fatto quanto segue:

namespace HWRegister
{
    //private:
    namespace Data
    {
        //accessible only within this namespace

        //Represents one of the four HW blocks.
        enum EHWUnit
        {
            Block0,
            Block1,
            Block2,
            Block3
        };

        enum EHWSet
        {
            Rx0,
            Rx1,
            Rx2,
            Rx3,
            Tx0,
            Tx1,
            Tx2,
            Tx3
        };
    }

    using namespace Data;

    //Returns Error Code
    int32_t enableHWUnit( const EHWUnit aHWNumber, const EHWSet aHWSet );
    //Returns Error Code.
    int32_t disableHWUnit( const EHWUnit aHWNumber );

Mi piacerebbe avere l'opinione della gente su questo. Mi chiedo se queste enumerazioni siano una buona idea, le dichiaro qui e quindi le persone che usano la mia API sono costrette a usarle, questo causerà più problemi ai chiamanti della mia API? Posso migliorare questa API in qualche modo? Aggiungerò più documentazione nell'API quando sono sicuro che stia andando bene.

    
posta user1876942 24.06.2014 - 09:17
fonte

2 risposte

1

Le enumerazioni sono sempre buone da usare, dal momento che rendono il codice più facile da capire.

Ma hai diversi problemi lì:

  • se il tuo snipet di codice si trova in un'intestazione, allora lo spazio dei nomi deve avere un nome
  • Vorrei usare enum% strongmenteenum class, invece di solo enum
  • i valori dell'enumerazione non sono abbastanza descrittivi e sembrano molto generici. Potresti voler dare nomi migliori, invece solo per esempio Tx1 . Con enumerazioni strongmente tipizzate, questo non è un problema
  • non è un grosso problema, ma le tue funzioni restituiscono un codice di errore. Un'eccezione potrebbe essere più appropriata
  • Perché non creare una classe, che inizializza il tuo HW in costruttore e disabilita in distruttore? La tua API sembra più C
risposta data 24.06.2014 - 10:07
fonte
1
  1. Le enumerazioni sono una buona idea
  2. Se fornirai questo codice via dll (una buona idea per me), ti consiglio di non cambiarli in enum class e non di lanciare l'eccezione, perché queste sono solo funzioni di C ++ e gli utenti non saranno in grado di usare la tua DLL in C # per esempio
  3. Se queste enumerazioni saranno usate come un vero indirizzo di registro (o offset) sarebbe meglio inizializzare ogni membro di enum con un valore particolare (anche se sono 0, 1, 2, ecc.) in hex fromat ( è la notazione concordata in HW - driver - pacchetto programma utente)

    enum EHWSet
    {
        Rx0 = 0x00,
        Rx1 = 0x01,
        Rx2 = 0x02,
        Rx3 = 0x03,
        Tx0 = 0x04,
        Tx1 = 0x05,
        Tx2 = 0x06,
        Tx3 = 0x07
    };
    
  4. Esclude using namespace dall'intestazione. È una pessima idea

risposta data 01.07.2014 - 14:00
fonte

Leggi altre domande sui tag