Tiens, ca faisait longtemps que j'avais pas bloggé...
Qu'est-ce que vous pensez de ce bout de code, et est-ce que vous pouvez deviner pourquoi il me donne des boutons ?
flag = hidValue.Value == "1" ? "F" :
hidValue.Value == "2" ? "Y" :
hidValue.Value == "3" ? "N" : null;
Y'a rien a gagner ;)
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte Comme quoi on en apprends tous les jours.
La MSDN ne fournissant que des exemples du genre :
Je m'étais résigné à n'utiliser les initialiseurs qu'avec des constructeurs sans paramètres.
Alors qu'en fait, non, on peut tout à fait faire ceci :
Qui fonctionne très bien :)
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte Suite a encore un mini tollé dans la communauté Agile/Alt.Net, une fois de plus provoqué par un billet de Joël Spolski (mais bon, ca devient une habitude ;) ), une des nombreuses critiques faites concernait le "cout d'entrée" pour utiliser des outils considérés comme pas encore "standards"
...sous-entendu, le développeur lambda ne peut/veut pas comprendre l'intérêt d'utiliser, par exemple, un ORM, un framework IoC ou les principes SOLID.
Je ne reviendrais pas sur le sujet (déjà fait la dernière fois), mais Rob Conery (depuis peu parti de Microsoft) a pondu quelques billets très bien fichus sur l'intérêt d'utiliser un framework IoC, ou sur le mocking.
Alors, oui, c'est en anglais, mais c'est le prix a payer ;)
Vous devez être identifié pour poster un commentaire.
En revue de code, cette semaine, j'ai eu beaucoup de code du genre :
1: HttpContext context = HttpContext.Current;
2: LifeCycle lifecycle;
3:
4: if (context.Session["CachedLifeCycle"] != null) {
5: lifecycle = (LifeCycle)context.Session["CachedLifeCycle"];
6: } else {
7: lifecycle = Factory.GetLifeCycle();
8: context.Session["CachedLifeCycle"] = lifecycle;
9: }
10:
11: return lifecycle;
Genre...beaucoup...
Et du code comme ca, aussi (je simplifie :
1: if (value == null){
2: message = "default";
3: }else{
4: message = value;
5: }
Et la, du coup, il a fallu sortir un coup l'artillerie pour faire rentrer tout le monde dans le droit chemin, a savoir, l'operateur ??
L'operateur ?? est un operateur qui renvoie, au choix, sa partie gauche si elle n'est pas nulle, et la partie droite sinon.
Donc, pour le second code, il permets de faire simplement :
1: message = value ?? "default";
Le premier code est un peu plus compliqué, mais ?? va nous permettre de clarifier un peu tout ca aussi :
1: HttpContext context = HttpContext.Current;
2: LifeCycle lifecycle = (LifeCycle)context.Session["CachedLifeCycle"] ?? Factory.GetLifeCycle();
3: context.Session["CachedLifeCycle"] = lifecycle;
4:
5: return lifecycle;
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte En ce moment, je suis en pleine session d'écriture de tests, et une chose en particulier me fait tiquer, a savoir les tests qui ne sont pas couverts a 100 %.
Dans le code en questions, les tests qui font baisser la couverture sont en général des tests qui concernent les exceptions.
On y trouve deux familles de tests, on a donc:
Le test "avec attribut"
Ce test utilise l'attribut ExpectedException pour que le test fonctionne réussisse si et seulement si il jette un exception du type demande (ici, ArgumentOutOfRangeException). Le problème, en termes de couverture, est que tout le code situe en dessous de l'exception est ignore, le code n'est donc pas couvert a 100%.
Le test "traditionnel"
Si on n'utilise pas NCover, ou si on veut faire des tests sur le message retourné, on produit plus régulièrement de genre de code :
NB. : cet exemple vient directement du blog de NUnit, alors on peut admettre qu'il soit mentionné comme "bonne pratique"
Sauf que...
Sauf que si les tests fonctionnent correctement, une partie du code ne sera jamais atteinte, de même que si ils échouent.
Pourquoi ca pose problème ?
En général, je ne cherche pas a atteindre 100% de couverture...dans mon code testé ! Par contre, si une partie du code de test n'est pas joué, cela peut vouloir dire, au choix, deux choses :
Comment corriger les tests ?
Une option est de reprendre le code ci-dessus de la façon suivante :
Le catch sur une exception n'est plus présent...effectivement, mais de toute façon, si il n'est plus présent, le test va échouer quoi qu'il arrive...
Et selon vous, la couverture du code de test est-elle importante ? Cette méthode vous semble-t'elle valide ?
Vous devez être identifié pour poster un commentaire.
Ce livre est encore en pré-production, mais comme j' ai eu la chance de participer à sa revue, je me suis dit que cela ne ferait pas de mal de vous en faire profiter...
![]() |
Brownfield Application Development in .NET Softbound print: December 2009 (est.) | 550 pages Note : 5/5 |
Dès que le livre sort officiellement, je corrige toute info erronée, et ça part dans les critiques ;)
Vous devez être identifié pour poster un commentaire.
Ca y'est, enfin !!!
Apres de longs mois d'attente (pour moi), la version 3 de mon outil chouchou sort enfin ;)
Au programme de la version 3:
Forcément, cette version nécessite le Framework 3.5, ca tombe bien, mon client vient de passer à Visual Studio 2005 ;).
Le lien pour télécharger la bête est là :
http://subsonicproject.com/Download
.et je comptes bien en reparler ;)
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte La feuille de route pour la version 2 du Framework MVC vient d'être dévoilée sur CodePlex.
http://aspnet.codeplex.com/Wiki/View.aspx?title=Road Map
L'information principale, a mon avis, est que le support pour la Beta 1 de Visual Studio 2010 sera assure par un add-on des Juin, et que MVC sera intégré a la Beta 2....et que la version 3 du Framework ne supporter pas VS 2008 (quand je pense que je travaille encore sous 2005...)
Les autres modifications sont principalement des améliorations, la plus sympa étant probablement des helpers fortement typés pour générer des champs et des liens dans la vue.
(Pour plus d'infos sur la problématique, voir ici :http://www.haacked.com/archive/2009/06/02/alternative-to-expressions.aspx)
Par contre, forcement, pas encore de date de sortie prévue, mais j'ai le sentiment qu'on verra cette V2 dans Visual Studio 2010 ;)
Vous devez être identifié pour poster un commentaire.
Suite a une question sur le forum (et pour défendre SubSonic, forcement ;) ), je me suis penché, hier soir, sur l'utilisation de SQLite avec SubSonic (un problème de jointure, mais ne nous dispersons pas...)
Du coup, je me suis installé SQLite sur ma machine a la maison, téléchargé le provider SQLite pour ADO.NET, et en...trois minutes, j'ai ma base en route.
Je ne connaissais pas du tout SQLite, mais cette base de données me botte...
Une dll a ajouter au projet web, un fichier db3, et on a une petite base de données relationnelles légère, suffisamment réactive pour des petits volumes, et qui se sauvegarde en copiant le fichier db3...Que du bonheur, quoi ;)
Pour les pré-requis:Pour une comparaison entre MySQL, PostgreSQL et SQLite, voir ici:
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte J'avais complètement oublié de le mentionner dans mon article précédent sur SubSonic, mais, de toutes les nouveautés de SubSonic dans la version 2.1, une des plus utiles quand on en à besoin est l'objet InlineQuery.
En effet, comme je le montrais (et si vous n'avez pas lu l'article, allez-y maintenant ;) ), SubSonic peut se révéler très puissant pour travailler avec des opérations de type CRUD, ainsi que pour le mapping des objets de la base de données avec les objets .net, mais qu'en est-il des requêtes "tordues" ou "bizarres" avec lesquelles on est régulièrement forcé de travailler (et je ne vous parle pas des requêtes dont on hérite avec la maintenance d'une application vieille de quelques années :-/.) ?
Est-ce que je ne vais pas avoir aussi vite fait de tout me taper à la main ?
Dans les versions précédentes, on avait grosso modo deux choix :
Depuis la version 2, on à enfin un nouveau choix, plus "propre", et surtout plus rapide à mettre en ouvre, vous l'aurez deviné, l'objet InlineQuery.
En terme de code, il suffit de faire :
(Ceci est évidemment un exemple simpliste, mais c'est pour donner une idée).
Dans l'exemple du dessus, le @surname va permettre à SubSonic de créer une requête paramétrée directement. Si on avait voulu ajouter plus de paramètres, la fonction attends un tableau d'objets, on peut donc se lâcher ;).
InlineQuery propose aussi des méthodes renvoyant des DataReader, des DataSets, des scalaires (wow, un ExecuteScalar<T> ;) ), et même un ExecuteTypedList, pour renvoyer une liste de T.
Voila, facile, pas cher, que du bonheur :D
Vous devez être identifié pour poster un commentaire.
, Philippe Vialatte Aujourd'hui, jour de sortie d'article ;)
Apres pas mal de transpiration (premières lignes écrites en Décembre), voila un tutoriel sur l'utilisation de base de SubSonic (SubSonic, c'est bon, mangez-en ;) )
L'article est présent ici :
http://philippe.developpez.com/articles/Subsonic/
Le bon coté, c'est que maintenant que l'article est publie, je vais pouvoir parler un peu plus de SubSonic sur ce blog (avant, je n'avais pas de référence en français a fournir :D )
Maintenant, allez télécharger SubSonic, et commencez a travailler avec une DAL propre et facile a utiliser en moins de temps qu'il ne vous en a fallu pour lire ce post...
Vous devez être identifié pour poster un commentaire.
| Comme je l'ai mentionné il y'à quelques jours, je suis en pleine lecture, en ce moment, du livre "Brownfield Application Development in .NET", en early access. La ou la formule est géniale, c'est que: - Mardi, je trouve une erreur dans le livre - Jeudi, l'auteur me réponds en vitesse pour me remercier (déjà, sympa de voir que non seulement les posts sont lus, mais en plus pris en compte) - Mais le plus fort, c'est que je suis le blog de l'auteur depuis un moment, et que dans la foulée, il avait écrit un petit post sur le point en question' Voila, personnellement, je trouve assez super niveau mentalité, et ouverture ;) | |
Vous devez être identifié pour poster un commentaire.
Ce blog contient:
- des bouts de code
- quelques news
- des états d'âme
....et des fois, quelque chose d'intéressant ;)




| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Copyright © 2000-2012 - www.developpez.com