I ont un projet ASP.NET, dans lequel j'ai un procédé avec 10 variables locales. Cette méthode appelle environ 10 autres méthodes. 3 des méthodes appelées ont besoin de toutes les variables. Est-il considéré comme une bonne pratique de transformer toutes ces variables dans les membres mondiaux, et ils n'ont pas passé en tant que paramètres?élément global par rapport à la transmission de paramètres
Répondre
créer une structure au lieu et passer la structure au lieu de passer ces 10 paramètres
Ex:
public struct user
{
public string FirstName;
public string LastName;
public string zilionotherproperties;
public bool SearchByLastNameOnly;
public datetime date1;
}
Eh bien, cela dépend entièrement de ce que vous entendez par « membres globaux ».
Si, étant donné que vous écrivez une application ASP.NET, vous voulez dire les valeurs de cache à base de l'application de la session /, il dépend. Il y a des implications sur les performances, vous devriez donc mesurer pour voir si cela a un impact sur votre application.
Si vous voulez dire les variables statiques, alors non. Statique est par application, et donc pour tous les utilisateurs de votre application web, et pas seulement une seule personne. Discussion statique est pas une bonne idée non plus comme un seul utilisateur peut flotter entre les fils de son vivant dans l'application.
Est-ce que ces variables se rapportent les uns aux autres, que ce soit tous ou peut-être dans quelques groupes? Si oui, encapsulez-les dans un type. Vous pouvez donc avoir la moitié de vos variables relatives à un utilisateur, et la moitié liée à une opération demandée - et soudainement votre méthode prenant 10 variables ne prend que 2.
Rendre les choses globales est presque toujours la mauvaise solution.
Si vous voulez passer l'état complexe autour, emballez-le dans un objet - à savoir
public class Foo {
public string Key {get;set;}
public decimal Quantity {get;set;}
// etc
}
Et ont les méthodes acceptent cet objet comme argument. Ensuite, il vous suffit de créer une instance de ceci et de la transmettre.
Global est un grand non-non; ASP.NET est fortement threaded - ce serait un cauchemar. L'état de chaque demande est possible, mais un peu brouillon.
Si vous avez des méthodes qui agissent sur vraiment ne un grand nombre de variables, telles que vous mentionnez, vous pouvez également envisager de concevoir une classe qui a pour but d'agir comme un conteneur de données. Une fois rempli, vous pouvez passer la classe aux fonctions qui nécessitent des données au lieu de dix paramètres. Je ne me souviens pas de l'exemple exact, mais dans le livre "Framework Design Guidelines" de Microsoft, ils décrivent explicitement un scénario comme le vôtre ainsi que la façon dont ils ont suivi la même approche dans le .NET Framework. En outre, si vous avez besoin de transmettre autant de paramètres, prenez du recul et assurez-vous que le code en question n'a pas besoin d'être refactorisé. Il y a des cas légitimes où beaucoup de données est nécessaire par une méthode, mais j'utiliser les signatures de méthode longues comme un signe que je dois regarder à l'intérieur de la méthode pour vous assurer qu'il ne fait que ce qu'il doit.
Juste être sûr d'être conscient de la boxe. Si vous passez 10 types de référence, cela dépend de vos préférences personnelles. Cependant, si vous transmettez 10 types de valeur, si vous les déclarez comme variables membres dans une classe, elles seront encadrées, puis devront être décapsulées par le destinataire.Si vous les laissez confinées en tant que variables locales dans la pile de méthodes (en passant en tant que paramètres), elles resteront purement sur la pile, plutôt que d'être encapsulées dans le tas.
Pour un refactoring purement mécanique, l'emballage des valeurs ensemble (comme suggéré) est probablement la meilleure solution. Cependant, vous disposez d'une grande série de méthodes dépendantes, chacune d'entre elles agissant sur un état commun (au moins 10 valeurs). Il semble que vous devriez concevoir une classe pour gérer cette opération.
La classe encapsulerait le comportement et l'état pertinent, plutôt que d'être un simple ensemble de propriétés (voir Anemic Domain Model).
- 1. Comment mesurer le temps écoulé de HttpWebResponse réel par rapport à la transmission de HttpWebRequest?
- 2. Comment transmettre des paramètres au rapport SSRS par programme
- 3. Correctif et correctif par rapport à la version de maintenance par rapport au Service Pack par rapport à
- 4. Transmission d'un élément HTML au contrôleur
- 5. ArrayList par rapport à un tableau d'objets par rapport à la collection de T
- 6. Grails: fournir des données à un élément UI global
- 7. Valeur par rapport à la référence
- 8. Mise à jour des paramètres de rapport en fonction de la sélection des paramètres? (SSRS)
- 9. transmission de plusieurs valeurs à clignoter par php
- 10. DLL par rapport à l'Assemblée
- 11. Executors.newCachedThreadPool() par rapport à Executors.newFixedThreadPool()
- 12. Transmission de paramètres de requête à un programme CGI C# sous Apache sous Windows
- 13. Est-il possible de définir la mise en page d'un rapport SSRS à l'aide de paramètres de rapport?
- 14. Utilisation de la propriété DesignMode par rapport à LicenseManager.UsageMode
- 15. Quelle est la performance de F # par rapport à C#?
- 16. fonctions d'usine de python par rapport à la classe
- 17. Efficacité de la désérialisation par rapport à XmlReader
- 18. Type d'entrée "caché" par rapport à la zone de texte
- 19. Méthode d'extension de performance par rapport à la méthode d'instance
- 20. La qualité de l'équipe par rapport à un processus spécifique
- 21. Expressions de table communes par rapport à la table temporaire
- 22. Appel via la ligne de commande par rapport à JNI
- 23. Masquer un élément de rapport à partir de l'impression/exportation d'un rapport rdlc
- 24. Transmission de paramètres de ligne de commande à VB6 IDE dans l'application console
- 25. Mod Rewrite Question - paramètres de transmission aux nouveaux noms de paramètres
- 26. PHP - définir des constantes par rapport à l'utilisation de config.ini
- 27. Quels sont les avantages du proxy par classe par opposition à la transmission par proxy par interface (Spring)?
- 28. Transmission de la chaîne de requête à rDirectory
- 29. Allocation statique par rapport à l'allocation dynamique par rapport à l'allocation automatique
- 30. Transmission de paramètres à un flux RSS à partir d'un composant WebPart de vue de données dans Sharepoint
Cela devrait être une classe, pas une structure. Et si c'était * une structure, elle devrait être immuable, sinon vous demandez beaucoup de douleur. Oh, et ce devrait être des propriétés, pas des champs - mais je suis d'accord avec l'approche globale (passer un objet pour l'état). –
+1 pour tous les commentaires de Marc. –
Je me demande si le regroupement de paramètres dans une classe à plus grande échelle (disons une API avec environ 50 méthodes) est le choix le plus sage ou pas, est-ce bon s'il y a beaucoup de méthodes avec beaucoup de paramètres? –