Tengo bastantes clases de ayudantes en mi proyecto. He leído que esto es algo malo, pero sospecho que "Helper" es el sufijo incorrecto para ellos. Daré un ejemplo.
Primero, tengo una User
clase. Necesito un método GetSuggestedFriends()
para un usuario. Quiero mantener la lógica para determinar la lista de amigos sugeridos fuera de la User
clase, para que no se hinche. En este momento, tengo un FriendshipHelper
que recibe un User
en su constructor. Contiene la lógica para obtener amigos sugeridos, y ahora puedo llamar myUser.FriendshipHelper.GetSuggestedFriends()
.
Originalmente FriendshipHelper
tenía métodos estáticos solamente, y User
se pasó un objeto a cada uno. Si escribiera la clase desde cero ahora, tal vez lo llamaría FriendshipManager
, también hace cosas como agregar y eliminar amigos.
Sin ...Manager
embargo, también he leído que las clases son malas. ¿Cómo debería llamar a esta clase? ¿O es este "código incorrecto"? ¿Dónde debería vivir la lógica para obtener amigos sugeridos, amigos actuales y agregar y eliminar amigos? ¿Seguramente no todos en una User
clase gigante ?
fuente
Facebook
?Respuestas:
En general: por buen diseño
Si. A
user
tiene una relación con otrousers
. Y la relación podría expresarse como un métodouser
, por ejemplouser.isFriend(user2)
. Esta es la responsabilidad del objetouser
. Además de eso, le pides ayuda a otro objeto para encontrar otros amigos . Delegas la responsabilidad de encontrar amigos a otro objeto y eso está bastante bien .Eso no es per se malo, pero tiene una desventaja: inicializar el "Helper" con uno
user
limita las posibilidades a eseuser
.Lo que necesita es un objeto , que ayuda a encontrar amigos para cualquier usuario. Por lo tanto, un método genérico tendría sentido:
userMatcher.findFriendsFor(user)
que a cambio ofrece una colección de posibles amigos (user
).Su problema no es escribir "clases auxiliares", es encontrar los nombres correctos . ;)
Ese es un diseño incorrecto . Tómese por ejemplo: ¿su mamá agrega amigos a su vida o los agrega usted mismo?
Por supuesto, la colección de amigos es una propiedad en
user
sí misma y también lo es el métodouser.addFriend(user)
ouser.removeFriend(user)
Como se dijo antes: solo tiene un problema de nomenclatura y sus "ayudantes" están bien . Pero tienes que pensar más cuidadosamente sobre las responsabilidades de cada objeto.
No. Estos son dos trabajos para los que necesita un objeto separado , como en la vida real donde tiene personas y una agencia de citas .
fuente
Sugeriría que tenga una
FriendshipService
clase que tenga unGetSuggestedFriends(User)
método (no estático) . Evite los métodos estáticos, ya que no puede implementar una interfaz que dificulte la prueba. Evite agregar el objeto de usuario al constructor, ya que es posible que desee ampliar su FriendshipService con métodos no relacionados específicamente con un solo usuario. (Por ejemplo, es posible que desee sugerir amigos a un conjunto de usuarios o sugerir amigos según otra cosa)Lo más probable es que un usuario no sea consciente del
FriendshipService
(debido al Patrón de responsabilidad única)fuente