2010-11-15 51 views
3

Cela semble être une simple question à poser, mais est-ce généralement une bonne idée de réutiliser des variables dans n'importe quel langage de script? Je suis particulièrement intéressé par les raisons pour lesquelles c'est/n'est pas une bonne pratique car je suis moi-même si je devrais ou ne devrais pas le faire.N'importe quelle langue: recyclage Variables

Par exemple, $i est l'une des variables les plus couramment utilisées dans une boucle pour itérer à travers les choses.

Par exemple (en php):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item. 

$i=0; //Recycling $i 

foreach ($array as $v) { 
    $i++; 

    if ($i<count($array)) 
    { 
     echo $v.', '; 
    } 
    else { 
     echo $v; 
    } 
} 

Dire que j'avais plusieurs boucles dans mon script, serait-il préférable de réutiliser $i ou simplement utiliser une autre variable, comme $a et pour toutes les autres boucles sont de $b à $z.

Il est évident que Réutiliser $i, je dois mettre $i=0; ou null avant que la boucle, ou bien ce serait donner un comportement très étrange plus tard dans le script. Ce qui me fait me demander si cela vaut la peine de le réutiliser.

Est-ce que ce qui suit prendrait plus de place que de simplement utiliser une autre variable?

$i=0; //Recycling $i 

Bien sûr, cela est l'exemple le plus simple d'utilisation et je voudrais savoir si le script était terriblement plus compliqué, serait-il causer plus d'ennuis que cela vaut la peine?

Je sais que réutiliser une variable pourrait économiser une quantité minuscule de mémoire, mais quand ces variables s'empilent, cela devient important, n'est-ce pas?

Je vous remercie pour toute réponse claire à l'avance et si cette question est trop vague, je m'excuse et voudrais le savoir aussi pour que je sache que je devrais poser des questions comme celles-ci ailleurs.

+1

Vous parlez d'une variable, pas d'une "chaîne". Une chaîne est une série d'octets, représentant souvent des caractères. – Santa

+0

* Facepalm * mes excuses .. le message a été édité conformément. – Partack

Répondre

1

La réinitialisation de votre variable ($ i = 0) ne prendra pas plus de place.

Lorsque vous déclarez une variable (disons de type entier), une quantité prédéfinie de mémoire est allouée pour cet entier quelle que soit sa valeur. En le remettant à zéro, vous modifiez uniquement la valeur.

Si vous déclarez une nouvelle variable, vous devrez lui allouer de la mémoire et, typiquement, elle sera également initialisée à zéro, donc la réinitialisation de votre variable existante ne prendra probablement pas non plus de temps CPU supplémentaire. Réutiliser une variable d'index pour des boucles mutuellement exclusives est une bonne idée; cela rend votre code plus facile à comprendre. Si vous déclarez beaucoup de variables supplémentaires, d'autres personnes lisant votre code peuvent se demander si "i" est encore utilisé pour quelque chose même après que votre boucle soit terminée.

Réutilisez-le! :)

+0

merci pour votre réponse. une chose que je voudrais souligner est, ne pas avoir le code supplémentaire à chaque fois pour redéfinir la variable augmenter la taille du fichier du script? normalement ce n'est pas vraiment un problème .. mais que se passerait-il si vous aviez seulement quelques kb avec lesquels travailler et un script avec beaucoup de boucles dans le pire des cas? – Partack

+1

Ne vous inquiétez pas de la taille du script. Votre script n'est pas mis directement en mémoire. Il est interprété et (selon votre langue) éventuellement compilé. Vos lignes de script sont en cours de traduction en une tonne d'instructions de bytecode que vous ne pouvez pas raisonnablement prévoir. Si vous êtes dans une situation où cette mémoire est limitée, vous devriez utiliser un langage de niveau inférieur tel que l'assemblage ou C. – Brendan

2

Je pense que vous avez "chaîne" confondue avec "variable". Une chaîne est une collection de caractères ASCII ou Unicode, selon le langage de programmation. Une variable est un emplacement nommé en mémoire. Vous parlez donc de recycler une variable, pas une chaîne.

Malheureusement, la façon dont les variables sont traitées dépend fortement du langage et du compilateur. Vous obtiendrez de bien meilleures informations si vous nous donnez plus de détails.

La plupart des langages ont le concept de portée, l'espace variable étant alloué à la déclaration et désaffecté à la fin de la portée. Si vous gardez une variable dans sa propre portée, vous n'aurez pas à vous soucier de gaspiller de la mémoire, car les variables seront désallouées lorsqu'elles ne sont plus nécessaires. Encore une fois, les spécificités de la portée dépendent de la langue.

