Implementazione di una classe di nome utente

3

Sto tentando di incapsulare diverse funzionalità su un utente in una singola classe. Sebbene l'uso principale di questa classe sia quello di inizializzarlo una volta e non dover mai richiamare alcuna variabile, vorrei che questa classe fosse scalabile per essere chiamata più volte. Anche se inserendo questo in una classe mi sento come se fossi troppo complicato o rompere gli standard OOP.

Al momento sto utilizzando attualmente questi tipi di chiamate correnti attraverso il codice VBA:

username = GetUsername()

o

IF userHasSecurity(GetUsername(), "WhatUserHasAccessTo") = true THEN

Quello che spero di farlo sostituirlo (rispettivamente) con:

  Set UserID = New Username
  UserID.GetUserName

o

IF UserID.HasModuleAccess("WhatUserHasAccessTo") = true THEN

Oltre a questa modifica, ho una funzione che restituisce informazioni Active Directory e inoltre verifica se l'input dei nomi utente esiste in Active Directory

Il diagramma delle classi è come tale

Private UserName As String
Private FirstName As String
Private MiddleInitial As String
Private LastName As String

Private Sub class_Initialize()
Private Function findCurrentUsername() As String
Private Function doesUsernameExist(usernameToCheck As String) As Boolean  
Public Property Get GetUserName() As String
Public Property Let setUsername(newUsername As String)
Public Property Get getFirstName() As String
Private Property Let setFirstName(newFirstName As String)
Public Property Get getLastName() As String
Private Property Let setLastName(newLastName As String)
Public Property Get getMiddleInitial() As String
Private Property Let setMiddleInitial(newMiddleInitial As String)
Private Function findNameDetails()
Public Property Get getFullName() As String
Public Function HasModuleAccess(moduleName As String, Optional appName As String) As Boolean
Public Function getUserActiveDirectoryGroups() As DAO.Recordset

Si tratta più di una cosa basata sull'esecuzione (funzioni standalone contro classe) o c'è qualcosa da guadagnare? Questo rompe gli standard OOP e sto usando le classi in modo errato?

    
posta Elias 06.08.2014 - 18:33
fonte

1 risposta

3

* prima di sederti a scrivere codice ecc. - cerca, ricerca risorse disponibili, funzioni - fondamentalmente non reinventare la ruota ...

Esiste una funzione Environ () in VBA che fa praticamente quello che stai descrivendo e cercando di imitare usando la tua classe di wrapper .. chiediti se ne vale la pena? ne hai davvero bisogno?

Regola generale

Attacca con un buon incapsulamento

hai detto:

Although the main use for this class would be to initialize it once and never have to call set any variables again,

Non dare per scontato cose che potrebbero rompere l'incapsulamento - non dare per scontato che non dovrai mai fare X e Y con la tua classe - esistono diverse tecniche per proteggere lo stato degli oggetti attraverso le proprietà.

Come già sottolineato nella sezione dei commenti, è importante che la tua classe sia denominata User e non Username .

È un user . Se è inteso per essere riutilizzabile nel senso che puoi riutilizzarlo in molti progetti diversi - non hanno molte istanze di esso allora non dovrebbe essere dipeso da qualsiasi altro pezzo, non correlato, della tua applicazione - specialmente la directory attiva ecc. Se VBA supportava costruttori parametrizzati che avrebbero potuto essere una storia diversa basata su alcune circostanze cruciali ma non è così, non è necessario alcun argomento.

leggi questo: Proprietà vs variabili pubbliche in moduli di classe

Spero che tu abbia l'idea, perché per quanto riguarda la tua % classe diUser non hai davvero bisogno di alcune proprietà che hai attualmente dichiarato come proprietà ...

Voglio dire, guarda - non stai memorizzando User età - non hai davvero bisogno di una proprietà Let per verificare se età passato non è negativo o non maggiore di un numero enorme ... Stai solo memorizzando alcune stringhe come firstName , lastName , middleInitial ecc. se non hai bisogno di proteggere l'accesso per cambiarle allora idealmente dovrebbero essere solo public variabili - che agiscono specie come proprietà di lettura / scrittura - senza la possibilità di verificare i dati che vengono assegnati a loro - ma è importante? Sono Strings ...

Un buon candidato per una proprietà potrebbe essere una proprietà Enumerable UserAccessLevel ...

Prima probabilmente vorrai definire un Enum pubblico come

Public Enum UserAccessLevel
    ualReadOnly
    ualWriteOnly
    ualReadWrite
End Enum

quindi potresti avere una proprietà come

private currentUserAccessLevel as UserAccessLevel

' cool stuff

Public Property Get ModuleAccess() as UserAccessLevel
    ModuleAccess = currentUserAccessLevel
End Property

Public Property Let ModuleAccess(value as UserAccessLevel)
    currentUserAccessLevel = value
End Property

Sarebbe bello con tutti i suggerimenti intelli-sense per le tue enumerazioni ecc ...

Ora ho notato questo:

Public Function getUserActiveDirectoryGroups() As DAO.Recordset

E ho sentimenti contrastanti perché

  • VBA non supporta il polimorfismo di classe - quindi non puoi ricavare un CustomUser da User - So che fa schifo ... ma puoi creare un nuovo classe ed esporre un User come una proprietà della classe ecc. Troppo ampia per discutere qui però ...

  • getUserActiveDirectoryGroups() potrebbe non essere necessariamente qualcosa che qualsiasi altro progetto potrebbe voler utilizzare. Voglio dire che è bello averlo lì, purché non dipenda da nessun altro esterno e non correlato ai membri della classe User corrente.

Dì che getUserActiveDirectoryGroups() deve sapere cose che la classe corrente User non ha accesso / non sa di quanto sarebbe probabilmente un'idea migliore non per includerla con il classe utente.

Potrei parlare di questo per un'altra o due ore ma spero davvero che a questo punto tu ti senta un po 'più illuminato:)

Attacca con una buona incapsulamento.

da qui

  • Comprendi il principio orientato agli oggetti di Incapsulamento.
  • Scopri i modificatori disponibili per i membri del tipo.
  • Proteggi lo stato dell'oggetto tramite le proprietà.
  • Controlla l'accesso ai metodi.
risposta data 22.10.2014 - 15:27
fonte

Leggi altre domande sui tag