Je lis partout que si les instructions/switch sont mieux évitées dans la plupart des cas avec la POO. Mon problème est de savoir comment éviter une instruction switch lors du codage d'un login.Comment éviter les conditions pour un login?
J'ai une structure MVP et un client lors de la connexion sera redirigé vers la vue appropriée en fonction du type de client qui est défini par une énumération. Donc, si le client est de type client '0', alors ils devraient être redirigés vers la page d'accueil du client, si le type de client est '1', alors ils devraient être redirigés vers la page d'accueil de l'administrateur ect ... Ma première pensée est qu'il devrait y avoir quelques classes client-login qui sont créées quand un nom d'utilisateur valide et un mot de passe sont soumis. Ces classes pourraient chacun avoir une méthode de redirection spécifique - quelque chose comme classe client-login, classe admin-connexion etc ...
Le problème est maintenant que mon LoginPresenter
est celui qui appelle les méthodes de redirection qui appartiennent au LoginView
via la vue Interface
.
Si mon modèle renvoyait une classe de connexion client au Presenter, comment la classe de connexion client aurait-elle accès aux méthodes de redirection LoginViews
?
Il me semble que le présentateur est la seule classe capable d'appeler les méthodes de redirection, donc je suis un peu déconcerté comment je devrais procéder. J'ai besoin d'un moyen pour que la classe de connexion client indique au présentateur la méthode de redirection à appeler.
Voici le code tel qu'il est maintenant dans le présentateur ...
public class LoginPresenter : PresenterBase
{
private readonly ILoginView _view;
private readonly ILoginModel _model;
private ClientType _clientType;
public LoginPresenter(ILoginView view, ILoginModel model)
{
_view = view;
_model = model;
_view.LoginAttempt += OnLoginAttempt;
}
private void OnLoginAttempt(object sender, EventArgs e)
{
AttemptLogin();
}
public void AttemptLogin()
{
string email = _view.Email;
string password = _view.Password;
bool ClientExists = _model.CheckClientExists(email, password);
if (ClientExists)
{
_clientType = (ClientType)_model.GetClientType();
CheckClientType();
}
else
{
_view.Message = "Login Failed";
}
}
private void CheckClientType()
{
switch (_clientType)
{
case ClientType.Customer:
_view.RedirectToCustomerHomePage();
break;
case ClientType.Operator:
_view.RedirectToOperatorHomePage();
break;
case ClientType.Admin:
_view.RedirectToAdminHomePage();
break;
}
}
Bien sûr, cela fonctionne avec le boîtier de l'interrupteur, mais ce n'est pas très approche orientée objet. Avoir à demander au modèle de fournir le type de client et ensuite vérifier le type de client me fait mal quand je pourrais obtenir le modèle pour me donner un objet capable de dire au présentateur ce dont il a besoin - je sais qu'il manque quelque chose ici.
Je serais très reconnaissant pour toute l'aide ou des conseils: D
Lit le modèle de stratégie. – Nkosi
Merci! Est-ce que le modèle de stratégie peut gérer le problème concernant la façon d'obtenir la redirection appelée dans la vue? C'est le problème majeur pour moi - les exemples que j'ai trouvés jusqu'ici ont tous des sous-classes appelant des méthodes qui ne reposent pas nécessairement sur une classe externe comme une vue. Ceux que j'ai trouvés sont généralement pour calculer une valeur ou retourner une chaîne. Quel pourrait être le mécanisme pour déclencher la bonne redirection? – Chi
Vous devrez fournir plus de code et mieux expliquer le scénario dans un [mcve] qui peut être utilisé pour représenter votre problème. – Nkosi