( Ho chiesto a domanda simile che risponde focalizzata sul tempo di compilazione anziché sul runtime. Invece di aggiungere i requisiti di runtime all'altra domanda e invalidare le buone risposte, ho deciso di porre una nuova domanda incentrata su comunicazione di runtime )
Scenario
Un'applicazione web definisce un'interfaccia di backend utente IUserBackend
con i metodi
- getUser (UID)
- createUser (UID)
- deleteUser (UID)
- setPassword (uid, password)
- ...
Diversi backend dell'utente (ad esempio LDAP, SQL, ...) implementano questa interfaccia ma non tutti i backend possono fare tutto. Ad esempio, un server SQL concreto non consente (autorizzazioni a DELETE
) questo backend dell'utente per eliminare utenti. Oppure l'amministratore non ha impostato le query SQL utilizzate per creare utenti.
Il back-end dell'utente deve reagire a questo durante il runtime e comunicare all'applicazione Web se può o meno eliminare utenti con la configurazione corrente.
Soluzione nota
Ho visto una soluzione in cui IUserInterface
ha un metodo implementedActions
che restituisce un intero che è il risultato di OR bit a bit delle azioni AND bit a bit con le azioni richieste:
function implementedActions(requestedActions) {
return (bool)(
ACTION_GET_USER
| ACTION_CREATE_USER
| ACTION_DELTE_USER
| ACTION_SET_PASSWORD
) & requestedActions)
}
Dove
- ACTION_GET_USER = 1
- ACTION_CREATE_USER = 2
- ACTION_DELETE_USER = 4
- ACTION_SET_PASSWORD = 8
- .... = 16
- .... = 32
ecc.
Quindi l'applicazione web imposta una maschera di bit con ciò di cui ha bisogno e implementedActions()
risponde con un booleano indipendentemente dal fatto che li supporti.
PARERE
Queste operazioni bit mi sembrano reliquie dal C age, non necessariamente facili da capire in termini di codice pulito.
Domanda
Che cos'è un modello moderno (migliore?) per la classe per comunicare il sottoinsieme dei metodi di interfacce implementati per una data configurazione durante il runtime? Oppure il "metodo operativo bit" dall'alto è ancora la migliore pratica?
( Nel caso abbia importanza: PHP, anche se sto cercando una soluzione generale per le lingue OO )