Magazine Internet

Code du jour: Trop de fonctions (T)

Publié le 23 mars 2009 par Wtf

Comme il était le plus expérimenté de son groupe lorsque l'on parlait de C#, c'est souvent à Yakir que les développeurs posaient leurs questions. Récemment, un de ses collègues, James, lui demanda la meilleure façon de stocker des centaines d'objets en mémoire. Yakir lui répondit : "Cela dépend de ce que tu souhaites en faire. Si tu veux l'utiliser via un index, le plus simple c'est l'Arraylist. Par contre, si tu veux utiliser le système de clé/valeur, alors prend une Hashtable."

Les besoins de l'application de James semblaient mieux coller avec l'utilisation d'une Hashtable, il décida donc de l'implémenter. Quelques heures plus tard, il revint vers Yakir : "Ton système de Hashtable ne marche pas super" expliqua James, "Tu ne connais pas quelque chose de plus efficace?".

 "Euuu", répondit Yakir, "rien n'est vraiment plus efficace qu'une Hashtable. Quel est exactement ton problème?"

"C'est juste trop lent", répondit James, "Dès que j'ai des données dans ma liste il faut presque cinq secondes pour ajouter, retirer ou retrouver un élément."

A ce moment Yakir sut qu'il y avait un problème et décida de jeter un petit coup d'œil au code de James, voici ce qu'il vit :

  class HashTable
  {
    public object[] keys;
    public object[] values;

    public HashTable()
    {
      keys = new object[0];
      values = new object[0];
    }

    public void Add(object key, object value)
    {
      Array.Resize(ref keys, keys.Length + 1);
      Array.Resize(ref values, values.Length + 1);
      keys[keys.Length - 1] = key;
      values[values.Length - 1] = value;
    }

    public void Remove(object key)
    {
      object[] tempKeys = new object[0];
      object[] tempValues = new object[0];
      for (int i = 0; i <= keys.Length - 1; i++)
      {
        if (!keys[i].Equals(key))
        {
          Array.Resize(ref tempKeys, tempKeys.Length + 1);
          Array.Resize(ref tempValues, tempValues.Length + 1);
          tempKeys[tempKeys.Length - 1] = keys[i];
          tempValues[tempValues.Length - 1] = values[i];
        }
      }
      keys = tempKeys;
      values = tempValues;
    }

    public object GetItem(object key)
    {
      for (int i = 0; i <= keys.Length - 1; i++)
      {
        if (keys[i].Equals(key))
        {
          return values[i];
        }
      }
      return null;
    }

    public int NumberOfItems
    {
      get
      {
        return keys.Length;
      }
    }
  }

"Oula!" dit Yakir. " Mais pourquoi tu n'as pas utilisé les Hashtables du Framework .net? Tu sais, celle de System.Collections dont je t'ai parlé."

"J'ai jeté un coup d'œil", expliqua James, "mais il y avait trop de fonctions, ce qui signifie que la collection aurait été plus lente. Ma classe elle ne contient que 3 fonctions, c'est donc plus efficace."


Retour à La Une de Logo Paperblog

A propos de l’auteur


Wtf 169 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazine