E-SOLID: Exercices sur les principes SOLID+T

Utilisez le code suivant pour répondre aux questions suivantes:

Si on veut envoyer les courriels via un service (API) externe (pas directement en SMTP)?

Si on supporte aussi le protocole LDAP pour aller chercher les informations du client?

Et si on modifiait la BD pour conserver la date complète de naissance. Qui est impacté ? Si on décidait de regrouper les attributs « contactInfo » dans le Client. Qui est impacté ?

Essayez de faire un réusinage afin respecter le Tell don’t Ask.

Code original

Client {
	clId: int_sql_sequence
	numero_client: NumeroClient
	nom: string
	courriel: Email
	annee_naissance: int
	sms: string
}

ClientController::edit(client_id, clientData) {
	client = _validateAndConvertToObject(clientData)
	ClientDb.update(client_id, client)
}

ClientController::sendEmail(numero_client, sujet, texte) {
	client = ClientDb.getClientParNumero(numero_client)
	EmailSender.send(client.courriel, sujet, texte)
}

PriceController::getPriceFor(client_id)
{
	client = ClientDb.getClient(client_id)
	annee_naissance = client.getAnneeNaissance()
	if(today.year - annee_naissance < 14) {
		return PRIX_ENFANT;
	}

	return PRIX_STANDARD;
}

MoviePlayer::jouer(film_id, device_id) {
	client_id = _getClientLoggedOnDevice(device_id)
	client = ClientDb.getClient(client_id)

	film = FilmDb.getFilm(film_id)

	if(film.classement.getAgeMinimum() > (today.year - annee_naissance)) {
		throw ClientPasAgeMinimumPourFilm()
	}

	...
}

ClientDb::getClient(client_id) <static> {
	result = dbConnection.query("SELECT * from CLT WHERE clId=" + client_id)
	return _convertToObject(result)
}


EmailSender::send(courriel, sujet, texte) {
	smtpServer.hello()
	smtpServer.mailFrom(AppConfig.EmailFrom)
	smtpServer.rcptTo(courriel)
	smtpServer.data(texte + "\n.")
	smtpServer.quit()
}

Solution

Aucune solution ne sera donnée. Demander l’avis des assistants dans le laboratoire pour obtenir une rétroaction et discutez avec votre groupe d’étude de vos réponses.