Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

Quels sont vos astuces et secrets de programmation favoris


Sujet :

Langages de programmation

  1. #1
    Expert éminent sénior
    Quels sont vos astuces et secrets de programmation favoris
    Quels sont vos astuces et secrets de programmation favoris
    Pour gagner du temps ou impressionner les collègues ?


    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 ?

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent
    Certains de ces trucs, j'appelle ça de la programmation de cochon qui sert à se mettre des autogoals.

  3. #3
    Rédacteur/Modérateur

    Citation Envoyé par Idelways Voir le message
    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...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    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...

  5. #5
    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,

  6. #6
    Membre du Club
    en truc utile je dirais la constant __DIR__, (ou dirname(__FILE__) pour php < 5.3) pour les includes...
    Je trouve cela carrément plus propre qu'un set_include_path..

  7. #7
    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.

  8. #8
    Membre à l'essai
    Deep Thinking
    LOL
    les secrets/astuces des langages de programmation ne devraient justement pas être révélés aux communs des mortels sinon l' expérience algorithmique acquise sera au final aux normes non standard et donc inexploitable sur d'autres terrains , vous me suivez ?

  9. #9
    Nouveau Candidat au Club
    En java, qu'affiche ce programme ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int j = 5;
    int i = 0;
    i = j << 32;
    System.out.println(i);
    Integer a = new Integer(5);
    Integer b = new Integer(5);
    if (a==b) System.out.println("1"); 
    a++;
    b++;
    if (a==b) System.out.println("2"); 
    a = 314;
    b = 314;
    if (a==b) System.out.println("3");
    Réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int j = 5;
    int i = 0;
    i = j << 32;
    System.out.println(i); // i = 5
    Integer a = new Integer(5);
    Integer b = new Integer(5);
    if (a==b) System.out.println("1"); // a != b
    a++;
    b++;
    if (a==b) System.out.println("2"); // a == b
    a = 314;
    b = 314;
    if (a==b) System.out.println("3"); // a != b
    Utilisez la méthode "equals()" .

  10. #10
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    general:
    while(niveau1){
        while(niveau2){
            while(niveau3){
                //...
                break general;
            }
        }
    }

  11. #11
    Invité
    Invité(e)
    Ici, print pour PHP, mais ca pourrait être une fonction quelconque pour étendre à d'autre langages. En PHP l'idée c'est de faire ça dans la vue ou on s’en tape un peu du code PHP...

    Quand on ne veut pas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(true)
    {
     echo 'lol';
    }
    qui fait quatre lignes de code, taper dans du
    ce qui n'a aucune expression sémantique

    Sinon en JavaScript, (mais ca passe aussi pour les autres langages a typage dynamique) j'aime bien le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var b=false;
    var a=b||'lol';//a vaut 'lol'

  12. #12
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    array_map("fonction_bidule",$tableau);
    http://php.net/manual/fr/function.array-map.php

  13. #13
    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.
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  14. #14
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    List<UnNomDeClasseTresLong<Imbriquee<EtPasForcementLisible>>> liste = new ArrayList<UnNomDeClasseTresLong<Imbriquee<EtPasForcementLisible>>>();

    Avec le truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  15. #15
    Nouveau membre du Club
    Pour les "styles" un peu particulier...
    il n'est pas interdit de les commenter...

  16. #16
    Membre expérimenté
    Les classes internes aux méthodes en Java (utiles essentiellement dans les test cases) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MyClass {
      public static void main (String... args) {
        class MyActionListener implements ActionListener {
          private static int COUNT = 0;
          private int count = COUNT++;
          public void actionPerformed (ActionEvent e) {
            System.out.println(count);
          }
        }
        JButton button = new JButton();
        button.addActionListener(new MyActionListener());
        button.addActionListener(new MyActionListener());
      }
    }
    En fait ce sont des classes anonymes... nommées. Leur fichier .class sera du genre MyClass$1MyActionListener.class

  17. #17
    Expert éminent
    En C#, le @ ne permet pas seulement d'échapper les "\" qu'on trouve par exemple dans les noms de fichiers mais également de définir des chaînes multilignes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string select= @"SELECT name,  surname, age
                       FROM Persons
                       WHERE ID = ?";
    Très utile pour améliorer la lisibilité d'une éventuelle requête en pur ADO.net.

  18. #18
    Membre éclairé
    Quels sont vos astuces et secrets de programmation favoris

    Lire les articles, papiers et tout autres documents rédigés par l'auteur principal du langage (son créateur quoi, quand il y en a un plus ou moins identifié). Ce sont généralement ces documents qui exposent la philosophie du langage étudié et ces informations peuvent s'avérer cruciales pour une utilisation optimale par la suite (ce qui est parfois noyé ou non présenté dans la doc de référence dudit langage).

  19. #19
    Membre confirmé
    Des anti-patterns donc.

    Le genre de trucs qui fait exploser la dette technique.

  20. #20
    Membre régulier
    Les exemples PHP sont particulièrement pitoyables.

    Sinon, je citerais :

    * en python, l'utilisation de sum() couplé au fait que True vaut 1 pour compter des choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sum( x > 42 for x in liste )
    * sous postgres, la clause VALUES(), méconnue, mais véritable couteau suisse, qui permet de créer une pseudo-table avec des valeurs à la carte, utilisable comme table dans un JOIN :
    - tri à la carte
    - UPDATE de 50 lignes d'un coup avec des valeurs différentes
    - remplacement plus puissant de IN( liste )
    - etc

###raw>template_hook.ano_emploi###