J'ai récemment examiné les spécifications de l'entreprise, et parmi elles, "le nombre de paramètres d'une fonction ne doit pas dépasser 4" a été quelque peu controversé lors de la promotion. Si la tâche peut être accomplie, moins il y a de paramètres, mieux c'est. controversé, mais cela peut entraîner des difficultés lors de la programmation, et il y a un débat sur la question de savoir si cela en vaut la peine. Je pense que cela vaut la peine de faire cela pour faciliter la tâche des personnes qui utilisent les fonctions. Quant aux difficultés de programmation, c'est souvent parce que nous ne connaissons pas certaines méthodes de réduction des paramètres. Voici quelques résumés pour votre référence :
1. Utiliser des structures pour encapsuler les paramètres
Exemple : Ajouter un utilisateur
Corps de la fonction d'origine : AddUser (chaîne userName, chaîne mot de passe, chaîne adresse, chaîne téléphone, âge int)
Refactor : ajoutez une classe User :
Utilisateur de classe
{
chaîne publique Nom d'utilisateur { get ;
chaîne publique Mot de passe { get ;
chaîne publique Adresse {get; set;
chaîne publique Téléphone { get ;
public int Âge { get ; set ;
}
Remplacez AddUser par : AddUser (utilisateur utilisateur)
Problèmes : Si la classe ajoutée n'est pas utilisée ailleurs, nous pensons souvent que cela n'en vaut pas la peine. Pour le moment, nous pouvons envisager d'utiliser des classes anonymes pour encapsuler les paramètres.
2. Utilisez des attributs pour remplacer les paramètres
Si la méthode AddUser en 1 est placée dans la classe User, alors les paramètres utilisateur de la méthode AddUser peuvent être omis. Parfois, certains attributs peuvent être ajoutés afin de réduire le nombre de paramètres dans certaines méthodes. Dans la conception orientée objet, les objets doivent être responsables d’eux-mêmes et les responsabilités doivent être clairement définies. La raison pour laquelle une méthode a trop de paramètres peut être que la méthode est écrite à un endroit où elle ne devrait pas exister. Le modèle « expert en information » mentionné dans le principe GRASP peut réduire le nombre de paramètres dans de nombreux cas.
Exemple : transfert de compte
Fonction originale : Transfert (Compte de, Compte vers, monnaie décimale)
Refactorisation :
code
Processus de transfert de classe publique
{
Compte privé De ;
Compte privé vers ;
Processus de transfert public (compte de, compte vers)
{
this.From = de;
this.To = à;
}
Transfert public nul (argent décimal)
{
si (argent<From.Money)
{
From.Money = From.Money - argent ;
À.Money = À.Money + argent ;
//mettre à jour la base de données
}
autre
{
throw new Exception("Solde dépassé");
}
}
}
Remarque : Le modèle expert en informations est le principe le plus fondamental de la conception orientée objet. Lorsque nous concevons des objets (classes), si une classe dispose de toutes les informations nécessaires pour accomplir une certaine responsabilité, alors cette responsabilité doit être attribuée à cette classe pour la mise en œuvre. . A l'heure actuelle, cette classe est l'expert en information correspondant à cette responsabilité.
3. Utilisez des fonctions privées
Lorsque nous appelons une fonction, nous n'avons souvent pas besoin de beaucoup de paramètres interactifs, mais lorsque nous fournissons des paramètres, nous devons fournir toutes les conditions. À ce stade, nous pouvons classer les fonctions, encapsuler les fonctions les plus complexes comme privées et exposer les fonctions. fonctions simples. Appelez ces fonctions complexes pour compléter la fonction. Jetons un coup d'œil à l'implémentation de la méthode TextBox dans mvc :
code
chaîne statique publique TextBox (ce HtmlHelper htmlHelper, nom de la chaîne, valeur de l'objet, IDictionary<string, object> htmlAttributes) {
return InputHelper(htmlHelper, InputType.Text, nom, valeur, (value == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
}
chaîne statique privée InputHelper (ce HtmlHelper htmlHelper, InputType inputType, nom de chaîne, valeur d'objet, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes) {
if (String.IsNullOrEmpty(nom)) {
lancer une nouvelle ArgumentException (MvcResources.Common_NullOrEmpty, "name");
}
TagBuilder tagBuilder = new TagBuilder("entrée");
... ...
Mais parfois, afin de donner à l'appelant un maximum de flexibilité, nous pouvons également exposer la surcharge de fonctions la plus complexe.
4. mot-clé paramètres
Spécifie que lorsque le nombre de paramètres est variable, le paramètre de méthode du paramètre est utilisé.
usage:
code
static void Main(string[] arguments)
{
UtiliserParams(1, 2, 3);
}
public static void UseParams (params int[] liste)
{
pour (int i = 0; i < list.Length; i++)
{
Console.WriteLine(liste[i]);
}
Console.WriteLine();
}
Cette méthode ne réduit pas réellement le nombre de paramètres, mais simplifie uniquement le corps de la fonction.
5. Utilisez des classes anonymes pour encapsuler les paramètres
Connaissances préparatoires : jetons d'abord un coup d'œil à RouteValueDictionary
code
static void Main(string[] arguments)
{
RouteValueDictionary r = new RouteValueDictionary(new { id=1,name="lfm"});
foreach (élément var dans r)
{
Console.WriteLine("{0}:{1}", item.Key, item.Value);
}
//Console.WriteLine();
}
résultat:
identifiant : 1
nom:lfm
RouteValueDictionary peut stocker les noms d'attribut et les valeurs d'attribut des instances dans le dictionnaire.
De nombreux endroits dans mvc utilisent cette méthode pour transmettre des paramètres.
Par exemple : <%= Html.ActionLink("Details", "Details", new { id=item.id })%>
Dans le corps de la méthode ActionLink, RouteValueDictionary est utilisé pour décomposer l'objet anonyme puis l'assembler sur le lien.