Developpez.com

Le Club des Développeurs et IT Pro

Quels sont vos astuces et secrets de programmation ?

Confiez-nous vos trucs pour gagner du temps ou impressionner les collègues

Le 2010-10-29 14:51:25, par Idelways, Expert éminent sénior
Vous faites du développement depuis des années dans votre langage favori et vous croyez qu'il a fini de vous surprendre ?

Pas si sûr, car tous les langages ont des secrets, des fonctionnalités cachées que vous rencontrez un beau jour sur le code d'un collègue, sur un projet open-source ou même par une malheureuse (ou heureuse?) faute de frappe.

En PHP par exemple, savez-vous qu'il est possible d'appeler « Echo » avec plusieurs paramètres et faire, en quelque sorte de la concaténation avec une virgule ?

Code :
1
2
echo 'John', 'Doe';
Si cette astuce est anecdotique, voir inutile, d'autres peuvent surprendre et s'avérer très utiles, comme ce bout de code, certes un peu extrême pour des raisons de démonstration :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

  $Bar = "a";
  $Foo = "Bar";
  $World = "Foo";
  $Hello = "World";
  $a = "Hello";

  $a; // retourne Hello
  $$a; // retourne World
  $$$a; // retourne Foo
  $$$$a; // retourne Bar
  $$$$$a; // retourne a

  $$$$$$a; // retourne Hello
  $$$$$$$a; // retourne World

?>
Il s'agit en fait de l'utilisation des variables dynamiques, ou les variables des variables, une astuce qui marche aussi (et heureusement) pour les fonctions et méthodes de classes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$foo = 'bar';
$bar = 'foobar';

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'Quelle belle journée';
}
$foo();    // Affiche Hello world!
$$foo();    // Affiche Quelle belle journée!
Toujours en PHP, connaissez-vous la classe standard ? Qui permet de se passer, dans certaines situations des tableaux associatives ou de déclarer inutilement des data-classes :

Code :
1
2
3
4
5
6
7
8
9
10
$person = array();
$person['nom'] = 'John Doe';
$person['age'] = 42;

// devient 

$person = new stdClass();
$person->nom = 'bob';
$person->age = 5;
Il est même possible de « caster » un tableau associatif en Objet et l'utiliser comme tel :

Code :
1
2
3
4
$obj = (object)array('nom' => 'bob', 'age' => 5);

echo $obj->nom;
Vous avez de nombreuses classes et vous souhaitez éviter de les parser et les charger toutes en mémoire pour n'en utiliser que quelques-unes ?

PHP a la solution, la routine __autoload() permet d'exécuter du code à chaque instanciation, ce qui permet entre autre, d'inclure le fichier de la classe en question :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(E_ALL);
set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');

function __autoload($classname) {
  // chaque classe est stockée dans un fichier unique dans le dossier libs "libs/{$classname}.class.php"
  
  echo $classname;
  include_once $classname . '.class.php';
}

$a = new model();
?>
Bref, ces quelques exemples exclusivement en PHP, illustre une réalité de tous les langages : ils ont des secrets !

Vous en connaissez certainement dans votre langage de prédilection. Alors n'hésitez pas ; faites en nous part.

Car rappelez-vous qu'un secret est, comme dit l'expression, « une chose que l'on ne répète qu'à une seule personne ».

Et vous ?

Quelles sont les astuces et secrets de développement favoris ? Dans quel contexte vous en servez-vous ? Comment avez-vous découvert ce secret ?

En collaboration avec Gordon Fowler
  Discussion forum
