Abstract ( tl; dr )
Si prega di leggere l'intera domanda, questo è terribilmente semplificato:
In che modo è possibile applicare restrizioni di stile per i permessi dei file ai flussi di dati / controllo di tipo inter-type, consentendo un accesso preciso a alcuni membri della classe per alcuni gruppi di classi?
Informazioni di base
Se pensi ai file system e alle autorizzazioni unix, c'è un modo diverso di codificare i privilegi di accesso ai file degli utenti (specialmente se consideri anche FACL ). Ad esempio, se una directory contiene 3 file, potrebbero appartenere a più utenti e diversi altri utenti potrebbero disporre di autorizzazioni limitate:
-rwxr-xr-- jean-luc staff engage.sh
-rw-r----- william crew roster.txt
-rw------- beverly beverly patients.txt
Idea principale
Come puoi vedere, a seconda dei gruppi in cui si trova un particolare utente, sono consentiti diversi livelli di accesso. Ad esempio, crew
membri possono leggere roster.txt
, che appartiene a william
, ma gli ospiti che presumibilmente non appartengono a crew
non possono. Ancora più importante, il gruppo crew
può contenere molte persone.
Quindi stavo pensando che ci sia una certa somiglianza con i permessi di accesso all'interno di linguaggi orientati agli oggetti come il C ++ se si pensa ai tipi (classi) come utenti. Sebbene una funzione possa essere eseguita, ma non letta, i flag rwx
rappresentano descrizioni significative per i membri della classe. Un membro dati può essere letto ( r
) e scritto ( w
), forse tramite gli accessor, mentre le funzioni membro possono essere eseguite ( x
) o no.
Tuttavia, in C ++ e in altri linguaggi orientati agli oggetti (lo so), questo è più o meno un tutto o niente, se lasciamo fuori l'ereditarietà per un secondo; Se la classe William
rende pubblico il suo membro Txt roster;
, tutti lo vedranno. Se lo rende privato, nessuno tranne se stesso lo vedrà. Può aggiungere uno o più amici, friend JeanLuc;
, ma poi vedranno tutti i suoi membri privati (l'equivalente di concedere user:jean-luc:rwx
a tutti i suoi file, nel gergo FACL).
Questo è interamente ortogonale all'eredità - JeanLuc
e William
non fanno parte della stessa gerarchia, non sono correlati.
Quindi l'idea principale sarebbe quella di consentire restrizioni di accesso basate su gruppi, come una generalizzazione del privato / pubblico. Consentendo un accesso inter-class più fine alle funzioni membro e ai dati dei membri.
Credo che questo idioma possa aiutare la manutenibilità / leggibilità, poiché aggiunge ulteriori sfaccettature per limitare le autorizzazioni di interazione. Come con i sistemi operativi, dove questo aggiunge un importante livello di sicurezza al sistema, lo stesso modello familiare potrebbe aggiungere sicurezza a un progetto C ++.
Pensieri sulla rappresentazione in C ++
Tuttavia, sto perdendo il pensiero di un buon modo per rappresentarlo. Puoi decomporre William
oggetti in diversi oggetti di sottotipi: William_Crew
, William_William
e così via, che rappresentano i rispettivi gruppi. Questo sembra essere orribilmente brutto. Un'altra idea potrebbe essere tipi dedicati con funzioni di inoltro, che rappresentano i singoli gruppi, come questo:
class Crew { // group class
// in this group are:
friend JeanLuc;
friend Geordi;
friend Beverly;
// ...
static Txt getRoster(William*);
};
class William {
friend Crew; // Problem: Crew has full access (rwx)
Txt roster;
};
Ma ogni gruppo dovrebbe essere adattato a una particolare classe con cui essere utilizzato, che sembrerebbe essere ridondante in maniera massiccia, se il gruppo viene utilizzato da più utenti / classi.
Domanda
Gli approcci che ho fornito non sono eccezionali (per usare un eufemismo) e sono sicuro che non funzionerebbero come previsto. Non sono sicuro che si tratti di un'idea romanzesca / stupida / ben conosciuta, ma mi chiedo come potresti implementarlo con le funzionalità fornite dal linguaggio C ++ . Esistono argomenti oggettivi sul perché questo sarebbe o non sarebbe utile / utile?