Quelle pratique de programmation que vous aimiez autrefois avez-vous depuis changé d'avis? [fermé]

99

Pendant que nous programmons, nous développons tous des pratiques et des modèles que nous utilisons et sur lesquels nous nous appuyons. Cependant, au fil du temps, au fur et à mesure que notre compréhension, notre maturité et même notre utilisation de la technologie changent, nous nous rendons compte que certaines pratiques que nous pensions autrefois excellentes ne le sont pas (ou ne s'appliquent plus).

Un exemple d'une pratique que j'ai utilisée assez souvent, mais que j'ai changé ces dernières années, est l'utilisation du modèle d'objet Singleton .

Grâce à ma propre expérience et à de longs débats avec des collègues, je me suis rendu compte que les singletons ne sont pas toujours souhaitables - ils peuvent rendre les tests plus difficiles (en inhibant des techniques comme la moquerie) et peuvent créer un couplage indésirable entre les parties d'un système. Au lieu de cela, j'utilise maintenant des fabriques d'objets (généralement avec un conteneur IoC) qui cachent la nature et l'existence des singletons aux parties du système qui ne se soucient pas - ou ont besoin de savoir. Au lieu de cela, ils s'appuient sur une fabrique (ou un localisateur de services) pour accéder à ces objets.

Mes questions à la communauté, dans un esprit de développement personnel, sont:

  • Quels modèles ou pratiques de programmation avez-vous reconsidérés récemment et essayez maintenant d'éviter?
  • Par quoi avez-vous décidé de les remplacer?
LBushkin
la source

Réponses:

159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.


Luke Baulch
la source
+1. J'étais sur le point de poster cette même réponse. J'ai trouvé certaines de mes anciennes affectations de programmation sur un disque d'archive il y a quelques semaines. Tout était pareil. Le rapport entre les lignes de commentaires et les lignes de code était presque de 1: 1.
Michael Moussa
32
On dirait que vous avez mal commenté , pas trop. Le code ne parle pas de lui-même. Non, vraiment pas. Lisez le dernier NT Insider pour une bonne diatribe à ce sujet. Si vous pensez que les commentaires seront redondants, vous vous trompez ou vous le faites mal. Il semble que les universités n'enseignent pas les commentaires corrects (ou le suivi des bogues, ou le contrôle de version ... * soupir *). Il y a trop peu de commentaires là-bas. (et moins de bons)
Thomas
5
Code Complete a de bons conseils pour commenter et les données pour le sauvegarder.
Thomas
20
Les commentaires doivent être utilisés pour décrire pourquoi le code fait ce qu'il fait (si ce n'est pas évident), pas ce que fait le code. Une exception possible est un bidouillage fou de twiddling / langage, comme le numéro magique 0x5f3759df de Carmack.
Chris Simmons
6
@Thomas: Personnellement, je pense que le problème est que l'enseignement de bons commentaires n'est pas quelque chose qu'une université peut montrer aux étudiants. Presque tous les programmes dans les écoles sont des choses ponctuelles; les étudiants n'ont pas l'occasion de regarder le code qu'ils ont écrit il y a un an et de ne pas le comprendre du tout. En outre, les classes de niveau inférieur enseignent des concepts de codage très simples - commenter à ce niveau est presque nécessairement fastidieux, à cause de ce qui se passe. En d'autres termes, c'est comme essayer d'apprendre à quelqu'un à nager dans une pataugeoire; ce n'est tout simplement pas le bon contexte pour qu'ils comprennent les motions.
Dan Lew
117

Points de retour uniques.

Une fois, j'ai préféré un point de retour unique pour chaque méthode, car avec cela, je pouvais m'assurer que tout nettoyage nécessaire à la routine n'était pas négligé.

Depuis lors, je suis passé à des routines beaucoup plus petites - donc la probabilité d'oublier le nettoyage est réduite et en fait le besoin de nettoyage est réduit - et je constate que les retours anticipés réduisent la complexité apparente (le niveau d'imbrication) du code. Les artefacts du point de retour unique - garder les variables de «résultat» autour, garder les variables d'indicateur, les clauses conditionnelles pour les situations non déjà faites - font que le code semble beaucoup plus complexe qu'il ne l'est en réalité, le rendent plus difficile à lire et à maintenir. Les sorties anticipées et les méthodes plus petites sont la voie à suivre.

Carl Manaster
la source
3
Je suis d'accord, lorsqu'il est combiné avec des types de données qui se nettoient automatiquement, tels que autoptr, scoped_ptr, CComPtr, etc.
i_am_jorf
3
Le nettoyage du code est ce à quoi essayez {} finally {}
banjollity
@banjollity: sauf pour les langues qui ne prennent finalement pas en charge {}. Et notez que même dans les langues qui le prennent en charge, enfin {} n'est pas TOUJOURS garanti de s'exécuter.
Chris K
1
@banjollity, Chris: En C ++, le nettoyage est ce à quoi sert le destructeur, et sauf dans des circonstances extrêmes (exit (), un destructeur lançant une exception lors du déroulement de la pile, des écureuils coupant votre puissance) il est garanti de fonctionner.
David Thornley
4
D'accord. Remplacez le conditionnel imbriqué par des clauses de garde ftw!
Jonik
111
  • Essayer de coder parfaitement les choses du premier coup.
  • Essayer de créer un modèle OO parfait avant le codage.
  • Concevoir tout pour la flexibilité et les améliorations futures.

En un mot suringénierie .

wuub
la source
6
Attendez, j'ai toujours raison du premier coup. :)
i_am_jorf
18
L'argent réel est de se tromper subtilement la première fois et de le laisser sortir dans la nature. Ensuite, lorsque les gens sont habitués à la version guipée, plongez-vous dans un spectacle arrogant et corrigez le bogue / l'inefficacité pour récolter plus de gloire! ;)
Eric
7
@jeffamaphone - Non, seul Jon Skeet a bien compris la première fois.
Jordan Parmer
J'aime le mot "overengineering"
Neilvert Noval
@jeffamaphone - Je comprends toujours aussi bien du premier coup. Mais d'autres tentatives donnent ce dont j'ai besoin :)
parapluie
78

Notation hongroise (formes et systèmes). J'avais l'habitude de tout préfixer. strSomeString ou txtFoo. Maintenant, j'utilise someString et textBoxFoo. C'est beaucoup plus lisible et plus facile pour quelqu'un de nouveau de venir le chercher. En prime, il est trivial de le garder cohérent - camelCase le contrôle et ajoute un nom utile / descriptif. Les formulaires hongrois ont l'inconvénient de ne pas toujours être cohérents et les systèmes hongrois ne vous rapportent pas vraiment beaucoup. Le regroupement de toutes vos variables n'est pas vraiment utile - en particulier avec les IDE modernes.

Kenny Mann
la source
Qu'en est-il des langages à typage dynamique, tels que Python ou JavaScript? Je trouve toujours utile d'utiliser la notation hongroise dans ces langues afin que, lorsque je regarde des variables, je sache à quel type de variable m'attendre (s'il y a un type à attendre - bien sûr, il serait téméraire de traiter une langue à typage dynamique exactement comme une langue typée statiquement.)
Dan Lew
4
Je fais la même chose sauf: fooTextBox et les chaînes sont, espérons-le, apparentes: numberOfEntries => int, isGreat => bool, etc.
rball
+1 pour se débarrasser de la notation hongroise. Je suis d'accord avec rball; fooTextBox, fooService, fooString quand c'est vraiment nécessaire.
blu le
3
@ wuub: Je dirais qu'avec un nom approprié, vous ne devriez pas avoir besoin de préfixer quoi que ce soit.
Kenny Mann
4
Au fait, ce que vous avez mentionné n'est pas vraiment hongrois.
Antony Carthy
67

L'architecture "parfaite"

J'ai inventé L' architecture il y a quelques années. Je me suis techniquement poussé aussi loin que possible pour qu'il y ait des couches 100% faiblement couplées, une utilisation intensive des délégués et des objets légers. C'était le paradis technique.

