用泛型减少重复代码,使代码更合理、更优雅

有这样一个场景,需要对接接口,以获取取得数据。

例如获取订单列表

接口请求参数(json格式):

 1 {
 2   //公共头部
 3   "head":{
 4     "method":"getOrders",       //接口方法
 5     "sign":"xxxx"               //签名
 6   },
 7   //私有主体
 8   "body":{
 9     "userId":"1",               //用户ID
10     "numPerPage":10,           //页大小
11     "pageIdx":1             //页码
12   }
13 }

接口响应结果(json格式):

 1 {
 2   "head":{
 3     "code":1,      //状态码
 4     "errMsg":"成功"  //消息
 5   },
 6   "body":{
 7     "pageCount":value,
 8     "pageIdx":value,
 9     "orders":[
10       {
11         "orderNo":value,
12         "orderPrice":value,
13         "orderTime":value,
14       }
15     ]
16     "status":value,
17     "orderStatus":value
18     省略...
19   }
20 }

  通过观察请求参数和响应结果,会发现有部分字段是公共的,并且与接口交互的方法,大部分都是相同的,这里也可以提取封装,将不稳定容易出错的代码集中到一个地方;而如果对每个接口方法都进行一遍对接,重复的代码会不少,也很容易出错(对copy代码,吃过相当多的亏),所以对重复代码进行适当的封装,减少不必要的冗余,让代码结构更简单明了。

首先是提取公共的请求实体容器BaseWhere<T>:

 1 /// <summary>
 2 /// 公共头部
 3 /// <para>
 4 /// 用于与接口通讯,发送请求数据的容器
 5 /// 数据访问层使用
 6 /// </para>
 7 /// </summary>
 8 /// <typeparam name="T"></typeparam>
 9 public class BaseWhere<T> where T : new()
10 {
11     private headBaseWhere _head = new headBaseWhere();
12
13     /// <summary>
14     /// 公共头部
15     /// </summary>
16     public headBaseWhere head { get; set; }
17
18     private T _body = new T();
19
20     /// <summary>
21     /// 私有主体
22     /// </summary>
23     public T body { get; set; }
24 }
25
26 public class headBaseWhere
27 {
28     /// <summary>
29     /// 接口方法
30     /// </summary>
31     public String method { get; set; }
32
33     /// <summary>
34     /// 签名
35     /// </summary>
36     public String sign { get; set; }
37 }

接下来是提取公共的响应实体容器BaseResult<T>:

 1 /// <summary>
 2 /// 返回报文报文头参数
 3 /// <para>
 4 /// 用于与接口通讯,接收返回数据的容器
 5 /// 数据访问层使用
 6 /// </para>
 7 /// </summary>
 8 /// <typeparam name="T"></typeparam>
 9 public class BaseResult<T> where T : new()
10 {
11     private headBaseResult _head = new headBaseResult();
12     /// <summary>
13     /// 公共头部
14     /// </summary>
15     public headBaseResult head { get; set; }
16
17     private T _body = new T();
18     /// <summary>
19     /// 私有主体
20     /// </summary>
21     public T body { get; set; }
22 }
23
24 public class headBaseResult
25 {
26         /// <summary>
27     /// 状态码
28     /// </summary>
29     public String code { get; set; }
30
31         /// <summary>
32     /// 消息
33     /// </summary>
34     public String msg { get; set; }
35 }

然后定义订单列表的请求实体OrdersPara和响应实体OrdersResult:

 1 /// <summary>
 2 /// 订单列表(请求实体)
 3 /// </summary>
 4 public class OrdersPara
 5 {
 6     public string userId { get; set; }
 7
 8     public int numPerPage { get; set; }
 9
10     public int pageIdx { get; set; }
11 }
12
13 /// <summary>
14 /// 订单列表(响应实体)
15 /// </summary>
16 public class OrdersResult
17 {
18     private IList<Order> _orders = new List<Order>();
19
20     public int pageCount { get; set; }
21     public int pageIdx { get; set; }
22     public IList<Order> orders { get { return _orders; } set { _orders = value; } }
23 }
24
25 public class Order
26 {
27     private IList<OrderDetail> _detail = new List<OrderDetail>();
28
29     public string orderNo { get; set; }
30     public decimal orderPrice { get; set; }
31     public string orderTime { get; set; }
32     public int status { get; set; }
33     public int orderStatus { get; set; }
34     public int activityID { get; set; }
35     public string mobileNo { get; set; }
36 }

公共的请求方法WebAPIHelper<T>.POST(obj):

 1 public static class WebAPIHelper<T> where T : new()
 2 {
 3     public static BaseResult<T> Post(Object postData)
 4     {
 5         StringBuilder strResult = new StringBuilder();
 6
 7         //创建HttpWebRequest请求
 8         HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Settings.APIURL);
 9         request.Method = "POST";
10         request.ContentType = "application/x-www-form-urlencoded";
11         //根据接口的要求序列化请求参数
12         String strParams = JsonConvert.SerializeObject(postData);
13         UTF8Encoding encoding = new UTF8Encoding();
14         request.ContentLength = encoding.GetByteCount(strParams);
15         request.Credentials = CredentialCache.DefaultCredentials;
16
17         try
18         {
19             //创建字节流
20             using (Stream reqStream = request.GetRequestStream())
21             {
22                 reqStream.Write(encoding.GetBytes(strParams), 0, encoding.GetByteCount(strParams));
23             }
24             //获取回传信息
25             using (WebResponse response = request.GetResponse())
26             {
27                 Stream streamResult = response.GetResponseStream();
28                 using (StreamReader reader = new StreamReader(streamResult))
29                 {
30                     strResult.Append(reader.ReadToEnd());
31                 }
32             }
33         }
34         catch (Exception ex)
35         {
36         }
37
38         BaseResult<T> result = new BaseResult<T>();
39         try
40         {
41             result = JsonConvert.DeserializeObject<BaseResult<T>>(strResult.ToString());
42         }
43         catch (Exception ex)
44         {
45         }
46
47         if (result == null)
48         {
49             result = new BaseResult<T>();
50         }
51
52         if(result.body == null)
53         {
54             result.body = new T();
55         }
56
57         return result;
58     }
59 }

调用示例:

public QueryOrdersResult Get(QueryOrdersPara para)
{
    BaseWhere<OrdersPara> where = new BaseWhere<OrdersPara>();
    where.head.method = "qryOrders";
    where.body.userId = para.userId;
    where.body.pageIdx = para.pageIdx;
    where.body.numPerPage = para.numPerPage;

    BaseResult<OrdersResult> result = WebAPIHelper<OrdersResult>.Post(where);
    return result.body;
}

这样完成了重复部分代码的封装提取,还可以更进一步在WebAPIHelper<T>.POST(obj)方法里面,添加统一异常处理,如接口服务器异常、超时之类的。

如有不当之处,请大家多多指教。

时间: 2024-10-11 12:23:20

用泛型减少重复代码,使代码更合理、更优雅的相关文章

利用泛型减少重复,实现简易AOP

利用泛型减少重复,实现简易AOP 一.设计原则之DRY,不要重复自己    在所有设计原则中,DRP(Don't Repeat Yourself)是最基础的原则之一.是由 Andy Hunt 和 Dave Thomas 在 The Pragmatic Programmer 中总结出来的, 成为软件开发和设计的最佳实践基础.开发者认识到,通过好的实践和适当的抽象可以减少重复,使程序的代码变得简洁. 重复是一种浪费.程序中的每一行代码都需要维护,重复就会导致出现bug的机会增多,也增加了系统的复杂度

如何有效的减少重复的代码

重复的代码一直都是可维护性的大敌,重构的重要任务之一也就是要去除掉重复的代码,有效的减少重复代码,可以大大提高软件的扩展性. 在Android开发中,很容易产生重复的代码.因为Android是组件,模板式开发,每个页面都是独立用Activity或Fragment实现,布局文件都是用XML方式去写,所以很容易造成代码的重复,虽然二个页长的差不多,但毕竟是二个Activity,于是就拷一份出来,改吧改吧就成了. 那么我们如何做才能去掉重复的代码呢? 点击阅读全文

guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code-with-guava-optionals-and-preconditions/,有说的不对的地方,欢迎斧正. 2,我开发软件的时候,朝着干净代码发展是我的特权,有一段时间,我曾在我几乎所有的项目中使用谷歌瓜娃(Google Guava),理由很简单,guava为我编写漂亮代码提供了很大的便利,今天,我想向你展示下我是怎么使用预判断来避免不必要的if/throw 申明,使用

Delphi中使代码简洁的 5 条忠告(转)

写代码是一种艺术.使用Delphi,任何人都可以轻而易举地开发出某种软件.完成某些任务.而完美的代码则只有真正的高手才能写出.除了正确的缩进.大小写.命名规则之外,请时刻牢记爱因斯坦的名言--简单就是美.下面将谈及的五个代码问题,可能是初学者.甚至一些老鸟都会犯的错误. 忠告一 布尔型变量的赋值操作应该是直接的.例如,在一个if/then/else语句中,if子句将布尔型变量赋值为True,而else子句将其赋为False.下面这段代码的写法是不好的: if If_Love_Delphi the

防止表单重复提交的代码

防止表单重复提交的代码:有时候可能因为各种原因出现表单重复提交现象,单丝这往往并不是我们想要的结果,下面就介绍一种防止表单重复提交的代码,希望能够给大家带来或多或少的帮助,代码如下: $(document).ready(function() { $('form').submit(function() { if(typeof jQuery.data(this, "disabledOnSubmit") == 'undefined') { jQuery.data(this, "di

C#查找列表中所有重复出现元素代码

C#查找列表中所有重复出现元素代码 public T[] GetDuplicates(T inputValue) {   List<T> duplicates = new List<T>( );   for (int i = 0; i < this.Count; i++)   {     if (this[i].Equals(inputValue))     {       duplicates.Add(this[i]);     }   }//codego.net   re

用基类接品,泛型抽象类,抽象方法实现代码复用

1.定义一个基类接口 ? 1 2 3 4 5 6 7 8 9 10 public interface IBaseEntity { /// <summary> 最后操作人编码 </summary> string LastOperatorCode { get; set; } /// <summary> 最后操作人 </summary> string LastOperator { get; set; } /// <summary> 最后操作时间 <

怎样使代码在main函数前执行,怎样使代码在main函数之后执行

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 网上有说可以用 __attribute__ ((constructor)) 来让函数在main函数之前执行, __attribute__ ((destructor)) 来让函数在main函数之后执行. 比如说像下面这样声明函数 void before(void) __attribute__ ((constructor)); void after(void) __attribute__ ((

如何利用CSS代码使图片和文字在同一行显示且对齐

对于初学css的新手朋友来说,经常会遇到这样一个问题,当文字和图片出现在同一行或者同一个div里面的时候,在浏览器中运行出来的显示效果往往是在不同的行,那么,我们怎么才能利用CSS代码使图片和文字在同一行显示且对齐呢? 对于这种现象,方法有3种: 1.通过添加css的“vertical-align:middle;”: 2.如果图片是背景图片,可以在css中设置背景图片,然后设置文字的padding属性: 3.把文字和图片分别放入不同的div中. 经过多次的测试,上面三种方法都可以让图片和文字在同