Aggancia il metodo di accesso ai dati su un oggetto sbagliato dannoso per uno sviluppatore

0

In una semplice applicazione che sto creando ci sono Admin e utenti in cui l'amministratore può creare utenti. In questo momento sto creando Classi che incapsulano le chiamate CRUD del database con i metodi.

Ad esempio: adminStore.CreateUser(userObject)

manterrà quell'oggetto utente nel Database e restituirà l'oggetto. Ora sono confuso su quale entità DataAccess ho bisogno di collegare metodi come questi. Eseguirli su adminStore li renderà sensati nel senso che gli sviluppatori capirebbero che l'amministratore sta creando l'utente e ha un ruolo di accesso. Ma da un'altra prospettiva il sotto suona logico.

mi piace: userStore.CreateUser(userObject); .

Quindi le mie domande sembrerebbero un po 'come un disegno di Api, una domanda di design di classe, ma mi piacerebbe sapere se il seguente è quello giusto.

1 UserStore.CreateUser(userObject)

2 AdminStore.CreateUser(userObject)

Aggiornamento: Ecco cosa ho scoperto dopo aver visto le risposte.

User { Name ,Email, Password }

Admin:User,IImplementsAdmin { FlagPost() etc etc }

AdminStore { CreateUser(), SetUserStatus() }

    
posta Deeptechtons 03.10.2011 - 12:08
fonte

2 risposte

1

Doing them on adminStore will make them sensible in sense developer would understand that admin is creating the user and has access role.

La politica aziendale ha poco a che fare con queste decisioni di progettazione. Le politiche cambiano frequentemente. Basta evitare di creare dipendenze circolari e funzionerà. Ad esempio, se createUser chiama i metodi in AdminStore e AdminStore dipende già da UserStore , quindi inserisci il metodo in AdminStore . Se createUser non ha dipendenza su AdminStore , o se UserStore dipende già da AdminStore , quindi inserisci il metodo in UserStore .

Ho scoperto che scrivere il test del codice mi porta prima a un progetto praticabile quasi automaticamente. Se avessi scritto un test unitario per createUser e non avessi bisogno di istanziare AdminStore per definire il test, sarebbe un strong segnale che il createUser appartiene in UserStore e non in AdminStore .

Non soffermarti troppo a lungo su queste piccole decisioni di design. Scegline uno e torna al lavoro. Più tardi potresti vedere che sarebbe meglio il contrario. Nessun problema. È solo codice. Cambialo.

Quando vedi un'applicazione o una libreria ben progettata, è quasi certamente il risultato di un sacco di refactoring, e non il risultato di un brillante design iniziale.

    
risposta data 03.10.2011 - 18:22
fonte
1

Non sono sicuro del tuo modello di oggetti, ma vorrei creare una classe utente e altre 2 classi che ereditano dall'utente. Una classe sarebbe la classe admin e l'altra è la normale classe utente. Un metodo come CreateUser sarebbe la responsabilità della classe admin che eredita dalla classe utente. Facoltativamente, puoi scegliere di rendere la classe super user una classe astratta.

Una nota a margine: qui devi considerare cosa succede se un amministratore diventa un utente normale e cosa succede se un utente normale diventa un amministratore? Il tuo modello dovrebbe adattarsi a questo.

    
risposta data 03.10.2011 - 14:59
fonte

Leggi altre domande sui tag