5
mars
2010
[Refactorisation] Extraire les méthodes des gestionnaires d’événement (EventHandler)
mars
2010
Vu récemment sur un projet, le code suivant (édité pour des raisons de confidentialité ) :
Dans la page Web :
1: <asp:Button runat="server" Id="btnUpdate" Text="Update" OnClick="btnUpdate_Click" />
2: ...
3: <asp:Button runat="server" Id="btnInsert" Text="Insert" OnClick="btnInsert_Click" />
Dans le code-behind :
1: protected void btnInsert_Click(object sender, EventArgs e){
2: var objetAInserer = new SuperObjet();
3: // une bonne dizaine de ligne de code
4: Manager.Insert(objetAInserer);
5: // encore une bonne dizaine de ligne de code
6: }
7:
8: protected void btnUpdate_Click(object sender, EventArgs e){
9: var objetMisAJour = Manager.LoadByPrimaryKey(currentId);
10: // une bonne dizaine de ligne de code, les mêmes que pour Insert
11: Manager.Update(objetMisAJour );
12: // encore une bonne dizaine de ligne de code, les mêmes que pour Insert
13: }
Et donc, à la maintenance, deux procédures identiques à maintenir…
Et en plus, un bug de copier-coller dans les deux.
Le copier-coller étant une plaie, et le précepte DRY en tête, une petite dizaine de minute de refactorisation donne le code suivant :
1: protected void btnInsert_Click(object sender, EventArgs e){
2: InsertOrUpdate(false);
3: }
4:
5: protected void btnUpdate_Click(object sender, EventArgs e){
6: InsertOrUpdate(true);
7: }
8:
9: private void InsertOrUpdate(bool isUpdate){
10: var objetEnCours = new SuperObjet();
11: if (isUpdate){
12: objetEnCours= Manager.LoadByPrimaryKey(currentId);
13: }
14: // une bonne dizaine de ligne de code
15: if (isUpdate){
16: Manager.Update(objetEnCours);
17: }else{
18: Manager.Insert(objetEnCours);
19: }
20: // encore une bonne dizaine de ligne de code
21: }
Vous allez me dire que ce n’est pas transcendant, mais apparemment, trop de personnes ignorent cette bonne pratique de ne pas traiter l’événement dans le gestionnaire d’événements !
Articles récents
Archives
- janvier 2014
- septembre 2013
- août 2013
- mai 2013
- avril 2013
- janvier 2013
- août 2012
- juin 2012
- mai 2012
- avril 2012
- mars 2012
- novembre 2011
- septembre 2011
- août 2011
- juillet 2011
- juin 2011
- mai 2011
- avril 2011
- février 2011
- janvier 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009