Maison développement back-end Tutoriel C#.Net Souvenez-vous d'une refactorisation de code .NET (Partie 1)

Souvenez-vous d'une refactorisation de code .NET (Partie 1)

Feb 06, 2017 pm 02:37 PM

Exigence : c'est le cas. Pour développer un modèle d'envoi de messages texte, différents clients peuvent utiliser différents modèles, et les paramètres variables utilisés par différents clients sont également différents.


En cas d'urgence, une fonction de modèle de message texte pour l'envoi de messages texte a été complétée en ligne. Le tableau des modèles de message texte a également été créé et un nouvel enregistrement a été ajouté. à table. Il me suffit de créer une interface pour ajouter, supprimer, modifier et vérifier des modèles de messages texte. Il semble que ma tâche soit assez simple. Un conducteur expérimenté devrait savoir que je me suis retrouvé dans le pétrin.


L'image ci-dessous montre la table créée à l'origine

Souvenez-vous dune refactorisation de code .NET (Partie 1)

Le script de création SQL est le suivant :

Souvenez-vous dune refactorisation de code .NET (Partie 1)

Avant cela, une interface API d'envoi de messages texte a été développée pour que les clients puissent appeler. En d'autres termes, l'appelant (client) ne modifiera pas le code, seulement moi. Même si je suis extrêmement réticent à entreprendre des tâches à moitié terminées, je n'ai d'autre choix que de recommencer toutes les tâches de développement à partir de zéro.


Le code de classe d'entité est le suivant :

Souvenez-vous dune refactorisation de code .NET (Partie 1)

Classe DOT :

Souvenez-vous dune refactorisation de code .NET (Partie 1)

Voici le code précédent, le code de la classe d'entité commerciale MessageModuleBusiness.cs est le suivant :

public class MessageModuleBusiness : GenericRepository<Model.MessageModule>
    {
        private UnitOfWork.UnitOfWork unitOfWork = new UnitOfWork.UnitOfWork();
        /// 获取模版内容
        public string GetContent(MessageContext messageContext)
        {
            string messageContent = "";
            string TypeCode = string.IsNullOrEmpty(messageContext.serviceCode) ? "001" : messageContext.serviceCode;
            try
            {
                var Module = unitOfWork.MessageModule.Get(c => c.Type == messageContext.channel && c.TypeNo == TypeCode).FirstOrDefault();
                //Content的内容:【一应生活】您有一件单号为expressNumbers company,
                已到communityName收发室,请打开一应生活APP“收发室”获取取件码进行取件。点击下载http://a.app.qq.com/o/simple.jsp?pkgname=com.ening.life
                if (!string.IsNullOrEmpty(Module.Content))
                {
                    var content = Module.Content;
                    content = content.Replace("company", messageContext.company);
                    content = content.Replace("expressNumbers", messageContext.expressNumbers);
                    content = content.Replace("communityName", messageContext.communityName);
                    content = content.Replace("Id", messageContext.Id);
                    content = content.Replace("receiveTime", messageContext.receiveTime);
                    content = content.Replace("fetchCode", messageContext.fetchCode);
                    messageContent = content;
                }
                return messageContent;
            }
            catch (Exception ex) {}
            return "";
        } 
        #endregion
}
Copier après la connexion

Classe MessageContext, c'est un objet d'entité transmis et appelé par le client. Il existe de nombreuses variables de balises dynamiques similaires aux messages texte dans l'objet.

public class MessageContext{
        /// 手机号码
        public string phone { get; set; }
        /// 发送信息
        public string message { get; set; }
        /// 签名
        public string sign { get; set; }
        /// 渠道
        public string channel { get; set; }
        /// 内容
        public string content { get; set; }
        /// 取件码
        public string fetchCode { get; set; }
        /// 快递公司
        public string company { get; set; }
        /// 快递单号
        public string expressNumbers { get; set; }
        /// 社区名称
        public string communityName { get; set; }
        /// 到件时间
        public string receiveTime { get; set; }
        /// 序号
        public string Id { get; set; }
        /// 业务代码
        public string serviceCode { get; set; }
    }
Copier après la connexion

Méthode du contrôleur externalMerchantSendMessage, qui est destinée aux appels externes

    /// 外部商户发送信息
        public ActionResult externalMerchantSendMessage(MessageContext param)
        {
            logger.Info("[externalMerchantSendMessage]param:" + param);
            bool isAuth = authModelBusiness.isAuth(param.channel, param.phone, param.sign);
            if (!isAuth)
            {
                return Json(new Result<string>()
                {
                    resultCode = ((int)ResultCode.NoPermission).ToString(),
                    resultMsg = "签名或无权限访问"
                }, JsonRequestBehavior.AllowGet);
            }
            var meaage = messageModuleBusiness.GetContent(param);

            if (string.IsNullOrEmpty(meaage))
            {
                return Json(new Result<string>()
                {
                    resultCode = ((int)ResultCode.failure).ToString(),
                    resultMsg = "发送失败"
                }, JsonRequestBehavior.AllowGet);
            }
            SMSHelper helper = new SMSHelper();
            helper.SendSMS(meaage, param.phone);
            return Json(new Result<string>()
            {
                resultCode = ((int)ResultCode.success).ToString(),
                resultMsg = "发送成功"
            }, JsonRequestBehavior.AllowGet);
        }
Copier après la connexion

Ce qui précède sont les fonctions que j'ai implémentées avant de recevoir la tâche de développement. Il semble que ma tâche soit assez simple, mais de nombreuses années d'expérience en développement me disent que cela doit être refactorisé maintenant et que je crée simplement une interface pour ajouter, supprimer, modifier et vérifier des modèles SMS. les gens de maintenance à l’avenir deviendront certainement fous.


Voyez-vous un problème ?


Cette méthode d'interface externalMerchantSendMessage est appelée pour tous les clients, et différents clients utilisent différents modèles de SMS, et différents modèles ont différents paramètres variables. Désormais, tous les paramètres variables sont encapsulés dans la classe MessageContext. Le problème est que nous ne pouvons pas déterminer tous les paramètres variables à la fois et les conserver inchangés.


Ainsi, c'est-à-dire qu'une fois que des paramètres variables doivent être ajoutés, le code de la classe MessageContext doit être modifié et le code de la méthode GetContent est difficile à modifier. codé et doit être modifié en conséquence. Cela forme un cycle, ajoutant constamment des paramètres variables, changeant constamment le code et publiant constamment des versions d'interface...


Quand j'ai assez de temps, je naturellement Si vous êtes un programmeur discipliné, puis commencez à refactoriser.


Avant le refactoring, ce qui me vient à l'esprit, ce ne sont pas divers modèles de conception, mais les principes de base de la conception orientée objet. Divers modèles de conception sont comme diverses routines ou mouvements d'arts martiaux. Les pratiquants d'arts martiaux devraient être comme Zhang Wuji pratiquant l'épée de Tai Chi, apprendre d'abord diverses routines, puis oublier toutes les routines pour les maîtriser.


Parce que les mouvements sont morts, les gens sont vivants et que chaque mouvement a ses défauts, il n'y a pas de mouvement sûr du tout, tout comme il n'y a pas de modèle de conception universel, n'importe quelle conception Tous les modèles ont des défauts.


L'idée centrale de la conception orientée objet est d'encapsuler les changements, alors trouvez d'abord les points de changement. À partir de l'analyse ci-dessus, nous avons découvert le point de changement, à savoir les paramètres variables dans le modèle SMS, et ces paramètres variables sont transmis par l'appelant du client, et les variables paramètres transmises par différents clients peuvent être différentes.


Voyons d'abord ce qui est transmis par le client ? Jetons un coup d'œil au code d'appel du client. Il existe deux méthodes d'appel : Get et Post.

function sendMsg() {
            //var appParam ="phone=15914070649&sign=78a7ce797cf757916c2c7675b6865b54&channel=weijiakeji&content=&fetchCode=1
&company=%E9%A1%BA%E4%B8%B0%E5%BF%AB%E9%80%92&expressNumbers=123456&communityName=%E9%95%BF%E5%9F%8E%E4%B8%80%E8%8A%B1%E5%9B%AD&receiveTime=5&Id=1231";
            //Get("/Message/externalMerchantSendMessage?" + appParam, {});

            var data = {
                "phone": "15914070649", "sign": "78a7ce797cf757916c2c7675b6865b54", "channel": "weijiakeji",
                "fetchCode": 1, "company": "%E9%A1%BA%E4%B8%B0%E5%BF%AB%E9%80%92", "Id": "1231"
            };
            Post(&#39;/Message/externalMerchantSendMessage&#39;, data);
        }
        //WebAPI Post方法
        function Post(url, data) {
            $.ajax({
                url: url,
                contentType: "application/json",
                type: "POST",
                dataType: "json",
                async: true,
                cache: false,
                data: JSON.stringify(data),
                success: function (response) {
                    $(&#39;#response&#39;).text(JSON.stringify(response));
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        };
        //// WebApi Get方法
        function Get(url, data) {
            $.ajax({
                url: url,
                contentType: "application/json",
                type: "GET",
                dataType: "json",
                async: true,
                cache: false,
                //data: JSON.stringify(data),
                success: function (response) {
                    $(&#39;#response&#39;).text(JSON.stringify(response));
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        };
Copier après la connexion

On peut voir que ce que le client transmet est une collection de paires clé-valeur, qui est un objet au format JSON. D'après le code précédent bool isAuth = authModelBusiness.isAuth(param.channel, param.phone, param.sign);, on peut analyser qu'il existe trois paramètres que tous les clients appelants doivent transmettre, à savoir : canal, téléphone, signe , Les autres paramètres sont les paramètres variables et les valeurs des paramètres du modèle SMS.


Ensuite, le paramètre dans la méthode externalMerchantSendMessage(MessageContext param) est un objet variable. N'existe-t-il pas une dynamique en C# 4.0 utilisée pour décrire les objets mutables ?

Ensuite, la première étape consiste à modifier le type de paramètre entrant. Il s'agissait auparavant d'un MessageContext fortement typé codé en dur. Désormais, il ne repose plus sur ce type, mais sur l'analyse dynamique. Modifiez le code de la méthode externalMerchantSendMessage comme suit. :

:

dynamic param = null;
                string json = Request.QueryString.ToString();

                if (Request.QueryString.Count != 0) //ajax get请求
                {
                    //兼容旧的客户调用写法,暂时硬编了
                    if (json.Contains("param."))
                    {
                        json = json.Replace("param.", "");
                    }
                    json = "{" + json.Replace("=", ":&#39;").Replace("&", "&#39;,") + "&#39;}";
                }
                else  //ajax Post请求
                {
                    Request.InputStream.Position = 0; //切记这里必须设置流的起始位置为0,否则无法读取到数据
                    json = new StreamReader(Request.InputStream).ReadToEnd();
                }
                var serializer = new JavaScriptSerializer();
                serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
                param = serializer.Deserialize(json, typeof(object));
Copier après la connexion

DynamicJsonConverter est utilisé pour convertir des chaînes JSON en objets Object Le code est le suivant :

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

public sealed class DynamicJsonConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            throw new ArgumentNullException("dictionary");

        return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }
    }
  #region Nested type: DynamicJsonObject

    private sealed class DynamicJsonObject : DynamicObject
    {
        private readonly IDictionary<string, object> _dictionary;

        public DynamicJsonObject(IDictionary<string, object> dictionary)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");
            _dictionary = dictionary;
        }

        public override string ToString()
        {
            var sb = new StringBuilder("{");
            ToString(sb);
            return sb.ToString();
        }

        private void ToString(StringBuilder sb)
        {
            var firstInDictionary = true;
            foreach (var pair in _dictionary)
            {
                if (!firstInDictionary)
                    sb.Append(",");
                firstInDictionary = false;
                var value = pair.Value;
                var name = pair.Key;
                if (value is string)
                {
                    sb.AppendFormat("{0}:\"{1}\"", name, value);
                }
                else if (value is IDictionary<string, object>)
                {
                    new DynamicJsonObject((IDictionary<string, object>)value).ToString(sb);
                }
                else if (value is ArrayList)
                {
                    sb.Append(name + ":[");
                    var firstInArray = true;
                    foreach (var arrayValue in (ArrayList)value)
                    {
                        if (!firstInArray)
                            sb.Append(",");
                        firstInArray = false;
                        if (arrayValue is IDictionary<string, object>)
                            new DynamicJsonObject((IDictionary<string, object>)arrayValue).ToString(sb);
                        else if (arrayValue is string)
                            sb.AppendFormat("\"{0}\"", arrayValue);
                        else
                            sb.AppendFormat("{0}", arrayValue);

                    }
                    sb.Append("]");
                }
                else
                {
                    sb.AppendFormat("{0}:{1}", name, value);
                }
            }
            sb.Append("}");
        }
Copier après la connexion

Ce qui précède est le contenu d'un. Reconstruction du code .NET (Partie 1), plus Pour le contenu associé, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre les problèmes de redondance de code dans le développement C++ Comment résoudre les problèmes de redondance de code dans le développement C++ Aug 22, 2023 pm 05:30 PM

Comment résoudre le problème de redondance de code dans le développement C++ La redondance de code signifie que lors de l'écriture d'un programme, il existe des codes similaires ou répétés à plusieurs endroits. Ce problème rend non seulement le code difficile à maintenir et à lire, mais augmente également la taille et la complexité du code. Pour les développeurs C++, il est particulièrement important de résoudre le problème de la redondance du code, car C++ est un langage de programmation puissant, mais il peut aussi facilement conduire à une duplication de code. La cause première des problèmes de redondance du code réside dans des habitudes de conception et de codage déraisonnables. Pour résoudre ce problème, vous pouvez partir des aspects suivants : Utiliser des fonctions et des classes : C

Développement PHP : utilisation de Rector pour la refactorisation et l'optimisation du code Développement PHP : utilisation de Rector pour la refactorisation et l'optimisation du code Jun 16, 2023 am 08:38 AM

À mesure que le temps passe et que les exigences changent, le code d'un projet peut facilement devenir obsolète et difficile à maintenir et à étendre. Dans le développement PHP, la refactorisation est considérée comme l'une des tâches nécessaires pour améliorer la qualité du code et l'efficacité du développement. Dans ce processus, l'utilisation de l'outil Rector peut grandement simplifier le travail de reconstruction et d'optimisation du code. Rector est un outil de reconstruction de code PHP open source qui peut aider les développeurs PHP à automatiser la reconstruction et l'optimisation du code, permettant ainsi aux développeurs de se concentrer davantage sur le développement commercial et la mise en œuvre de fonctions. passer

Quelles sont les perspectives d'emploi du C# ? Quelles sont les perspectives d'emploi du C# ? Oct 19, 2023 am 11:02 AM

Que vous soyez débutant ou professionnel expérimenté, la maîtrise du C# ouvrira la voie à votre carrière.

Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM May 06, 2024 pm 04:43 PM

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

Premiers pas avec PHP : refactorisation de code Premiers pas avec PHP : refactorisation de code May 26, 2023 pm 04:21 PM

La refactorisation est un processus très important lors de l'écriture de code PHP. À mesure qu’une application se développe, la base de code devient de plus en plus volumineuse et difficile à lire et à maintenir. La refactorisation vise à résoudre ce problème et à rendre le code plus modulaire, mieux organisé et extensible. Lorsque nous refactorisons le code, nous devons prendre en compte les aspects suivants : Style du code Le style du code est un point très important. Garder votre style de codage cohérent rendra votre code plus facile à lire et à maintenir. Veuillez suivre les normes de codage PHP et être cohérent. Essayez d'utiliser un outil de vérification de style de code tel que PHP

Développement Java : comment effectuer une refactorisation du code et une évaluation de la qualité Développement Java : comment effectuer une refactorisation du code et une évaluation de la qualité Sep 21, 2023 am 09:57 AM

Développement Java : refactorisation du code et évaluation de la qualité Introduction : Dans le processus de développement logiciel, la refactorisation du code est l'un des moyens importants pour améliorer la qualité et la maintenabilité du code. En refactorisant le code, celui-ci peut devenir plus élégant, concis et facile à comprendre et à modifier. Cependant, le refactoring ne consiste pas seulement à modifier le code, mais plutôt un processus qui nécessite une réflexion rationnelle et systématique. Cet article présentera comment effectuer une refactorisation de code et l'illustrera avec des exemples de code spécifiques. Nous discuterons également de la manière d’évaluer la qualité du code et de l’importance de l’évaluation. Code lourd

Aller à l'inférence du type de valeur de retour du langage et à la refactorisation du code Aller à l'inférence du type de valeur de retour du langage et à la refactorisation du code Apr 30, 2024 am 08:06 AM

L'inférence du type de valeur de retour du langage Go déduit automatiquement les types de valeur de retour de fonction, simplifiant ainsi le code et améliorant la lisibilité. Le type de valeur de retour peut être omis et le compilateur déduira automatiquement le type en fonction de la valeur de retour réelle dans le corps de la fonction. Peut être utilisé pour refactoriser le code existant afin d'éliminer les déclarations de type explicites. Par exemple, la fonction calculateTotal qui calcule la somme d'un tableau d'entiers peut être refactorisée en : funccalculateTotal(items[]int){}.

Comment utiliser le langage Go pour la pratique de la refactorisation de code Comment utiliser le langage Go pour la pratique de la refactorisation de code Aug 02, 2023 am 10:05 AM

Comment utiliser le langage Go pour l'introduction à la pratique de refactorisation de code : Dans le processus de développement logiciel, nous sommes souvent confrontés au défi de la refactorisation de code. La refactorisation du code fait référence à l'optimisation et à la restructuration du code existant pour améliorer la qualité et la maintenabilité du code. Cet article explique comment utiliser le langage Go pour la pratique de la refactorisation du code et est accompagné d'exemples de code correspondants. 1. Principes du refactoring de code Avant le refactoring de code, nous devons clarifier certains principes pour assurer le bon déroulement du refactoring. Voici quelques principes importants de refactorisation du code : Maintenir la cohérence des fonctionnalités du code : Après la refactorisation

See all articles