Eu tenho algumas aulas de auxiliar no meu projeto. Eu li que isso é uma coisa ruim, mas suspeito que "Helper" seja o sufixo errado para eles. Eu vou dar um exemplo.
Primeiro, eu tenho uma User
aula. Eu preciso de um método GetSuggestedFriends()
para um usuário. Quero manter a lógica para determinar a lista de amigos sugeridos fora da User
classe, para que não fique inchado. Agora, eu tenho um FriendshipHelper
que recebe um User
em seu construtor. Ele contém a lógica para receber amigos sugeridos e agora posso ligar myUser.FriendshipHelper.GetSuggestedFriends()
.
Originalmente, FriendshipHelper
tinha apenas métodos estáticos e um User
objeto foi passado para cada um. Se eu estivesse escrevendo a turma do zero agora, talvez eu chamasse FriendshipManager
- também faz coisas como adicionar e remover amigos.
Eu também li que as ...Manager
aulas são ruins, no entanto. Como devo chamar essa classe? Ou, é esse "código incorreto"? Onde deve estar a lógica para obter amigos sugeridos, amigos atuais e adicionar e remover amigos? Certamente nem todos em uma User
classe gigante ?
fonte
Facebook
?Respostas:
Em geral: por um bom design
Sim. A
user
tem um relacionamento com outrousers
. E o relacionamento pode ser expresso como um métodouser
, por exemplouser.isFriend(user2)
. Essa é a responsabilidade douser
objeto-. Além disso, você pede a outro objeto ajuda para encontrar outros amigos . Você delega a responsabilidade de encontrar amigos para outro objeto, e isso é ótimo .Isso não é, por si só , ruim, mas tem uma desvantagem: inicializar o "Auxiliar" com um
user
limita as possibilidades a eleuser
.O que você precisa é de um objeto , o que ajuda a encontrar amigos para qualquer usuário. Assim, um método genérico faria sentido:
userMatcher.findFriendsFor(user)
que em troca oferece uma coleção de possíveis amigos (user
).Seu problema não é escrever "classes auxiliares", é encontrar os nomes certos . ;)
Esse é um design errado . Por exemplo: sua mãe adiciona amigos à sua vida ou você os adiciona sozinho?
É claro que a coleção de amigos é uma propriedade em
user
si e também o métodouser.addFriend(user)
ouuser.removeFriend(user)
Como dito anteriormente: você só tem um problema de nomeação e seus "ajudantes" estão bem . Mas você precisa pensar com mais cuidado sobre as responsabilidades de cada objeto.
Não. São dois trabalhos para os quais você precisa de um objeto separado , como na vida real, onde você tem pessoas e uma agência de namoro .
fonte
Eu sugiro que você tenha uma
FriendshipService
classe que possui umGetSuggestedFriends(User)
método (não estático) . Evite métodos estáticos, pois você não pode implementar uma interface que torne mais difícil o teste. Evite adicionar o objeto de usuário ao construtor, pois você pode estender seu FriendshipService com métodos não especificamente relacionados a um único usuário. (Por exemplo, você pode sugerir amigos para um conjunto de usuários ou sugerir amigos com base em outra coisa)Um usuário provavelmente não deve estar ciente do
FriendshipService
(devido ao Padrão de responsabilidade única)fonte