OVH Cloud OVH Cloud

Refactoring

3 réponses
Avatar
Etudiant
Bonsoir,
pourriez m'expliquer ce qu'est le refactoring
merci

3 réponses

Avatar
Zoury
Bonsoir ! :O)

Tu comprends l'anglais ?
http://msdn.microsoft.com/vbasic/downloads/2005/tools/refactor/refactorwhitepaper/


Sinon, le refactoring consiste à modifier la structure du code par de petits
changements par-ci, par là dans le but de le rendre plus propre, plus
performant et/ou plus flexible en y préservant le traitement qui y est
effectué.

Un exemple vaut mille mots dans ce cas-ci ... alors supposons les fonctions
suivantes (les morceaux de codes qui suivent n'ont pas été testé, ils n'ont
font que démontrer le concept) :
'***
Private Function ObtenirListeClients(ByVal cn As SqlConnection, _
ByVal
nIdEtablissement As Int32, _
ByVal dtDebutPeriode
As DateTime, _
ByVal dtFinPeriode
As DateTime) As DataSet

Dim cmd As OracleCommand
Dim da As OracleDataAdapter
Dim p As OracleParameter
Dim ds As DataSet

' préparation de la requête
cmd = New OracleCommand
cmd.Connection = cn
cmd.CommandText = "sp_obtenir_liste_clients"
cmd.CommandType = CommandType.StoredProcedure

' préparation des paramètres
p = New SqlParameter
p.ParameterName = "@id_etablissement"
p.OracleDbType = SqlDbType.Int
p.Direction = ParameterDirection.Input
p.Value = nIdEtablissement

p = New SqlParameter
p.ParameterName = "@date_debut_periode"
p.OracleDbType = SqlDbType.DateTime
p.Direction = ParameterDirection.Input
p.Value = dtDebutPeriode

p = New SqlParameter
p.ParameterName = "@date_fin_periode"
p.OracleDbType = SqlDbType.DateTime
p.Direction = ParameterDirection.Input
p.Value = dtFinPeriode

' initialise les objets retrouvant les données
ds = New DataSet
da = New OracleDataAdapter(cmd)

' initialise la connexion et exécute la requête
da.Fill(ds)

' dispose des ressources non-managées
cmd.Dispose()
da.Dispose()
p.Dispose()

Return ds

End Function

Private Function ObtenirListeEtablissements(ByVal cn As SqlConnection, _
ByVal
nIdCompagnie As Int32) As DataSet

Dim cmd As OracleCommand
Dim da As OracleDataAdapter
Dim p As OracleParameter
Dim ds As DataSet

' préparation de la requête
cmd = New OracleCommand
cmd.Connection = cn
cmd.CommandText = "sp_obtenir_liste_client_par_etab"
cmd.CommandType = CommandType.StoredProcedure

' préparation des paramètres
p = New SqlParameter
p.ParameterName = "@id_compagnie"
p.OracleDbType = SqlDbType.Int
p.Direction = ParameterDirection.Input
p.Value = nIdCompagnie

' initialise les objets retrouvant les données
ds = New DataSet
da = New OracleDataAdapter(cmd)

' initialise la connexion et exécute la requête
da.Fill(ds)

' dispose des ressources non-managées
cmd.Dispose()
da.Dispose()
p.Dispose()

Return ds

End Function
'***

et bien on pourrait modifier le code un tantinet en implémentant une
CreerParametre() ce qui rendrait le code moins redondant <- centralisation.
Ainsi si on veut modifier la manière de créer les paramètres, nous n'aurions
qu'une seule fonction à modifier et non 4 blocs de code distinct ce qui
diminue de beaucoup les risques d'erreurs en plus de raccourcir
considérablement la tâche de travail.

Ex :
'***
Private Function CreerParametre(ByVal sNomParametre As String, _
ByVal eTypeSql As
SqlDbType, _
ByVal eDirection As
ParameterDirection, _
ByVal oValue As Object)
As SqlParameter

Dim p As SqlParameter

p = New SqlParameter
p.ParameterName = sNomParametre
p.OracleDbType = eTypeSql
p.Direction = eDirection
p.Value = oValue

Return p

End Function

Private Function ObtenirListeClients(ByVal cn As SqlConnection, _
ByVal
nIdEtablissement As Int32, _
ByVal dtDebutPeriode
As DateTime, _
ByVal dtFinPeriode
As DateTime, _
ByVal nNbrAchatsMin
As Int32) As DataSet

Dim cmd As OracleCommand
Dim da As OracleDataAdapter
Dim p As OracleParameter
Dim ds As DataSet

' préparation de la requête
cmd = New OracleCommand
cmd.Connection = cn
cmd.CommandText = "sp_obtenir_liste_client_par_etab"
cmd.CommandType = CommandType.StoredProcedure

' préparation des paramètres
p = CreerParametre("@id_etablissement", SqlDbType.Int,
ParameterDirection.Input, nIdEtablissement)
p = CreerParametre("@date_debut_periode", SqlDbType.DateTime,
ParameterDirection.Input, dtDebutPeriode)
p = CreerParametre("@date_fin_periode", SqlDbType.DateTime,
ParameterDirection.Input, dtFinPeriode)
p = CreerParametre("@nbr_achats_min", SqlDbType.DateTime,
ParameterDirection.Input, nNbrAchatsMin)

' initialise les objets retrouvant les données
ds = New DataSet
da = New OracleDataAdapter(cmd)

' initialise la connexion et exécute la requête
da.Fill(ds)

' dispose des ressources non-managées
cmd.Dispose()
da.Dispose()
p.Dispose()

Return ds

End Function
'***

et voilà, nous venons d'exécuter du "refactoring".
Mais ce n'est pas fini ! Nous pourrions continuer encore et encore. :O)
Les fonctions sont pratiquement identique, seule les paramètres et le nom de
la procédure stockée change.. alors nous pourrions implémenter un méthode
AppelerProcedure qui s'occuperait de l'appel à la base de données. Ainsi
nous pourrions créer une tonne d'autre méthode permettant de retourné des
DataSet en quelques lignes seulement.

Ex :
'***
Private Function CreerParametre(ByVal sNomParametre As String, _
ByVal eTypeSql As
SqlDbType, _
ByVal eDirection As
ParameterDirection, _
ByVal oValue As Object)
As SqlParameter

Dim p As SqlParameter

p = New SqlParameter
p.ParameterName = sNomParametre
p.OracleDbType = eTypeSql
p.Direction = eDirection
p.Value = oValue

Return p

End Function

Private Function AppelerProcedure(ByVal cn As SqlConnection, _
ByVal sNomProcedure
As String, _
ByVal arrParametres
As SqlParameter()) As DataSet

Dim cmd As OracleCommand
Dim da As OracleDataAdapter
Dim p As OracleParameter
Dim ds As DataSet

' préparation de la requête
cmd = New OracleCommand
cmd.Connection = cn
cmd.CommandText = sNomProcedure
cmd.CommandType = CommandType.StoredProcedure

' préparation des paramètres
For Each p In arrParametres
cmd.Parameters.Add(p)
Next p

' initialise les objets retrouvant les données
ds = New DataSet
da = New OracleDataAdapter(cmd)

' initialise la connexion et exécute la requête
da.Fill(ds)

' dispose des ressources non-managées
cmd.Dispose()
da.Dispose()
p.Dispose()

Return ds

End Function

Private Function ObtenirListeClients(ByVal cn As SqlConnection, _
ByVal
nIdEtablissement As Int32, _
ByVal dtDebutPeriode
As DateTime, _
ByVal dtFinPeriode
As DateTime, _
ByVal nNbrAchatsMin
As Int32) As DataSet

Return AppelerProcedure( _
cn, _
"sp_obtenir_liste_client_par_etab", _
New SqlParameter() { _
CreerParametre("@id_etablissement", SqlDbType.Int,
ParameterDirection.Input, nIdEtablissement),
CreerParametre("@date_debut_periode", SqlDbType.DateTime,
ParameterDirection.Input, dtDebutPeriode),
CreerParametre("@date_fin_periode", SqlDbType.DateTime,
ParameterDirection.Input, dtFinPeriode),
CreerParametre("@nbr_achats_min", SqlDbType.DateTime,
ParameterDirection.Input, nNbrAchatsMin)})

End Function

Private Function ObtenirListeEtablissements(ByVal cn As SqlConnection, _
ByVal
nIdCompagnie As Int32) As DataSet

Return AppelerProcedure( _
cn, _
"sp_obtenir_liste_etab", _
New SqlParameter() { _
CreerParametre("@id_compagnie", SqlDbType.Int,
ParameterDirection.Input, nIdCompagnie)})

End Function
'***

On pourrait maintenant penser à diviser ces méthodes par classes distinctes
:
- une classe AccesDonnees qui contiendrait les méthodes
AppelerProcedure() et CreerParametre() (Shared) et qui peut même être
réutilisable dans tout tes projets si tu la place dans une DLL.
- une classe Client qui contiendrait une méthode ObtenirListe()
(Shared).
- une classe Etablissement qui contiendrait une méthode ObtenirListe()
(Shared).


Et voilà !
J'espère t'avoir éclairé sur ce qu'est le refactoring. C'est une technique
très très efficace si appliquée régulièrement (je l'applique personnellement
tout le temps...)

--
Cordialement
Yanick
MVP pour Visual Basic
"Etudiant" a écrit dans le message de
news:
Bonsoir,
pourriez m'expliquer ce qu'est le refactoring
merci


Avatar
Zoury
Oups!.. J'ai oublié d'implémenter ObtenirListeEtablissements() dans le
deuxième bloc de code... mais je doute que ça nuise à ta compréhension. ;O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Etudiant
merci pour cette explixation, en fait je l'utilisait qque fois avec le
2003 sans savoir que c'etait cela :)

a+