Et c'était de la merde. La pureté technique de l'architecture a juste ralenti mon équipe de développement visant la perfection plutôt que les résultats et j'ai presque atteint un échec complet.

Nous avons maintenant une architecture beaucoup plus simple et moins techniquement parfaite et notre taux de livraison est monté en flèche.

Bruce McLeod
la source
57

L'utilisation de la caféine. Une fois, cela m'a tenu éveillé et dans une ambiance de programmation glorieuse, où le code a volé de mes doigts avec une fluidité fébrile. Maintenant, ça ne fait rien, et si je ne l'ai pas, j'ai mal à la tête.

Alex
la source
55
Vous devez boire encore plus de café. Si cela ne fonctionne pas, commencez à fumer.
MusiGenesis
7
Brad: Vous n'en avez pas besoin lorsque vous avez Python: xkcd.com/353
Peter
Belle référence d'histoire de Noël! :-)
Steve Echols
2
J'ai rompu l'habitude et l'ai repris plusieurs fois (c'est maintenant mon troisième cycle). Rien de tel que de coder les matins froids avec une tasse de café chaude!
Matthew Iselin
15
"On dirait que j'ai choisi la mauvaise semaine pour arrêter les amphétamines."
ShreevatsaR
50

Commenter le code. J'avais l'habitude de penser que le code était précieux et que vous ne pouvez pas simplement supprimer ces magnifiques joyaux que vous avez créés. Je supprime maintenant tout code commenté que je rencontre à moins qu'il n'y ait un TODO ou une NOTE attaché car il est trop périlleux de le laisser dedans. À savoir, j'ai rencontré de vieilles classes avec d'énormes parties commentées et cela m'a vraiment confus pourquoi ils étaient-ils: ont-ils été commentés récemment? est-ce un changement d'environnement de développement? pourquoi fait-il ce blocage sans rapport?

Envisagez sérieusement de ne pas commenter le code et de le supprimer à la place. Si vous en avez besoin, il est toujours sous contrôle de code source. YAGNI cependant.

brun
la source
6
Je commente l'ancien code lors de la refactorisation, mais seulement jusqu'à ce que je vérifie que le code de remplacement fonctionne. Une fois la nouvelle version pleinement fonctionnelle, je supprime les anciennes lignes commentées.
muusbolla
En effet - je commente aussi le code, mais seulement pendant quelques jours. Si je reviens et que j'ai réalisé qu'il y a un peu que j'ai manqué, il sera supprimé avant que le nouveau code ne soit travaillé.
Colin Mackay
4
Je dis vérifier une fois le code commenté, PUIS le supprimer. Il arrive souvent que vous testiez différents bits de code et que vous ne vouliez pas enregistrer de code cassé ...
DisgruntledGoat
Sans oublier que le contrôle de version est votre ami.
David Thornley
+1 J'ai travaillé avec un programmeur qui a insisté pour commenter tout le code qu'il avait refactoré ou réécrit. Cela me rendait fou parce que parfois je devais faire défiler plus de 1 000 lignes de merde pour trouver ce sur quoi je travaillais.
Evan Plaice
46

La surutilisation / abus des directives #region. C'est juste une petite chose, mais en C #, j'utilisais auparavant les directives #region partout, pour organiser mes classes. Par exemple, je regrouperais toutes les propriétés de classe dans une région.

Maintenant, je regarde l'ancien code et je suis surtout ennuyé par eux. Je ne pense pas que cela clarifie vraiment les choses la plupart du temps, et parfois ils vous ralentissent tout simplement. J'ai donc changé d'avis et je pense que les classes bien agencées sont pour la plupart plus propres sans directives régionales.

Scott Ferguson
la source
31
Je déteste la région. Les membres de mon équipe les utilisent de manière frivole. Je les appelle des "bad codes hiders".
rball
9
C'est définitivement une odeur de code.
Frank Schwieterman
3
Je déteste les régions. Je maintiens actuellement du code où la fonction est de près de 500 lignes et pour le gérer, le développeur intelligent a mis des morceaux de code dans 10 à 15 régions.
SolutionYogi
6
@Solution Yogi: Je ne pense pas que les régions soient le vrai problème dans votre cas :-)
Ed S.
9
Je pense que les régions peuvent être bien si elles sont utilisées avec parcimonie.
Gregory Higley
39

Développement en cascade en général, et en particulier, la pratique d'écrire des spécifications fonctionnelles et de conception complètes et complètes qui devraient d'une manière ou d'une autre être canoniques, puis s'attendre à une mise en œuvre de celles-ci correcte et acceptable. Je l'ai vu remplacé par Scrum, et bon débarras, dis-je. Le fait est que la nature changeante des besoins et des désirs des clients rend toute spécification fixe effectivement inutile; la seule façon d'aborder vraiment correctement le problème est une approche itérative. Non pas que Scrum soit une solution miracle, bien sûr; Je l'ai vu mal utilisé et abusé de nombreuses fois. Mais ça bat la cascade.

Paul Sonier
la source
3
Dites ça à mon client ... Je suis en train d'écrire des "Je suis programmeur avec une boule de cristal, donc je sais exactement à quoi ressemblera ma conception de bas niveau dans 6 mois"
Igor Brejc
36

Jamais s'écraser.

Cela semble être une si bonne idée, n'est-ce pas? Les utilisateurs n'aiment pas les programmes qui plantent, alors écrivons des programmes qui ne plantent pas, et les utilisateurs devraient aimer le programme, non? C'est comme ça que j'ai commencé.

De nos jours, je suis plus enclin à penser que si ça ne marche pas, ça ne devrait pas prétendre que ça marche. Échouez dès que vous le pouvez, avec un bon message d'erreur. Si vous ne le faites pas, votre programme va planter encore plus fort quelques instructions plus tard, mais avec une erreur de pointeur nul non descriptive qui vous prendra une heure pour déboguer.

Mon modèle préféré "ne pas planter" est le suivant:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

Maintenant, au lieu de demander à vos utilisateurs de copier / coller le message d'erreur et de vous l'envoyer, vous devrez plonger dans les journaux en essayant de trouver l'entrée de journal. (Et comme ils ont entré un ID utilisateur non valide, il n'y aura aucune entrée de journal.)

rafale
la source
Quelle est la probabilité que l'utilisateur vous donne le message d'erreur réel, par rapport à vos journaux produisant le problème? (Très faible dans ce cas particulier, mais les utilisateurs ne citent presque jamais les messages d'erreur!) Les lisent-ils même?
Arafangion
1
J'admets que la chance est faible qu'un utilisateur aléatoire vous envoie le message d'erreur, mais la chance est non nulle (exemple trivial: parfois vous utilisez votre propre application), et certains utilisateurs apprennent réellement avec le temps ce qu'il faut copier / coller. Je ne dis pas que vous ne devriez pas vous connecter (vous devriez), mais lorsque l'application est cassée, elle est cassée. Afficher un message d'erreur est bien meilleur, beaucoup plus honnête pour l'utilisateur que de prétendre que le prénom de l'utilisateur est "erreur de communication avec la base de données" (ou pire encore, nullou la chaîne vide).
gustafc
Il y a une NullReferenceException en ligne deux
oɔɯǝɹ
Merci, oɔɯǝɹ, je l'ai réparé. (Même si c'était un peu plus lulzier avec ça là-bas: tout ce problème pour éviter les exceptions et autres "plantages", et il s'est toujours écrasé sans condition.)
gustafc
33

J'ai pensé qu'il était logique d'appliquer des modèles de conception chaque fois que je les reconnaissais.

Je ne savais pas que je copiais en fait des styles à partir de langages de programmation étrangers, alors que le langage avec lequel je travaillais permettait des solutions beaucoup plus élégantes ou plus faciles.

L'utilisation de plusieurs langues (très) différentes m'a ouvert les yeux et m'a fait réaliser que je n'ai pas à mal appliquer les solutions des autres à des problèmes qui ne sont pas les miens. Maintenant, je frémis quand je vois le modèle d'usine appliqué dans un langage comme Ruby.

molf
la source
2
Veuillez excuser mon ignorance du rubis, mais pourquoi ne devrions-nous pas utiliser le modèle d'usine avec?
Mike Chamberlain
Pas un rubyiste ici, mais l'usine est à éviter en fonction d'une implémentation, mais ruby ​​est dynamique, et vous pouvez vous moquer ou stub Anything. Vous ne dépendez donc pas vraiment d'une implémentation.
Stéphane
27

Tests obsessionnels. J'étais un partisan enragé du développement test-first. Pour certains projets, cela a beaucoup de sens, mais j'en suis venu à réaliser qu'il est non seulement irréalisable, mais plutôt préjudiciable à de nombreux projets d'adhérer servilement à une doctrine d'écriture de tests unitaires pour chaque élément de fonctionnalité.

Vraiment, adhérer servilement à quoi que ce soit peut être préjudiciable.

yalestar
la source
22
Cela fonctionne plutôt bien pour les bernacles.
MusiGenesis
La couverture du test doit être proportionnelle à la prestation. Tout ce que vous faites doit vraiment montrer un avantage. Une couverture à 100% ne vous apportera pas grand chose. différence de 80 ou 90 sous une forme qui n'est pas dans un scénario de survie / lancement de missile.
Spence
+1 dépendance sur les tests unitaires par opposition aux tests.
Preet Sangha le
25

C'est une petite chose, mais: Se soucier de l'endroit où vont les accolades (sur la même ligne ou la ligne suivante?), Longueurs de ligne maximales suggérées pour le code, conventions de dénomination pour les variables et autres éléments de style. J'ai constaté que tout le monde semble se soucier plus de cela que moi, alors je suis simplement celui avec qui je travaille de nos jours.

Edit: L'exception à cela étant, bien sûr, quand je suis celui qui se soucie le plus (ou est celui qui est en mesure de définir le style d'un groupe). Dans ce cas, je fais ce que je veux!

(Notez que ce n'est pas la même chose que de ne pas avoir de style cohérent. Je pense qu'un style cohérent dans une base de code est très important pour la lisibilité.)

Daniel Lew
la source
5
Quelqu'un a donné un vote défavorable à cela, mais je pense que c'est une perspective pratique. Quel est le meilleur style de code? Pas important. Rechercher de haut en bas dans le même fichier et dupliquer.
Frank Schwieterman
12
Le meilleur style de code est quelle que soit la norme pour ce magasin.
David Thornley le
C'est pourquoi j'aime les options de formatage automatique dans Visual Studio. Peu importe comment les autres développeurs ont écrit le code, je fais juste un formatage rapide et c'est exactement comme je l'aime ... la plupart du temps.
corymathews
5
@cory: cela ne gâche-t-il pas la capacité de votre logiciel de contrôle de version à vous montrer la différence entre les versions du fichier que vous venez de reformater?
Steve Melnikoff
C'est pourquoi je suis un peu attiré par l'apprentissage de python ... pour penser que je dois juste m'inquiéter de ce que mes tabstops sont définis, et non des styles de renforcement. C'est plutôt convaincant.
Chris K
24

La "pratique de programmation" la plus importante sur laquelle j'ai depuis changé d'avis est peut-être l'idée que mon code est meilleur que celui des autres. Ceci est courant pour les programmeurs (en particulier les débutants).

Nippysaurus
la source
20

Bibliothèques utilitaires. J'avais l'habitude de transporter un assemblage avec une variété de méthodes et de classes d'assistance avec la théorie que je pourrais les utiliser ailleurs un jour.

En réalité, je viens de créer un immense espace de noms avec beaucoup de fonctionnalités mal organisées.

Maintenant, je les laisse simplement dans le projet dans lequel je les ai créés. Selon toute probabilité, je n'en aurai pas besoin, et si je le fais, je pourrai toujours les refactoriser en quelque chose de réutilisable plus tard. Parfois, je les marque avec un // TODO pour une éventuelle extraction dans un assemblage commun.

JamesWampler
la source
12
Il y a une bonne citation (je ne trouve pas l'original pour le moment) qui était quelque chose du genre "ne pensez même pas à créer une routine générique jusqu'à ce que vous ayez dû résoudre le même problème 3 fois.
DaveR
9
"Trois coups et vous refactorisez" - Refactoring par Martin Fowler. La règle de trois , p. 58.
Nick Dandoulakis
20

Concevoir plus que ce que j'ai codé. Au bout d'un moment, cela se transforme en paralysie d'analyse.

Paul Nathan
la source
44
J'invoque parfois la phrase "Si vous trouvez que vous pensez trop, arrêtez-vous et faites. Si vous trouvez que vous en faites trop, arrêtez-vous et réfléchissez."
Neil N
C'est bien, mais combien c'est trop?
Hamish Grubijan
Trop de dépendance à UML (Useless Modeling Language). Il a parfois ses utilisations. Mais une fois que je vois quelqu'un commencer à dessiner des diagrammes de classes et à prêcher sur les avantages de «à quel point ce serait génial de générer du code à partir des diagrammes», j'ai enfilé mes chaussures de course. De plus, Visual Studio dispose d'un générateur de diagramme de classes interactif intégré qui fait tout automatiquement et fonctionne comme l'explorateur d'objets sur crack.
Evan Plaice
15

L'utilisation d'un DataSet pour exécuter la logique métier. Cela lie le code trop étroitement à la base de données, et le DataSet est généralement créé à partir de SQL, ce qui rend les choses encore plus fragiles. Si le SQL ou la base de données change, il a tendance à se répercuter sur tout ce que le DataSet touche.

Exécution de toute logique métier à l'intérieur d'un constructeur d'objet. L'héritage et la capacité de créer des constructeurs surchargés ont tendance à rendre la maintenance difficile.

Eric Schneider
la source
15

Abréviation de la variable / méthode / table / ... Noms

J'avais l'habitude de faire cela tout le temps, même lorsque je travaillais dans des langues sans limites imposées sur la longueur des noms (enfin, ils étaient probablement 255 ou quelque chose). L'un des effets secondaires était un grand nombre de commentaires jonchant tout le code expliquant les abréviations (non standard). Et bien sûr, si les noms ont été modifiés pour une raison quelconque ...

Maintenant, je préfère de loin appeler les choses ce qu'elles sont vraiment, avec de bons noms descriptifs. y compris les abréviations standard uniquement. Pas besoin d'inclure des commentaires inutiles, et le code est beaucoup plus lisible et compréhensible.

Rhys Jones
la source
Oui, je dois aimer ces types de déclarations: void Foo (x1, y, x2, y2, p, r, j) ... WTF?!
Ed S.
Ou pire (et oui, j'ai vu ça), Foo(int arg0, String arg1, float arg2)etc
Mac
14

Enveloppant les composants d'accès aux données existants, comme la bibliothèque d'entreprise, avec une couche personnalisée de méthodes d'assistance.

  • Cela ne facilite la vie de personne
  • C'est plus de code qui peut contenir des bogues
  • Beaucoup de gens savent comment utiliser les composants d'accès aux données EntLib. Personne d'autre que l'équipe locale ne sait comment utiliser la solution d'accès aux données interne
blu
la source
14

J'ai entendu parler pour la première fois de la programmation orientée objet en lisant sur Smalltalk en 1984, mais je n'avais pas accès à un langage oo jusqu'à ce que j'utilise le compilateur cfront C ++ en 1992. J'ai finalement pu utiliser Smalltalk en 1995. J'attendais avec impatience oo technologie, et a adhéré à l’idée qu’elle sauverait le développement de logiciels.

Maintenant, je vois simplement oo comme une technique qui présente certains avantages, mais ce n'est qu'un outil dans la boîte à outils. Je fais la plupart de mon travail en Python et j'écris souvent des fonctions autonomes qui ne sont pas des membres de classe, et je collecte souvent des groupes de données dans des tuples ou des listes où dans le passé j'aurais créé une classe. Je crée toujours des classes lorsque la structure des données est compliquée ou que j'ai besoin d'un comportement associé aux données, mais j'ai tendance à y résister.

Je suis en fait intéressé à faire du travail dans Clojure quand j'en aurai le temps, qui ne fournit pas de fonctionnalités oo, bien qu'il puisse utiliser des objets Java si je comprends bien. Je ne suis pas prêt à dire quelque chose comme oo est mort, mais personnellement, je ne suis pas le fan que j'étais.

Greg Graham
la source
13

En C #, utilisation _notationpour les membres privés. Je pense maintenant que c'est moche.

J'ai ensuite changé this.notationpour les membres privés, mais j'ai trouvé que je n'étais pas cohérent dans son utilisation, alors j'ai laissé tomber cela aussi.

JulianR
la source
29
J'utilise toujours _notation et je pense que c'est génial.
Arnis Lapsa
3
Je déteste la _notation; J'utilise ThisNotation pour les membres publics et thisNotation pour les membres privés.
Callum Rogers
Je déteste ça aussi. Ça me déroute :(
Broken_Window
4
Je ne suis pas d'accord. Cela facilite grandement la gestion des noms. Utilisez PascalCase pour les propriétés ou les membres publics / internes, _UnderscorePascalCase pour les membres exposés via une propriété et camelCase pour les noms de paramètres dans les méthodes / constructeurs et les membres privés. Le mot-clé 'this' n'est nécessaire que si vous devez passer la référence de la classe courante en dehors de la classe ou si vous devez accéder à un membre généré automatiquement dans la classe (tel que le nom, les contrôles, etc.).
Evan Plaice
@Evan: Je fais exactement ce que vous décrivez, sauf pour la dernière partie. J'ai tendance à utiliser thisou Me(respectivement C # et VB.NET) lors de l'appel de méthodes et de propriétés. IMO, cela rend mon code plus facile à lire et à comprendre plus tard, en particulier lorsqu'il y a quatre objets ou plus dans cette portée particulière.
Alex Essilfie
11

J'ai arrêté de suivre la méthode de conception recommandée par l'université avant la mise en œuvre. Travailler dans un système chaotique et complexe m'a obligé à changer d'attitude.

Bien sûr, je fais toujours des recherches sur le code, en particulier lorsque je suis sur le point de toucher du code que je n'ai jamais touché auparavant, mais normalement j'essaie de me concentrer sur des implémentations aussi petites que possible pour commencer quelque chose. C'est l'objectif principal. Ensuite, affinez progressivement la logique et laissez le design apparaître tout seul. La programmation est un processus itératif et fonctionne très bien avec une approche agile et avec beaucoup de refactoring.

Le code ne regardera pas du tout à quoi vous pensiez d'abord qu'il ressemblerait. Cela arrive à chaque fois :)

ralphtheninja
la source
10

J'étais passionné par la conception par contrat. Cela signifiait mettre beaucoup de vérification d'erreurs au début de toutes mes fonctions. Les contrats sont toujours importants, du point de vue de la séparation des préoccupations, mais plutôt que d'essayer d'imposer ce que mon code ne devrait pas faire, j'essaie d'utiliser des tests unitaires pour vérifier ce qu'il fait.

Frank Schwieterman
la source
On m'a appris à programmer comme ça. Bien sûr, j'ai été enseigné par un professeur de mathématiques HS, donc je suppose qu'il est logique qu'il veuille que ses fonctions soient toutes auto-vérifiées.
Alex
10

J'utiliserais des statiques dans de nombreuses méthodes / classes car c'était plus concis. Quand j'ai commencé à écrire des tests, cette pratique a changé très rapidement.

rball
la source
10

Exceptions vérifiées

Une idée étonnante sur papier - définit clairement le contrat, aucune possibilité d'erreur ou d'oubli de vérifier une condition d'exception. J'ai été vendu quand j'en ai entendu parler pour la première fois.

Bien sûr, cela s'est avéré être un tel désordre dans la pratique. Au point d'avoir des bibliothèques aujourd'hui comme Spring JDBC, qui a caché les exceptions vérifiées héritées comme l'une de ses principales fonctionnalités.

Grégory Mostizky
la source
9

Tout ce qui valait la peine n'était codé que dans une langue particulière. Dans mon cas, je pensais que C était le meilleur langage qui soit et je n'ai jamais eu aucune raison de coder quoi que ce soit dans une autre langue ... jamais.

Depuis, j'apprécie de nombreuses langues différentes et les avantages / fonctionnalités qu'elles offrent. Si je veux coder quelque chose de petit - rapidement - j'utiliserais Python. Si je veux travailler sur un grand projet, je coderais en C ++ ou C #. Si je veux développer une tumeur au cerveau, je coderais en Perl .

Patrick Gryciuk
la source
8

Lorsque j'ai eu besoin de refactoriser, j'ai pensé qu'il était plus rapide et plus propre de commencer immédiatement et de mettre en œuvre le nouveau design, en réparant les connexions jusqu'à ce qu'elles fonctionnent. Ensuite, j'ai réalisé qu'il était préférable de faire une série de petites refactorisations pour progresser lentement mais sûrement vers le nouveau design.

Ying
la source
Je me souviens du nombre de fois où cela m'a mordu ....
Preet Sangha
8

Peut-être que la chose la plus importante qui a changé dans mes pratiques de codage, ainsi que dans d'autres, est l'acceptation de classes extérieures et de bibliothèques téléchargées sur Internet comme base des comportements et des fonctionnalités des applications. À l'école, à l'époque où j'allais à l'université, nous étions encouragés à trouver comment améliorer les choses via notre propre code et à nous fier au langage pour résoudre nos problèmes. Avec les progrès dans tous les aspects de l'interface utilisateur et de la consommation de services / données, ce n'est plus une notion réaliste.

Il y a certaines choses qui ne changeront jamais dans une langue, et avoir une bibliothèque qui enveloppe ce code dans une transaction plus simple et en moins de lignes de code que je dois écrire est une bénédiction. La connexion à une base de données sera toujours la même. La sélection d'un élément dans le DOM ne changera pas. L'envoi d'un e-mail via un script côté serveur ne changera jamais. Avoir à écrire cette fois et encore gaspille du temps que je pourrais utiliser pour améliorer ma logique de base dans l'application.

Liam
la source
7

Initialisation de tous les membres de la classe.

J'avais l'habitude d'initialiser explicitement chaque membre de classe avec quelque chose, généralement NULL. J'en suis venu à réaliser que ceci:

  • signifie normalement que chaque variable est initialisée deux fois avant d'être lue
  • est idiot car dans la plupart des langages, initialisez automatiquement les variables à NULL.
  • applique en fait un léger impact sur les performances dans la plupart des langues
  • peut gonfler le code sur des projets plus importants
Nippysaurus
la source
4
Parfois, les conséquences de ne PAS initialiser tous les membres de la classe peuvent vraiment vous mordre dans le $$.
muusbolla
Sauf si vous utilisez un langage basé sur un prototype qui crée de nouvelles instances par clonage. L'initialisation de tous les membres peut vraiment vous éviter beaucoup de problèmes.
Wojciech Bederski
6

Comme vous, j'ai également adopté les modèles IoC pour réduire le couplage entre divers composants de mes applications. Cela simplifie grandement la maintenance et le remplacement des pièces, à condition que je puisse garder chaque composant aussi indépendant que possible. J'utilise également plus de cadres relationnels objet tels que NHibernate pour simplifier les tâches de gestion de base de données.

En un mot, j'utilise des "mini" frameworks pour aider à créer des logiciels plus rapidement et plus efficacement. Ces mini-frameworks permettent de gagner beaucoup de temps et, s'ils sont bien exécutés, peuvent rendre une application extrêmement simple à entretenir sur la route. Plug 'n Play pour la victoire!

ajawad987
la source
-1 Je ne supporte pas la prolifération de l'IoC et des frameworks. Découplage bon, IoC et frameworks = complexité inutile
Paul Hollingsworth
Comment pouvez-vous saluer le découplage tout en détestant l'IoC et d'autres cadres? C'est ce que font de nombreux frameworks et modèles de conception IoC.
ajawad987