Généralement, c'est une mauvaise idée de réutiliser des noms de variables comme ça, quand (pas si) vous oubliez de réinitialiser la variable à une valeur initiale dans la même portée, votre programme va casser au moment de l'exécution.

2

Vous devez initialiser $i à 0 avant d'entrer dans votre boucle foreach, que vous l'ayez utilisé précédemment ou non, quelle que soit la langue que vous utilisez. C'est tout simplement une meilleure pratique linguistique neutre.

Plusieurs langues vous aident à renforcer cela en vous permettant de lier la variable de comptage à la portée de la boucle for.foreach de PHP fournit un mécanisme similaire, à condition que votre tableau est base 0 et contient les touches numériques uniquement:

foreach ($array as $i => $v) { 
    echo $v; 

    if ($i + 1 < count($array)) 
     echo ', '; 
} 

En outre, en ce qui concerne votre déclaration:

Je sais que réutilisant une variable pourrait enregistrer une quantité minuscule de mémoire, mais quand ces variables s'empilent, il devient important, n'est-ce pas?

Non, ce n'est pas le cas. Les variables seront collectées par les ordures lorsqu'elles tombent hors de la portée. Il est pratiquement impossible (sans générer de code par programmation) d'utiliser autant de variables de comptage/temporaires au cours d'une seule fonction que l'utilisation de la mémoire est significative. Réutiliser une variable au lieu de déclarer une nouvelle variable n'aura aucun impact mesurable sur les performances de votre programme et n'aura pratiquement aucun impact sur son empreinte mémoire.

+0

oh ouais .. il est beaucoup plus logique de le mettre avant la boucle qu'après .. merci =) – Partack

1

Personnellement, je n'ai aucun problème avec la réutilisation de variables d'index/de compteur - bien que dans certaines langues, par exemple .Net, l'utilisation d'une variable dans une boucle for spécifie spécifiquement la variable à cette boucle. quel que soit.

Vous ne devriez jamais réutiliser les variables qui contiennent des données importantes (Cela ne devrait pas être un problème car toutes vos variables doivent avoir des noms descriptifs)

J'ai eu une fois pour essayer de nettoyer une macro excel code écrit par un étudiant - tous les noms de variables étaient des dieux grecs et l'usage changeait à plusieurs reprises tout au long du script. À la fin, je l'ai juste réécrit.

Vous devez également savoir que, selon le type de variable et la langue que vous utilisez, la réaffectation du contenu peut être aussi coûteuse que la création d'une nouvelle variable. par exemple, de nouveau en .Net, les chaînes sont immuables ... donc ce

Dim MyString as String = "Something" 
MyString = "SomethingElse" 

allouera en fait une nouvelle zone de mémoire pour stocker la 2ème utilisation et changer le pointeur MyString pour pointer vers le nouvel emplacement. Par ailleurs, c'est pourquoi ce qui suit est vraiment inefficace (au moins dans.Net):

Dim SomeString = SomeVariable & " " & SomeOtherVariable 

Cette alloue de la mémoire pour SomeVariable alors plus de mémoire pour SomeVariable + " ", puis encore une fois pour SomeVariable + " " + SomeOtherVariable - ce qui signifie SomeVariable qui est écrit à la mémoire 3 fois.

En résumé, des variables très simples pour les boucles que je réutiliserais. Quoi qu'il en soit, j'attribuerais simplement une nouvelle variable - d'autant plus que l'allocation de mémoire n'est généralement qu'une infime partie du temps/traitement de la plupart des applications.

Rappelez-vous: Premature optimization is the root of all evil

+0

Merci beaucoup pour votre contribution, cela a beaucoup de sens pour moi =) Je viens de lire sur Donald Knuth (la personne qui a dit cette citation). quel grand homme. Je me souviendrai de celui-là! – Partack

+0

Bienvenue. Je suis familier avec Knuth mais j'espérais que le SO Q serait plus utile :) – Basic

1

Cela dépend du problème que vous résolvez. Lorsque vous utilisez PHP (et d'autres langages de script), vous devez considérer unset() sur des variables importantes telles que les tableaux ou les chaînes longues. Vous ne devriez pas prendre la peine de réutiliser ou d'annuler de petites variables (entier/booléen/etc). Cela n'en vaut pas la peine quand vous utilisez un langage de script (lent).

Si vous développez une application critique dans un langage de niveau inférieur (inférieur) tel que C, la réutilisation des variables est plus importante.

+0

merci, en distinguant si recycler des variables entre différentes langues était une de mes questions brûlantes - que vous avez assez résumées =) – Partack