Quelques outils que tout bon développeur .Net devrait utiliser sur ses projets

icon Tags de l'article : , , , ,

Mai 15, 2018
J'ai entendu dire, il y a longtemps, que Bill Gates avait dit :



Et c'est vrai. Quelqu'un qui n'aime pas travailler inutilement trouvera toujours des voies pour travailler plus efficacement et supprimer les tâches chiantes inutiles.

Au fil des années, je me suis rendu compte que trop peu de développeurs se posaient une question pourtant évidente : quelle tâche quotidienne et contraignante pourrais-je simplifier dans mon process de développement/test ?

La réponse est souvent : ben merde y'en a plein en fait !!!

Qu'il s'agisse de purger la base de données, de créer un compte utilisateur, de remplir la BDD avec de fausses données... il y a souvent énormément de tâches qu'un développeur pourrait automatiser pour vite gagner un maximum de temps. Et si en plus ce développement est mutualisé entre les développeurs... ben c'est un gain énorme pour toute l'équipe.

Pour ça, je voulais partager avec vous les outils que tout bon développeur .Net devrait utiliser pour ça.

1) Une extension Visual Studio

Coder sa propre extension Visual Studio n'est pas forcément évident... mais ça peut vous permettre de gagner un maximum de temps en ajoutant directement dans VS les choses chiantes que vous devez faire régulièrement.

Quelques exemples (dont certains tirés de l'extension VS de mon poste actuel) :
  • purger la base de données
  • créer un compte utilisateur de test
  • démarrer le noeud Selenium
  • tuer tous les process Chrome Selenium qui restent
  • changer la configuration de la BDD (local / tests de perfs / preprod)
  • etc.

Avoir ces options directement dans votre Visual Studio peut vous faire gagner un temps précieux. Car même juste 2 minutes par jour, sur une année ça représente une journée entière de travail...

2) Le #if DEBUG

En local, on a parfois besoin d'avoir des fonctionnements différents du fonctionnement en production. Que ce soit à cause du cache, de la quantité de données, ou même de l'initialisation de la base de données... on a parfois envie d'avoir un fonctionnement différent, pour se simplifier la vie.

Voici quelques exemples d'actions que j'ai pu automatiser par le passé, grâce au #if DEBUG :
  • au lieu d'aller chercher le catalogue complet de données en BDD (ce qui prenait 2 minutes à chaque lancement de l'application), on le stocke sérialisé sur le disque dur et on l'utilise comme tel (bim, 10 secondes de chargement au lieu de 2 minutes)
  • création automatique d'un compte par défaut si aucun compte n'existe déjà
  • connexion automatique au compte par défaut
  • extraction, anonymisation et stockage sérialisé dans des fichiers de données venant de la production, afin de pouvoir faire des calculs statistiques sans avoir à requêter directement la BDD de prod
  • forcer la connexion à la BDD locale

3) Un dossier de ressources

Là on est dans l'évidence, mais parfois ça ne fait pas de mal de rappeler les évidences : prenez des notes.

Vous galérez à trouver une procédure spécifique ? Notez là quand vous avez enfin trouvé.
Un collègue vous montre une procédure compliquée pour faire quelque chose ? Notez là.
Vous découvrez gadget super cool que vous pourriez avoir à utiliser plus tard ? Mettez le de côté.

Quand on développe, il faut aussi savoir prendre des notes. Personnellement, j'ai toujours un dossier de ressources (personnelles) chiffré.

Qu'est ce qu'on trouve dans le mien ? Enormément de choses :
  • Les logins/mdp pour chaque compte partagé lié à notre application
  • Des scripts windows/powershell pour certaines actions (backup d'une base de données, restauration, création d'un certificat)
  • Comment faire certaines actions simples/complexes dans la solution
  • Des scripts SQL pour certaines actions BDD (purge et réindex Azure, identifier la fragmentation des index, batch de suppression des anciens logs, etc.)
  • Des rappels sur certains concepts qui ont du mal à rentrer (oui, même après plus de 15 ans de dev, ça doit être le grand âge)

Ca peut sembler idiot, car souvent en 2/3 minutes sur stackoverflow on peut retrouver la solution... mais :
1) Ca permet d'avoir du spécifique pour notre situation
2) Si nos fichiers sont bien triés et nommés, on gagne du temps même par rapport à stackoverflow
3) Ca peut vous sauver la vie si vous devez refaire une opération compliquée (prévue à l'origine comme un one-shot, vous savez, le célèbre "ne t'en fais pas, c'est juste pour cette fois" d'il y a 6 mois)

4) Les tests unitaires

Bon, je ne vais pas insister sur l'importance des tests unitaires dans un projet, mais sachez ceci : vous pouvez très bien utiliser des tests unitaires pour automatiser certaines actions de dev/debug.

Quelques exemples :
  • Tester la connectionstring du projet
  • Vérifier que toutes les procédures stockées appelées sont bien présentes dans la BDD
  • Tester une procédure stockée
  • Vérifier qu'une convention de codage est bien respectée sur le projet (quand on a des règles spécifiques)

Ou même encore : créer des données en dur en base. Après tout pourquoi pas ?

4) Un logiciel d'automatisation dans le navigateur

Lorsqu'on fait du dev web, on a souvent besoin de remplir des formulaires pour tester certaines choses. Et remplir 10 fois d'affilée les même 10 champs... ben ça fatigue très vite.

Or... il existe une solution simple : les extensions Chrome/Firefox d'automatisation. Par exemple iMacros.

Ces extensions permettent d'enregistrer un enchainement d'actions faites dans le navigateur pour les reproduire ensuite. Grâce à ça, vous pourrez créer un compte, vous logger, remplir en formulaire, etc... en un seul clic.

5) Les tests Selenium

Même si les tests Selenium sont, à la base, conçus pour tester votre application, vous pouvez les utiliser pour de nombreuses choses pas forcément évidentes à première vue :
  • Tester une API
  • Tester l'interconnexion entre 2 applications
  • Aller vérifier l'état d'un autre service en ligne
  • Créer une surcouche de monitoring (quand vous n'avez qu'un board figé de monitoring et pas d'API)
  • ...

6) Les macros de Notepad++

Si vous ne les avez jamais utilisé, sachez que Notepad++ permet d'enregistrer toutes les actions produites sur une ligne, pour ensuite les reproduire sur toutes les lignes d'un fichier.

Vous avez un fichier où le format ne va pas du tout, vous devez passer un bloc à gauche, supprimer quelques caractères et rajouter un morceau à la fin ? Record => modifications => Fin => Jouer en boucle jusqu'à la fin => terminé.

Voilà, je pense que ça fait déjà pas mal,

Je vous ai épargné les grands classiques, comme les environnements d'intégration continue, car si vous n'en avez pas déjà, il y a de fortes chances que ce soit indépendant de votre volonté (je voulais concentrer cet article sur ce que les développeurs peuvent faire eux-même, sur leur poste).

J'espère que cet article vous a plu, bonne journée et bon dev à tous et toutes !

Comment stocker ses mots de passe en .Net

icon Tags de l'article : , ,

Novembre 24, 2014
Il existe de nombreuses façons de stocker les mots de passe pour une application ou un site web. La triste nouvelle, c'est que la majorité des sites et des applications n'utilisent pas les bonnes.

Aujourd'hui nous allons voir comment bien faire les choses.

Déjà, voici les différentes façons de faire, de la plus ridicule à la plus paranoïaque :

  • Niveau 0 : tout en clair. Rien de bien compliqué, aucune sécurité, la moindre fuite de données et on doit demander à nos utilisateurs de changer de mots de passe... Vraiment pas top pour l'image. Sécurité : 0%

  • Niveau 1 : mots de passe hashés avec une clef en dur. Pourquoi pas, sauf que... ça ne sert à rien. Le hacker n'aura qu'à générer des rainbow tables à partir de votre clef, et il aura les correspondances en clair pour tous les mots de passe hashés en base. Sécurité : 1%

  • Niveau 2 : on hashe les mots de passe avec un sel, généré aléatoirement pour chaque utilisateur. Un petit peu mieux. Seul bémol : il suffit de régénérer des Rainbow Tables, une par utilisateur, et ... on a tous les mots de passe. Sécurité : 5%

  • Niveau 3 : on hashe les mots de passe avec un sel, généré aléatoirement pour chaque utilisateur, à l'aide d'un algorithme lent : BlowFish. Ici on corrige le principal problème du niveau 2 : générer des Rainbow Tables pour chaque utilisateur peut prendre des jours, voire des mois... Sécurité : 80%

  • Niveau 4 : on utilise un module physique pour hasher les mots de passe. Si quelqu'un essaye de le déplacer ou d'y accéder, il effacera automatiquement toutes les données. Vous l'avez compris, il s'agit du mode paranoïaque ! Sécurité : 99%

Vous l'aurez compris, on va surtout s'intéresser au niveau 3, facilement réalisable et ne demandant pas, lui, d'investissements financiers. La clef repose sur le fait d'avoir un sel généré unique par utilisateur, et d'utiliser l'algorithme lent BlowFish. A l'échelle d'un site web, le temps de hash de l'algorithme est court. Mais lorsqu'on fait du bruteforce, le temps pour générer un dictionnaire entier de mots de passe est gigantesque !

La mise en place est plutôt simple :

Il faut d'abord créer deux entrées dans notre base, une pour le mot de passe hashé, et une pour le sel. Il ne faut jamais stocker ni déplacer le mot de passe non hashé. Si vous voulez bien faire les choses, utilisez HTTPS et stockez le sel ailleurs.



Ensuite, il faut ajouter BCrypt.Net à notre projet (via NuGet) :



Cette implémentation de l'algorithme BlowFish offre 2 méthodes : GenerateSalt et HashPassword, à utiliser comme suit :



Maintenant vous n'avez plus qu'à implémenter la bonne logique dans votre code :
  • Lorsque l'utilisateur s'inscrit, on génère et stocke un salt aléatoire pour lui, puis on se sert de ce salt pour hasher son mot de passe.
  • Lorsqu'il se connecte, on récupère le salt, et on hashe le mot de passe saisi à l'aide du salt pour ensuite comparer les deux hashs générés.
  • Lorsqu'il a perdu son mot de passe, on génère un mot de passe et un salt aléatoires, pour ensuite lui envoyer un mail avec son nouveau mot de passe.

Voilà, j'espère que ce petit article vous a plu,

Bonne soirée à tous !

Migrer de BlogEngine vers BlogoText

icon Tags de l'article : ,

Septembre 10, 2013
Image d'une migration

Bonjour à tous !

Comme vous le savez peut-être, j'ai migré, hier, mon blog depuis BlogEngine (moteur de blog en ASP.Net) vers BlogoText (moteur de blog simpliste mais efficace en PHP). Or, comme la procédure est loin d'être simple, et que j'ai fait tous les outils pour, je me suis dit que ça pourrait être utile à quelqu'un... quelque part... un jour... peut-être.

Bref, vous en avez assez de payer un hébergement Windows pour votre blog sous BlogEngine alors qu'un simple BlogoText PHP vous suffirait ? Ce petit tutoriel est pour vous.

Voici ce que vous devez faire, dans l'ordre :

  • Tout d'abord, installez BlogoText sur votre hébergement PHP (il vous suffit de copier le dossier que vous trouverez ici, et de vous y connecter. La configuration est très simple).
  • Ensuite, générez votre fichier BlogML.xml de sauvegarde de vos données BlogEngine. Pour cela, connectez-vous à votre blog BlogEngine, allez dans Paramètres / Importer et Exporter, et cliquez sur Exporter.
  • Allez maintenant copier le contenu de votre dossier App_Data\files de votre blog BlogEngine vers le dossier img de votre installation BlogoText.
  • Il va ensuite falloir transformer le contenu de votre archive BlogML.xml en une archive lisible par BlogoText. Pour cela téléchargez cet exécutable : BlogEngineToBlogotext.exe. Dézippez-le et ouvrez le fichier .exe.config. Dans ce fichier vous trouverez un réglage à faire (dans la partie AppSettings) : renseigner l'url de votre site de destination. Copiez ensuite dans le dossier où se trouve l'exe votre fichier BlogML.xml, et lancez l'exe. Normalement, il devrait générer un fichier generated_bt_archive.xml que vous n'aurez plus qu'à importer sur votre BlogoText via le menu maintenance !
  • Enfin, si vous ne voulez pas perdre en référencement, il va falloir activer une redirection entre vos anciennes urls et vos nouvelles urls. Pour cela, copiez le contenu du fichier .htaccess qui a été généré et ajoutez-le au fichier .htaccess que vous avez à la racine de votre nouveau blog (Si vous n'avez pas de .htaccess, copiez juste le fichier). Attention, le module apache2 de redirection doit-être activé sur votre hébergement.

Et voilà, vous avez terminé votre migration avec succès !

Pour ceux que ça intéresse (ou qui sont un peu paranos ;-), voici le code source de l'exe qui permet la transformation du BlogML.xml en un fichier compréhensible par BlogoText.

Bon dev et bonne journée à tous !

Photo Credit: moonjazz

Avec Windows 8, laissez tomber vos applications Windows 7 !

icon Tags de l'article : , ,

Juin 16, 2011

Comme vous le savez, Microsoft a dévoilé Windows 8 il y a quelques semaines. Si les nouveautés apportées par l'OS ont été très bien accueillies, la communauté de développeurs .Net a commencé à hurler devant les choix faits par Microsoft.

Pourquoi ? Quels choix ?

Microsoft, très connu pour ses difficultés à choisir (et surtout à affirmer ses choix) des langages et des technologies pour ses plateformes, a décidé de laisser tomber tout ce sur quoi ils travaillent depuis 10 ans. Les API .Net ? Terminé. WPF ? Terminé. Winforms ?

Terminé. Silverlight ? Terminé.

Microsoft se tourne désormais vers HTML 5 et Javascript pour son Windows 8 ! Et oui, HTML 5. HTML 5 dont la version définitive des spécifications n'arrivera qu'en 2014 voire 2015. Et Javascript. Le langage objet le plus imbuvable de tous, trop dynamique, trop vieux, très lourd à utiliser.

Pour rappel, JavaScript a été créé en 1995. HTML 5 sera définitivement créé d'ici 3 à 4 ans.

Qu'est ce que ça va changer ? Tout. Fini les API qui existent actuellement. Finis les programmes qui tournent sous Windows 7. Fini l'utilisation de Visual Studio telle que vous la connaissez. Fini les bindings en 3 clics. Fini le C#.

Avec HTML 5, vous allez devoir vous mettre au JavaScript. Tous les développeurs .Net vont voir leurs compétences détruites d'un coup suite à un choix de Microsoft. Un mauvais choix. Tout est à réapprendre. Tout est à refaire.

Pourquoi ? Pourquoi Microsoft ? Pourquoi nous impose-t-il ça ?

Une première réponse a été donnée : avec Windows 8, Microsoft a décidé de créer un système d'exploitation compatible avec les PC mais également avec les tablettes. Génial !

Sauf qu'un pc, ce n'est pas une tablette ! Pour moi un PC c'est un produit rapide, puissant, qu'on dirige avec un clavier et une souris et qui permet d'être productif !

La tablette est tout l'inverse ! Elle est destinée à être utilisée ponctuellement, pour tout ce qui est divertissement, multimédia, ... Mais pas pour le travail, la bureautique, les échanges de mails... Aller sur Facebook sur sa tablette, c'est facile et rapide. Travailler et écrire des mails sur une tablette, c'est autre chose !

Les PC sous Windows 8 ne seront plus des PC mais des... navigateurs.

Il reste à espérer deux choses :

  • Que Microsoft craque sous la pression et fasse machine arrière (sous la pression de la communauté de développeurs... Mobilisez-vous !) pour persévérer dans ses technologies qui sont excellentes aujourd'hui et qui continueraient à l'être si elles ne sont pas abandonnées... (Tous ceux qui ont travaillé avec WPF / C# savent que c'est mille fois mieux et mille fois plus puissant que HTML / Javascript !)
  • Que Microsoft gère mieux le HTML5 dans Windows 8 que dans son dernier Internet Explorer 9.

Je vais peut être me mettre à Java et GWT moi...

source 1, source 2

image retouchée de backofthenapkin, sous licence CC

Comment ajouter des méthodes à un enum pour avoir un "ToString" personnalisé.

icon Tags de l'article : ,

Juin 08, 2011

Bonjour à tous,

Voilà aujourd'hui je me suis dit que j'allais partager avec vous du code que j'utilise régulièrement et qui pourrait vous être utile...

En effet, je suppose qu'il vous est déjà arrivé d'avoir à utiliser des Enum en C#. Or, s'il suffit de caster votre objet en int pour avoir sa valeur, il est bien plus difficile d'obtenir une valeur textuelle définie :

public enum EnumWeapons
{
    Blade = 1,
    Gun = 2,
    Axe = 3,
    Bow = 4
}

// ensuite on doit ajouter dans le code de notre application :

string weaponName = string.Empty;

switch(myEnumWeapons)
{
    case EnumWeapons.Blade: weaponName = "Epée"; break;
    //...
}

Il serait tellement plus simple d'avoir une méthode ToString qui renverrai automatiquement une chaîne de caractères définie à la création de notre Enum...

Mais attendez, c'est possible ! J'avais expliqué il y a quelques semaines comment ajouter des méthodes à une classe en créant une extension. Il nous suffit d'appliquer ça ici :

public enum EnumWeapons
{
    Blade = 1,
    Gun = 2,
    Axe = 3,
    Bow = 4
}

public static class EnumWeaponsHelper
{
    public static string ToExplicitString(this EnumWeapons enumWeapons)
    {
        switch (enumWeapons)
        {
            case EnumWeapons.Axe: return "Hache";
            case EnumWeapons.Blade: return "Epée";
            case EnumWeapons.Bow: return "Arc";
            case EnumWeapons.Gun: return "Revolver";
            default: return string.Empty;
        }
    }
}

Grâce à ce code, lorsque vous aurez un objet EnumWeapons, vous aurez une belle méthode ToExplicitString() qui vous donnera une version textuelle définie par vos soins de votre objet !

En espérant que ça vous sera utile Wink

Bonne journée à tous !

Se simplifier la vie en C# : les conversions / cast !

icon Tags de l'article : ,

Juin 06, 2011

Lorsque vous développez en C#, il vous arrive souvent d'avoir à caster (ou convertir, mais bon, caster c'est plus fun et ça fait un peu Meuporg !) vos objets :

Homme homme = (Homme)personne;

Or, si votre objet personne n'est pas un objet Homme mais un objet Femme, que se passera-t-il ? (Vous avez 5 minutes, ensuite je ramasse les copies !) Votre code lèvera une exception ! (Bon, tous ceux qui se sont trompés vont au coin !)

Heureusement, C#PO, spécialiste de la conversion en C#, est là pour nous aider !

Comment faire autrement ? Voici trois solutions possibles, de la plus mauvaise à la meilleure (selon C#PO, droïde de protocole C# / C#) :

  • try
    {
        homme = (Homme)personne; 
    }
    catch
    {
        femme = (Femme)personne;
    }
    Ici, rien de bien compliqué, on utilise un try catch pour attraper l'exception qui sera levée si jamais l'objet personne se révèlerait être un objet Femme au lieu d'un objet Homme. Je vous recommande d'éviter ce code car attraper des exceptions doit rester quelque chose d'exceptionnel...
  • if(personne is Homme) 
    {
        homme = (Homme)personne;
    }
    else
    {
        femme = (Femme)personne;
    }
    Ici, on utilise le mot clef is pour vérifier si notre objet est de type Homme ou Femme. Ce code est le plus "propre" des trois codes présents ici, mais il faut à chaque fois s'amuser à tester le type de votre objet. A voir selon votre façon de coder si vous préférez cette façon de faire ou la suivante.
  • homme = personne as Homme;
    femme = personne as Femme;
    Enfin, ici, vous avez le code le plus simple et le plus rapide à saisir, ce dernier utilisant le mot clef as. Ce mot clef permet de faire un cast qui renverra null si l'objet n'est pas du type indiqué. C'est moins "propre" que d'utiliser le mot clef is pour tester en amont, mais ça a le mérite d'être très rapide à saisir et d'éviter d'avoir à utiliser un try catch à chaque cast.

Voilà, j'espère que cet article vous aura été utile, en tout cas n'hésitez pas à donner dans les commentaires votre façon de faire, surtout si elle diffère des méthodes que je viens de vous donner. (Et on dit merci à C#PO ! Wink)

Bon dev à tous !

image de Andres Rueda

Comment bien écrire un saut de ligne en C# !

icon Tags de l'article : ,

Juin 06, 2011

L'astuce C# de la semaine : comment ajouter un saut de ligne (ou retour chariot) dans votre programme C# sans faire le classique...

TbMessage.Text  = "\n";

Oui car c'est... MAL ! En effet, dans un environnement Windows, le retour chariot ne vaut pas '\n' mais '\r\n' !

De plus, sachez qu'il y a bien plus simple que d'écrire à la main \r\n : vous pouvez utiliser Environment.NewLine :

TbMessage.Text  = Environment.NewLine;

Ainsi, Environment.NewLine génèrera un retour chariot '\r\n' si vous êtes sous Windows (et '\n' si vous êtes sous Unix).

Allez, bonne journée et bon développement à tous !

Essayer gratuitement Windows Azure pendant 30 jours !

icon Tags de l'article : , ,

Mai 27, 2011

Voici un petit article dédié à tous ceux qui ont toujours voulu tester le développement et le déploiement d'applications dans Azure.

Vous, oui vous, grand fan du cloud et de Microsoft, sachez que vous pouvez vous créer un compte d'essai gratuit pour 30 jours à cette adresse : http://www.windowsazurepass.com.

Vous devez juste utiliser le code promotionnel "MSTD11" pour en profiter !

Il vous faut posséder, bien évidemment, un compte Windows Live pour pouvoir vous inscrire. Par contre, ne vous étonnez pas de ne pas recevoir le mail de validation (quelques heures après l'inscription) car Microsoft semble se considérer lui-même comme spammeur :

 

Ils ont un drôle d'humour chez Microsoft non ? Wink

Changement d'adresse et redirection en ASP.Net

icon Tags de l'article : , ,

Mai 26, 2011

Hello tout le monde,

Comme vous pouvez le voir, l'adresse de mon blog est désormais blog.howtommy.net. En effet, travaillant depuis quelques temps déjà sur mon site web, je voulais déplacer le blog dès maintenant pour ne pas perdre en référencement (à l'aide de redirections permanentes 301).

Et bien figurez vous que... C'est loin d'être simple !

Après quelques heures de recherche et de bidouille, j'ai réussi à rediriger complètement le trafic de mon site web, ainsi :

La classe hein ?

Là vous vous dites que c'est loin d'être compliqué, mais croyez moi, ça l'est. En effet, j'utilise les noms d'hôte dans mon IIS pour rediriger les utilisateurs vers le site désiré (mon serveur hébergeant 3 sites).

La configuration à travers IIS 7 est assez simple, mais récupérer une erreur 404 levée (par exemple via un ancien lien comme http://howtommy.net/post/2011/05/11/Call-Of-Duty-4-vieux-mais-vraiment-bon-!.aspx) pour rediriger l'utilisateur vers la bonne page est bien plus compliqué !

Je pense poster sous peu un tutoriel expliquant la procédure à utiliser pour parvenir à ce résultat.

Sur ce, bonne journée à tous !

image de swimparallel

Développer une extension en C# pour ajouter des méthodes à une classe

icon Tags de l'article : ,

Mai 17, 2011

Article technique / développement

Comme toujours, tout est dans le titre...

Il vous est surement déjà arrivé d'avoir à travailler avec une classe qui vient d'ailleurs (cf. X-Files), non ? Or vous aimeriez bien ajouter vos propres méthodes à cette classe, ce qui serait plus pratique pour votre code métier, la lisibilité du code, toussa toussa...

Mais comment faire ?

Tout simplement en développant une extension (ou classe "helper") dans laquelle vous ajouterez des méthodes qui iront se greffer à votre classe ! Rien de plus simple !

Supposons que vous ayez une classe "personne" :

public class Personne {
     public string Nom { get; set; }
     public string Prenom { get; set; }
}

Maintenant, pour ajouter des méthodes à cette classe, il vous suffit de créer une classe statique et de créer des méthodes qui utilisent le mot clé this (pour le paramètre de la méthode) :

public static class PersonneHelper
{
     public static string GetIdentite(this Personne personne)
     {
          return personne.Prenom   " "   personne.Nom;
     }
}

Et voilà :

Vous remarquerez que le logo à gauche de GetIdentite() est différent des logos des méthodes de la classe. Cela permet de voir les méthodes qui proviennent d'extensions plus facilement.

Je vous recommande seulement de faire attention lorsque vous ajoutez des méthodes à vos classes. N'en abusez pas ! En effet, à avoir trop de méthodes situées à plein d'endroits différents pour une seule et même classe, on fini par :

  • Avoir du code dur à relire (il faut aller à chaque fois dans les classes des helpers pour voir les traitements),
  • Avoir du code qui se répète (avec des classes complexes on finira par réécrire plusieurs fois le même code),
  • Oublier le contenu réel de la classe et l'utilité de certaines méthodes.

De plus, en fonction de votre besoin, utiliser des classes partielles peut se révéler bien meilleur. Donc n'en abusez pas !

Bon développement à tous ! (Et bonne journée aux non-développeurs qui ont eu le courage de tout lire jusqu'ici !)