71 commentaires
  • _skip
    Expert éminent
    Certains de ces trucs, j'appelle ça de la programmation de cochon qui sert à se mettre des autogoals.
  • dogua
    Membre régulier
    Tout ça, c'est pas mal pour flatter son ego, mais je pense qu'un bon développeur doit savoir se faire lire par ses collègues sans trop de difficulté.

    Pour ce qui est du gain de temps... Rien ne vaut un code lisible et documenté...
    Car si c'est pour gagner 5 secondes par ligne de code et perdre 10 minutes la semaine d'après pour comprendre une classe que tu as écris ce n’est pas très utile...
  • Uther
    Expert éminent sénior
    En java:
    Initialisation d'un objet en détournant les blocs d'initialisation:
    Je ne l'utilise pas car ce n'est pas optimal (héritage inutile) et déroutant pour pas mal de monde. Mais ça permet de simplifier l'initialisation de certains objets. Il s'agit en fait d'un détournement des classes anonyme et des blocs d'initialisation:
    Code :
    1
    2
    3
    4
    5
    List<String> maListe = new ArrayList<String>(){{
        add("un");
        add("deux");
        add("trois");
    }};
    Les blocs nommés
    Pour le coup c'est optimisé, mais ça rappelle immanquablement le goto. Or tout le monde sait que le goto est responsable des attentats du 11 septembre, de la Shoah et de la faim dans le monde.
    C'est pourtant bien pratique pour sortir immédiatement d'un bloc de code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    general:
    while(niveau1){
        while(niveau2){
            while(niveau3){
                //...
                break general;
            }
        }
    }
  • gorgonite
    Rédacteur/Modérateur
    Envoyé par Idelways
    Bref, ces quelques exemples exclusivement en PHP, illustre une réalité de tous les langages : ils ont des secrets !

    Vous en connaissez certainement dans votre langage de prédilection. Alors n'hésitez pas ; faites en nous part.

    Car rappelez-vous qu'un secret est, comme dit l'expression, « une chose que l'on ne répète qu'à une seule personne ».

    euh... en quoi c'est un secret ?
    vous voulez juste savoir si l'on peut faire des trucs un peu sioux, qu'on ne présente pas dans un cours "débutant" sur ce langage histoire de ne pas les faire fuir trop tôt ?
    Tout ce qui est présenté au-dessus est parfaitement documenté, voir intégré dans certains frameworks... en boîte noire histoire de ne pas choquer, et surtout de ne pas inciter à le faire a priori

    Dans les trucs plus sioux, on peut voir les méta-programmations C++ qui utilisent des caractéristiques des compilateurs ne respectant pas tout à fait la norme...
  • sekaijin
    Expert éminent
    He ho on se calme

    je n'ai jamais prétendu détenir une vérité absolue
    le sujet est ce que nous faisons
    chacun d'entre nous

    je dis JE FAIS c'est tout Je ne dis pas ON DOIT
    je dis que je Préfère faire
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function foo() {
      if (r = test()) then {
         ...
         returnValue = ...;
      } else {
         returnValue = false;
      }
      retrun retrunValue;
    }
    que
    Code :
    1
    2
    3
    4
    5
    6
    function foo() {
      if (! r = test()) then 
      retrun false;
      ...
      return ...;
    }
    c'est un choix qui a des avantage et des inconvénients.
    c'est un choix comme un autre

    A+JYT
  • Idelways
    Expert éminent sénior
    Bonjour _skip, dogua et gorgonite

    Merci pour vos réactions, mais une petite mise au point s'impose

    L'objectif de cet article n'est pas de recenser les bonnes ou mauvaises pratiques de développement ni d'inciter à les utiliser, pour ça on a lancé d'autre débats, comme celui d'hier sur l'optimisation du code VS sa lisibilité.

    Le but ce celui là est ludique, de faire découvrir les fonctionnalités cachées des langages, par forcément évidente, ne serait-ce que pour un débutant.

    Après, les appeler des secrets c'est peut être effectivement un peu exagéré, mais c'est l'esprit quoi

    Cordialement à vous trois,
  • Flaburgan
    Modérateur
    syso et CTRL+ D qui donne System.Out.Println() sous Eclipse, c'est pas un secret du langage mais quand j'ai montré ça à un collègue il a essayé de compter le nombre d'heure qu'il avait perdu à le taper en entier.
  • dissert
    Membre averti
    Je suis d'accord avec les commentateurs précédent.

    Il ne faut pas utiliser ces trucs, c'est mal.

    Par contre, il peut être utile de les connaître pour pouvoir auditer (mais pas coder !)

    Pour les trucs en Java, ce ne serait pas bien de donner l'URL suivante : http://stackoverflow.com/questions/1...atures-of-java
    non ! ce ne serait pas bien du tout.

    En plus c'est contre productif, parce qu'on passe un temps fou à tout regarder et à essayer de tout comprendre, alors qu'il ne faut pas les utiliser.
  • xelab
    Membre expérimenté
    array_map en PHP est pas forcément connu mais pourtant parfois bien utile (ça évite trois/quatre lignes de codes mais tout de même... ).

    Permet d'appliquer une fonction à chaque valeur d'un tableau:

    Code :
    array_map("fonction_bidule",$tableau);
    http://php.net/manual/fr/function.array-map.php
  • dingoth
    Membre expérimenté
    Un truc que j'utilise presque tout le temps pour éviter d'avoir des déclarations à rallonge en Java :

    Sans le truc :
    Code :
    List<UnNomDeClasseTresLong<Imbriquee<EtPasForcementLisible>>> liste = new ArrayList<UnNomDeClasseTresLong<Imbriquee<EtPasForcementLisible>>>();

    Avec le truc :
    Code :
    1
    2
    3
    4
    5
    6
    public static <T> ArrayList<T> newArrayList() {
      return new ArrayList<T>();
    }
    
    // Plus loin
    List<UnNomDeClasseTresLong<Imbriquee<EtPasForcementLisible>>> liste = newArrayList();
    Ca fonctionne pour tous les génériques et ça aide pas mal à l'écriture et à la lecture surtout quand on doit instancier en permanence ces génériques.

    Une autre petite merveille est la classe Preconditions de Guava. Facile à réécrire et à étendre, cette classe fait des merveilles dans la gestion des préconditions en lançant l'exception adéquate. À utiliser impérativement avec les imports static pour une meilleure lecture du code.

    http://guava-libraries.googlecode.co...onditions.html