Un simbolo - un significato?

-1

Sono note le raccomandazioni che:

  • 1) la classe o la funzione dovrebbero avere una sola responsabilità
  • 2) La variabile non deve essere riutilizzata in contesti diversi

Possiamo generalizzare questa raccomandazione alla regola generale:

Il simbolo dovrebbe avere un significato.

Quindi, ad esempio nello sviluppo multipiattaforma, viene spesso utilizzato un codice simile:

#ifdef _WIN32

    class CFoo {
        /* ... */
    };

#elif _LINUX

    class CFoo {
        /* ... */
    };

#endif

Con questo codice, quando in seguito si fa riferimento a CFoo , può avere tre significati:

  • CFoo come classe specifica per la piattaforma Win32
  • CFoo come classe specifica per piattaforma Linux
  • CFoo come classe crossplatform

Quindi, quando utilizzi il simbolo CFoo da qualche parte, non è esattamente chiaro quale CFoo sia.

Illumina il codice simile "essence" delle raccomandazioni 1) o 2)?

    
posta user3123061 25.04.2015 - 11:18
fonte

1 risposta

5

Una domanda sulla parola "significato" non deve essere discussa in termini senza senso come CFoo .

Facciamo un esempio migliore:

#ifdef _WIN32
    class MyUsbDriver {
        /* ... a public API to access a special USB devcice.. */
        /* ... internal implementation: Windows sepecific.. */
    };
#elif _LINUX
    class MyUsbDriver {
        /* ... exactly the same API as in the WIN32 version.. */
        /* ... internal implementation: Linux sepecific.. */
    };
#endif

In questo modo crei una astrazione per un Usb-Driver, quindi per il codice effettivamente usando quella classe entrambe le varianti hanno lo stesso significato - da questo punto di vista. Idealmente, per il codice chiamante, non dovrebbe esserci alcuna differenza visibile tra le due classi.

Si noti che in C ++, si hanno mezzi molto migliori per creare tali astrazioni rispetto all'utilizzo del preprocessore. Per una tale situazione sarebbe probabilmente preferibile rendere MyUsbDriver una classe di interfaccia astratta, con classi derivate MyUsbDriverWin32 e MyUsbDriverLinux . Tuttavia, probabilmente dovrai incapsulare queste due classi derivate in #ifdef blocks, altrimenti potresti non essere in grado di compilare ogni classe nell'ambiente per cui non è stata progettata.

Ciò che dovresti evitare è qualcosa come

#ifdef _WIN32
    class MyUsbDriver {
        /* ... a public API to access a special USB devcice.. */
    };
#elif _LINUX
    class MyUsbDriver {
        /* ... a completely different API as in the WIN32 version.. */
        /* ... or (worse): a similar looking API, with a different behaviour  */
    };
#endif

sarebbe in qualche modo simile al "riutilizzo della stessa variabile in contesti diversi due volte".

    
risposta data 25.04.2015 - 11:40
fonte

Leggi altre domande sui tag