Compliance du mot de passe en console avec Dart

Bonjour à tous… je débute donc je demande votre indulgence :sweat_smile:

Je suis actuellement la formation « Les bases de la programmation » en Dart, car je souhaite m’orienter vers flutter et le dev multi-plateformes. Je viens de terminer la section sur les fonctions, et dans l’optique de pratiquer une peu plus, j’ai souhaité pousser un peu les concepts en essayant de coder une fonction qui contrôle la validité d’un mot de passe en fonction de critères précis.

Le résultat fonctionne, mais ce que je souhaite, c’est afficher un seul message qui liste toutes les « erreurs » de l’utilisateur dans le choix du mot de passe, et pas uniquement une seule.

Au passage je suis aussi preneur de tout commentaire sur mon code (je précise à nouveau, je débute et c’est mon tout premier bout de code fait de manière totalement autonome).

String motDePasse() {
  String passeChoisi;
  bool passeValide;

  do {
    print(
        "Merci de choisir un mot de passe en respectant les règles suivantes :");
    print("- Au minimum 6 caractères, au maximum 26 caractères");
    print("- Au moins un chiffre");
    print("- Au moins une majuscule");
    print("- Au moins un caractère spécial");
    passeChoisi = readText("Choisissez un mot de passe :");
    if (passeChoisi.length < 6) {
      print("Le mot de passe doit faire plus de 6 caractères");
      passeValide = false;
    } else if (passeChoisi.length > 26) {
      print("Le mot de passe doit faire moins de 27 caractères");
      passeValide = false;
    } else if (!passeChoisi.contains(new RegExp(r'[A-Z]'))) {
      print("Le mot de passe doit contenir une majuscule");
      passeValide = false;
    } else if (!passeChoisi.contains(new RegExp(r'[0-9]'))) {
      print("Le mot de passe doit contenir un chiffre");
      passeValide = false;
    } else if (!passeChoisi.contains(new RegExp(r'[!@#$%^&*(),.?":{}|<>]'))) {
      print("Le mot de passe doit contenir un caractère spécial");
      passeValide = false;
    } else {
      passeValide = true;
    }
  } while (passeValide == false);
  return passeChoisi;
}

Merci d’avance pour vos retours :grinning:

Au lieu de mettre des elseif ne met que des if et met par défaut passValide en true

Voici a quoi ressemblerai ton code

Super ! :pray:
Un grand merci, je pense que je cherchais bien trop compliqué ! Je vais améliorer un peu le code pour ne pas répéter le message du début.

Mauvaise approche. Comme tous les débutants, tu cherches à faire le maximum avec le minimum de code. Il faut séparer les différentes fonctionnalités dans des modules différents.

Il y a deux choses là : l’analyse de la structure du mot de passe et l’affichage d’un commentaire. Comment ferais-tu pour gérer une application multi-langues ?

La première étape serait de séparer l’analyse de l’affichage, en créant une fonction retournant un booléen si le code est valide, et un code d’erreur dans le cas contraire.

Je ne connais pas Dart, donc impossible de te donner un exemple de code valide. Dommage tu ne travailles pas en Swift. Ce serai plus facile pour moi de t’aider.

Edit : je viens de regarder sur Internet, il y a une structure Switch case en Dart, plus adaptée à ton système qu’une série de if imbriqué.

https://www.tutorialspoint.com/dart_programming/dart_programming_switch_case_statement.htm

Un autre problème : tes tests s’arrêtent au premier problème rencontré.

Exemple de code : « viveleszombis » Le test s’arrête à « le mot de passe doit contenir une majuscule ». Alors que cela manque aussi de Majuscules et de chiffres.

Il faut tester tous les problèmes du mot de passe avant d’afficher une explication à l’utilisateur.

Merci pour tes commentaires Draken,
Effectivement la solution amenée par LeGlitcheurDu78 me permet d’afficher tous les problèmes rencontrés. Pour l’instant je ne vois pas comment le faire avec un switch case.

