zoukankan      html  css  js  c++  java
  • 面向对象的方式进行数据交换网络之间的差异

    面向对象的方式进行数据交换网络之间的差异


    传统的发展C/S依然是B/S应用程序将通过几个步骤
    1.编写服务器端实体类的定义,通常还需要映射到数据库
    2.写一个自定义的消息类
    3.写一个定义client实体类,一般服务类比终端实体client多,然也能够和服务端公用.
    4.编写应用逻辑
    5.赋值返回数据到消息类,然后进行返回


    这里来解说一种简单的模式进行优化和解放这些繁琐的体力活.


    假设共用实体类,那么依旧要4个步骤.
    基于消息类和逻辑的相应方法,一般有多少个请求定义,就有多少个消息类.
    一般开发者会对一些消息进行精简和合并,类似的结果共用,这样能降低一些定义过程.


    面对消息定义,我们巴不得能把这个对象丢过去,这样后期改动就无所谓添加一个字段,或者降低一个字段.
    可能会影响数个接口进行改动.
    字段多,会添加流量,以及冗余数据.
    字段少,基本上一个接口相应一个消息.


    用一个简单的演示样例程序来进行解说:

    定义一个实体类

       /// <summary>
        /// 实现属性通知接口
        /// </summary>
        public class GameInfo : INotifyPropertyChanged
        {
            private string _Name;
    
            public string Name
            {
                get { return _Name; }
                set { _Name = value; }
            }
    
            private int _Count;
    
            public int Count
            {
                get { return _Count; }
                set { _Count = value; }
            }
    
            private bool _isOpen;
    
            public bool IsOpen
            {
                get { return _isOpen; }
                set { _isOpen = value; }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected void OnPropertyChanged(string propertyName, object value)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    传统模式改动分别相应改动1个属性,2个属性和3和属性

            //传统模式
    
            [WebMethod]
            public ChangeNameResult ChangeNameAI(string name)
            {
                GameInfo.Name = name;
                return new ChangeNameResult() {NewName = GameInfo.Name};
            }
    
            [WebMethod]
            public ChangeNameAndCountResult ChangeNameAndCountI(string name)
            {
                GameInfo.Name = name;
                GameInfo.Count++;
                return new ChangeNameAndCountResult() { NewName = GameInfo.Name, Count = GameInfo.Count };
            }
    
            [WebMethod]
            public ChangeALLResult ChangeALL(string name)
            {
                GameInfo.Name = name;
                GameInfo.Count++;
                GameInfo.IsOpen = !GameInfo.IsOpen
                return new ChangeALLResult() { NewName = GameInfo.Name, Count = GameInfo.Count,IsOpen = GameInfo.IsOpen};
            }
    

    相应的返回数据类型:


        /// <summary>
        /// 返回对象
        /// </summary>
        [Serializable]
        public class ResultObject
        {
            /// <summary>
            /// 假设有错误ErrorCode不为0
            /// </summary>
            public int ErrorCode { get; set; }
    
        }
    
    
    
        /// <summary>
        /// ChangeName 返回值
        /// </summary>
        [Serializable]
        public class ChangeNameResult : ResultObject
        {
            /// <summary>
            /// 新名称
            /// </summary>
            public string NewName { get; set; }
        }
    
    
        [Serializable]
        public class ChangeNameAndCountResult : ChangeNameResult
        {
            public int Count { get; set; }
        }
    
        [Serializable]
        public class ChangeALLResult : ChangeNameResult
        {
            public  bool IsOpen { get; set; }
        }

    假设偷懒,能够直接用最多的这个,可是看着会非常不舒服,也不太好.


    以下是差异改动模式演示样例:

     /// <summary>
        /// 通用返回
        /// </summary>
        [Serializable]
        public class ValueChangeResultObject : ResultObject
        {
            /// <summary>
            /// 统一返回值
            /// </summary>
            public string ResultStr { get; set; }
        }
    
        /// <summary>
        /// 返回对象
        /// </summary>
        [Serializable]
        public class ResultObject
        {
            /// <summary>
            /// 假设有错误ErrorCode不为0
            /// </summary>
            public int ErrorCode { get; set; }
    
        }
    

    演示样例逻辑方法:

           //差异数据返回模式
            private string ChangeValues = "";
            [WebMethod]
            public string ChangeNameAndCountI(string name)
            {
                GameInfo.Name = name;
                GameInfo.Count++;
                return GetResult();
            }
    
            [WebMethod]
            public ValueChangeResultObject ChangeNameAII(string name)
            {
                GameInfo.Name = name;
                return GetResult();
            }
    
            [WebMethod]
            public ChangeALLResult ChangeALL(string name)
            {
                GameInfo.Name = name;
                GameInfo.Count++;
                GameInfo.IsOpen = !GameInfo.IsOpen
                return GetResult();
            }
    
    
    
            /// <summary>
            /// 获取通用返回方法
            /// </summary>
            /// <returns></returns>
            public ValueChangeResultObject GetResult()
            {
                return new ValueChangeResultObject() { ResultStr = ChangeValues };
            }
    
    
            [WebMethod]
            public string InitChangeObject()
            {
                GameInfo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(GameInfo_PropertyChanged);
            }
    
    
            private void GameInfo_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
            {
                //这边自定一个比較简单的返回结构
                //字段1:值1;
                //字段1:值1;字段2:值2;
                ChangeValues += e.PropertyName + ":" + typeof (GameInfo).GetProperty(e.PropertyName).GetValue() + ";"
                    
            }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    爬虫时http错误提示
    json.dumps()和json.loads()
    scrapy框架原理学习
    利用tushare进行对兴业银行股价的爬取,并使用numpy进行分析
    随机生成60位同学成绩,并求他们的平均数,中位数,众数等
    numpy中random的使用
    matplotlib中subplot的使用
    使用matplotlib画饼图
    乔坟,乔坟!
    c#控件的动画显示效果
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4737845.html
Copyright © 2011-2022 走看看