2009-02-25 13 views
5

Esiste una buona regola empirica o un test che posso eseguire per determinare se un metodo o un campo appartiene a una classe? Come si può identificare quando un membro non appartiene?Esiste un'euristica per determinare se un metodo o un campo appartiene a una classe?

Trovo che il mio singolo più grande ostacolo nel design orientato agli oggetti stia cercando di capire cosa va dove. Sembra che ci siano troppi casi in cui la risposta è: "potrebbe andare qui o lì".

Ecco un rapido esempio del tipo di cosa che sto lottando con:

Public Class ITDepartment 

    Private _sysadmins As List(Of Employee) 
    Private _developers As List(Of Employee) 

    // properties, public stuff... 

    Private Sub AddSkillToGroup(ByVal emps As List(Of Employee), ByVal skill As Skill) 
     For Each e As Employee In emps 
      e.AddSkill(skill) 
     Next 
    End Sub 

End Class 

L'oggetto ITDepartment gestisce i 2 gruppi di Employees ... ma dovrebbe sapere che Employees hanno abilità? Dovrebbe essere trasferito un metodo come AddSkillToGroup?

EDIT:

Sembra che il consenso finora è che l'ITDepartment non dovrebbe conoscere le competenze dei dipendenti. Suonerò un po 'l'avvocato del diavolo per illustrare dove entra in gioco la mia confusione.

ITDepartment è composto da due raccolte di dipendenti. Non dovrebbe essere in grado di delegare a tali elementi di raccolta? Il metodo AddSkill appartiene ancora alla classe Employee. L'ITDepartment sta semplicemente istruendo il proprio gruppo di dipendenti ad aggiungere un'abilità a ciascuno dei suoi membri.

+0

Stai chiedendo SE devi delegare? La risposta è sempre "sì". O stai chiedendo come delegare? Se è così, ti preghiamo di risolvere la tua domanda. O stai facendo qualche altra domanda sulla delega? –

+0

Mi chiedo se va bene che la classe ITDepartment "raggiunga" e deleghi alla classe Employee tramite l'Elenco (Of Employee) di cui è composto (come fa quando chiama e.AddSkill sopra). –

risposta

3

Osservare i principi SOLID. Quelli ti daranno una guida su dove un metodo appartiene.


Modifica

"non dovrebbe [ITDepartment] in grado di delegare a tali elementi di raccolta?"

"[è esso] okay per la classe ITDepartment a" raggiungere attraverso "e delegare alla classe Employee tramite l'Elenco (Of Employee) che è composto da (come fa quando chiama e.AddSkill sopra). "

Sì.

La delega è come funziona la programmazione OO. Tu deleghi i dettagli alla Single Responsible Class. Delega l'implementazione in modo da poter dipendere dalle astrazioni e non dalle implementazioni.

BTW, AddSkillToGroup è privato, il che è fonte di confusione. Non nasconde un dettaglio di implementazione che ha qualche possibilità di cambiare. Non c'è motivo per questo di essere privato. [privato è spesso usato eccessivamente e usato in modo inappropriato. Molto, molto poco dovrebbe essere privato; e deve essere dichiarato privato solo se assolutamente necessario.]

Poiché l'implementazione è stata delegata al Dipendente, AddSkillToGroup non è un dettaglio di implementazione di questa classe.

+0

È privato perché è un dettaglio di implementazione. Potrebbe essere un metodo "aiuto" per un metodo pubblico chiamato "TrainEmployees()" che aggiunge l'abilità e assegna un certificato o qualcosa del genere. Non capisco perché sia ​​strano. –

+0

@ vg1890: private è sovrautilizzato. Questo non nasconde alcun dettaglio di implementazione che potrebbe mai cambiare e invalidare alcuni client. –

+0

@ S.Lott: non nasconde ai clienti il ​​fatto che TrainEmployees() consiste nell'aggiungere un'abilità e impedire loro di chiamare AddSkill direttamente? –

4

Sarei incline a rendere List(Of Employee) nella sua classe a questo punto, in modo che possa avere il proprio metodo AddSkill().

Immagino tu decida dagli odori del codice. In particolare liste di argomenti troppo lunghe; raggiungendo dentro altri oggetti. Potresti anche provarlo e vedere se puoi rendere più private le cose di prima.

Cerca metodi o raccolte di metodi & membri che formano un sottogruppo coerente all'interno di una classe - sono pronti per il riposizionamento nella propria classe.

+0

Sì, quello che ha detto. O eliminare completamente quella funzione poiché è così piccola, oppure creare una classe EmployeeCollection e aggiungerla a quella. Certamente non ha nulla a che fare con la classe ITDepartment. – munificent

Problemi correlati