Je comprends bien ta remarque sur la séparation des fonctionnalités, Maxime l’aborde largement dans le cours et je sais que c’est en quelque sorte une « finalité » à atteindre. Pour ce qui est du cas précis du mot de passe, je pense que je manque encore un peu d’expérience pour « voir » la meilleure méthode.

En tout cas merci pour les remarques, je suis preneur de tout ce qui peut me faire progresser :ok_hand: :+1: et je ne manquerai pas d’améliorer mon code au fur et à mesure de ma montée en compétence.

Question : as-tu déjà abordé la notion de classe ? J’ai pensé à une manière d’améliorer la structure logicielle de ton problème, mais cela passe par l’utilisation d’une classe d’objets.

Je ne sais pas comment est structuré le cours sur Dart, ne l’ayant pas regardé. Te parler d’architecture logicielle n’est pas utile si tu n’as encore étudié les classes, qui sont vraiment les briques de base de la programmation moderne, ce qu’on appelle la programmation objet.

Merci Draken,
Je n’avais pas encore abordé la notion de classe au moment où j’ai écris ce code. J’ai commencé cette section hier, et oui, j’y ai aussi pensée :grinning:
Je pense qu’une fois le cours POO terminé je me lancerai dans l’optimisation de ce code

Voici un exemple simple en Swift. La conversion en Dart ne doit pas être compliqué. C’est du code objet pur, sans trop utiliser les spécificités de Swift.

La classe UnPasse gère le stockage d’un mot de passe, la vérification de validité et les messages d’erreurs. Tout est encapsulé à l’intérieur.

enum CodeErreurPasse {
  case correct, tropCourt, tropLong
}


class UnPasse {
	// Stockage du mot de passe
  var motDePasse : String = ""
    
	// test de validation du passe
  func validation() -> CodeErreurPasse {
    
    if motDePasse.count < 6
			{ return .tropCourt }
    
    if motDePasse.count > 26
			{ return .tropLong }
    
		return .correct
  }
	
	// Fabrication du message d'erreur
	func messageErreur() -> String {
		switch self.validation() {
		case .tropCourt :
			return "Le mot de passe doit avoir plus de 6 caractères"
		case .tropLong :
			return "Le mot de passe ne doit pas dépasser 26 caractères"
		default :
			return "Le mot de passe est correct"
		}
	}
  
	// Initialisation de la classe
	init (passe:String) {
		motDePasse = passe
	}
}

Je n’ai pris en compte que les cas simples.

Exemple d’utilisation :

		// Création du passe
		let monPasse = UnPasse(passe: "satan666")

		// Verification validité
		if (monPasse.validation() == .correct) {
			print ("C'est bon ! ")
			// faire quelque chose
		} else {
			// Affichage du mauvais passe
			// en extrayant son contenu de la classe
			print (monPasse.motDePasse)
			// Extraction du message d'erreur
			let erreur = monPasse.messageErreur()
			print (erreur)
		}

C’est facilement évolutif. On peut ajouter des erreurs supplémentaires en ajoutant de nouveaux codes d’erreurs dans l’énumération, et dans la vérification de validité.

Pour traiter les cas d’erreurs multiples, la fonction doit stocker les codes d’erreur dans une liste (un tableau).

// test de validation du mot de passe
  func validationErreursMultiples() -> [CodeErreurPasse] {
    
    // Création de la liste d'erreurs
    var listeErreurs = [CodeErreurPasse]()
    
    if motDePasse.count < 6
        // Ajout d'un élément dans la liste
      { listeErreurs.append(.tropCourt) }
    
    if motDePasse.count > 26
      // Ajout d'un élément dans la liste
      { listeErreurs.append(.tropLong) }
    
    return listeErreurs
  }

Top, merci pour l’exemple ! Je le garde sous le coude sans trop regarder avant d’avoir essayer par moi-même. Mais d’abord, finir le cours sur la POO :grinning: