See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Programmer à la soviétique pour éviter les bugs  (Read 5214 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
13 July 2012, 02:34:44

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352



Programmer à la "soviétique" pour éviter les bugs

La mémoire ne coute plus rien et les allocations mémoire (new/delete) sont une énorme source de bug et de complication donc je les évite comme la peste (je ne crois pas qu'un seul de mes addon en contienne un)

Je n'utilise que des tableaux (array) ou des structures.

Code: [Select]
char cVesselName[20]={0};

Maintenant ceci ferait hurler n'importe quelle bogosse d'un forum de programmation:

Code: [Select]
strncpy(cVesselName,GetName(), 15);

Copier quinze char dans une variable qui peut en contenir 20 ? Quel gâchis, c'est moche ! :fool:

C'est vrai mais l'habitué en question n'a probablement jamais rien programmé de plus gros qu'une demo de calculette (buggée) et quand vous donnez dans les gros truc et que vous tapez 15 lignes/minutes la rigueur humaine en prend un méchant coup.

Après 30'000 lignes et pleins de retouches le code qui était "si joli et précis au byte prêt" va se transformer en cauchemars de bugs pour autant que vous ayez la chance de les détecter à temps plutôt que ça n'explose chez les utilisateurs finaux.

Donc voila, je suis pro et je programme à la soviétique : du robuste, du lisible, du sur ! Je SAIS qu’immanquablement je vais me planter de quelques bytes ici et là, que je vais changer des trucs et que je vais oublier de changer la variable, donc je n'ai aucune honte à rajouter systématiquement des marges de 20%-30% voir du 200% pour des sujets sensibles.

Vous prévoyez de bosser avec 15 vessels qui ont un nom de dix caractères maximum ? ne vous emmerdez pas au byte prêt et allez y franchement !!!

Celui là ne vous emmerdera jamais et ne vous fera pas bouger un seul neurone en calcul et attention:
Code: [Select]
char cVesselName[20][20]={0};

La perte de mémoire est équivalente à 0.00078 fois la taille d'une image de 320x200. Sur l'ensemble du programme vous aurez "gâché" au maximum l’équivalent d'un gros icône.


Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352




Message modifié ( 13-07-2012 12:43 )


Offline cslevine

  • Legend
  • ******
  • Posts: 3621
  • Karma: 17
Reply #1 - 20 July 2012, 02:39:44
Très belle mise au point et j'adore la dernière ligne de conclusion.
Cela s'appelle du bon sens :-)



Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #2 - 20 July 2012, 23:16:48
Personnellement, je suis beaucoup plus OO et je ne me soucis plus vraiment des allocations/destructions.

Pour des trucs comme des chaînes de caractère, je n'utilise que la classe std::string maintenant. Pour ton exemple de cVesselName, la classe std::vector aurait permis la création d'un tableau dynamique. Pour plus de contrôle, std::list.

Sinon, pour les distraits, il y a les smart pointers. Je ne les ai jamais utilisés, mais je devine que ça peut aider. Toutefois, j'ai déjà essayé le reference counting avec Irrlicht et je dois dire que je n'ai pas particulièrement aimé. Je trouve que ça revient à déplacer le mal à une autre place.


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 21 July 2012, 00:03:20
Quote
Bibi Uncle a écrit:
Pour des trucs comme des chaînes de caractère, je n'utilise que la classe std::string maintenant.  Pour plus de contrôle, std::list.

C'est surtout horriblement lent et il est très facile de mal les utiliser pour arriver à quelques centaines de milliers de lignes de code machine exécutées en pur perte. Coté mémoire perdue c'est la fête du slip avec plein de copies inutiles en mémoire pour de simple opérations. Ayant fait pas mal de code machine et optimisant beaucoup mon cœur ce révulse à cette évocation. Sur les très grosse appli c'est le cpu de l'utilisateur qui éventuellement ce révulse ;)

A réserver donc pour des cas très précis (tableau dynamique) en sachant bien ce qu'on fait on peut parfaitement mixer les null terminated et les "std". De mon coté je ne les utilises jamais. Pour les cas de redimensionnement j'ai mes propres routines optimisées ou je sais exactement ce qu'il y a dedans et comment les utiliser efficacement.

Dan



Message modifié ( 21-07-2012 01:11 )

« Last Edit: 21 July 2012, 02:22:29 by DanSteph »

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #4 - 21 July 2012, 02:22:29
Chacun son choix. Je préfère la tranquilité d'esprit des classes de la STL. Mais à part les chaînes de caractère, une bonne gestion des constructeurs/destructeurs est le meilleur chasseur de bugs.


« Last Edit: 21 July 2012, 02:22:29 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon