Exoneração de responsabilidade:
Para minha resposta, vou me concentrar no assunto do estilo e esquecer se um ID, login e senha simples é um bom conjunto de parâmetros para usar, do ponto de vista da segurança. Você deve ser capaz de extrapolar minha resposta para qualquer conjunto básico de dados que esteja usando para descobrir os privilégios do usuário ...
Também considero user.isAdmin()
equivalente a IsAdmin(User user)
. Essa é uma escolha para você fazer.
Resposta:
Minha recomendação é apenas para usuários:
public bool IsAdmin(User user);
Ou use os dois, nos moldes de:
public bool IsAdmin(User user); // calls the private method below
private bool IsAdmin(int id, string name, string password);
Razões para o método público:
Ao escrever métodos públicos, geralmente é uma boa ideia pensar em como eles serão usados.
Para este caso em particular, a razão pela qual você costuma chamar este método é descobrir se um determinado usuário é um administrador. Esse é um método que você precisa. Você realmente não quer que cada chamador tenha que escolher os parâmetros certos para enviar (e cometer erros devido à duplicação de código).
Razões para o método privado:
O método privado que recebe apenas o conjunto mínimo de parâmetros necessários pode ser uma boa coisa às vezes. Às vezes nem tanto.
Uma das vantagens de dividir esses métodos é que você pode chamar a versão privada de vários métodos públicos na mesma classe. Por exemplo, se você quisesse (por qualquer motivo) ter lógica ligeiramente diferente para Localuser
e RemoteUser
(talvez haja uma configuração para ativar / desativar administradores remotos?):
public bool IsAdmin(Localuser user); // Just call private method
public bool IsAdmin(RemoteUser user); // Check if setting is on, then call private method
private bool IsAdmin(int id, string name, string password);
Além disso, se por algum motivo você precisar tornar o método privado público ... você pode. É tão fácil quanto apenas alterar private
para public
. Pode não parecer uma grande vantagem para este caso, mas às vezes realmente é.
Além disso, quando estiver testando unidades, você poderá fazer muito mais testes atômicos. Geralmente é muito bom não ter que criar um objeto de usuário completo para executar testes nesse método. E se você quiser cobertura total, pode testar as duas chamadas.