2009-11-09 150 views
2

我有以下方法,都返回不同的類型。我有四種這樣的方法。 本着良好編程實踐(DRY)的精神,應該在這裏使用一些OOP技術,例如繼承或接口,或者直接使用它。任何意見或代碼示例都是受歡迎的。謝謝。如何消除重複的代碼

static AttendeeResponse GetAttendees(HttpWebRequest request) 
    { 
     HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 

     try 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(AttendeeResponse)); 
      return (AttendeeResponse)ser.Deserialize(resp.GetResponseStream()); 
     } 
     catch(Exception e) 
     { 
      error = e.InnerException.ToString(); 
      return null; 
     } 

    } 

    static MemberResponse GetMembers(HttpWebRequest request) 
    { 
     HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 

     try 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(MemberResponse)); 
      return (MemberResponse)ser.Deserialize(resp.GetResponseStream()); 
     } 
     catch (Exception e) 
     { 
      error = e.InnerException.ToString(); 
      return null; 
     } 

    } 

回答

13

如何:

// TODO: Improve the name :) 
static T FetchItem<T>(HttpWebRequest request) 
{ 
    using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) 
    { 
     try 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(T)); 
      return (T) ser.Deserialize(resp.GetResponseStream()); 
     } 
     catch (Exception e) 
     { 
      error = e.InnerException.ToString(); 
      return default(T); 
     } 
    } 
} 

請注意,我已經包含了using statment避免你泄露的連接。根據文檔,您也不需要關閉流。

return null必須更改爲return default(T)以防T是不可爲空的值類型;另一種方法是將T限制爲參考類型,使用where T : class作爲方法聲明的一部分。

使用方法如下:

MemberResponse members = FetchItem<MemberResponse>(request); 
... 
AttendeeResponse attendee = FetchItem<AttendeeResponse>(request); 
0

你可以使用泛型:

static T GetMembers<T>(HttpWebRequest request) 
{ 
    HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 

    try 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(T)); 
     return (T)ser.Deserialize(resp.GetResponseStream()); 
    } 
    catch (Exception e) 
    { 
     error = e.InnerException.ToString(); 
     return null; 
    } 

} 
1

使用泛型?

static T GetResponse<T>(HttpWebRequest request) 
{ 
    HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 

    try 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(T)); 
     return (T)ser.Deserialize(resp.GetResponseStream()); 
    } 
    catch(Exception e) 
    { 
     error = e.InnerException.ToString(); 
     return null; 
    } 

} 
0

它看起來很適合仿製藥。也許..?

static E GetPiece<E>(HttpWebRequest request) { 
{ 
    ... 
} 
-1
MemberResponse membResp = (MemberResponse)StaticClassName.SerializeIt(request); 

static Object SerializeIt(HttpWebRequest request) 
    { 
     HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 

     try 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(MemberResponse)); 
      return (Object)ser.Deserialize(resp.GetResponseStream()); 
     } 
     catch (Exception e) 
     { 
      error = e.InnerException.ToString(); 
      return null; 
     } 

    } 
+1

這是將要使用的typeof(MemberResponse)甚至當獲取AttendeeResponse ... – 2009-11-10 00:01:20

-1

可以消除代表重複的代碼。 例如: 如果我要完成對數據庫中的兩個任務:

OleDbCommand oci = new OleDbCommand(queryString, connection); 
oci.Connection.Open(); 
oci.CommandText = "delete * from firstTable"; 
oci.ExecuteNonQuery(); 
oci.Connection.Close(); 

OleDbCommand ocn = new OleDbCommand(queryString, connection); 
ocn.Connection.Open(); 
ocn.CommandText = "select count(*) from secondTable"; 
int affected = convert.ToInt32(ocn.ExecuteScalar(); 
ocn.Connection.Close(); 

,你可以看到我們在這裏重複的代碼。所以,我需要重構像這樣我的代碼:

OleDbCommand myAccessCommand = null; 
int count = -1; 
OleDbWork(secondConnectionString, "SELECT COUNT(*) FROM secondTable", 
out myAccessCommand, 
() => 
{ 
    count = Convert.ToInt32(myAccessCommand.ExecuteScalar()); 

}); 

OleDbWork(firstConnectionString, "delete * from firstTable", 
out myAccessCommand, 
() => 
{ 
    myAccessCommand.ExecuteNonQuery(); 
} 

和我OleDbWork方法是這樣的:

internal bool OleDbWork(string connString, string command, 
out OleDbCommand myAccessCommand, Action action) 
    { 
     OleDbConnection myAccessConn = null; 
     myAccessCommand = null; 
     try 
     { 
      myAccessConn = new OleDbConnection(connString); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Cannot connect to database!"); 

      return false; 
     } 

     try 
     { 

      myAccessCommand = new OleDbCommand(command, myAccessConn); 

      myAccessConn.Open(); 

      action(); 
      return true; 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Cannot retrieve data from database. \n{0}", 
      ex.Message); 

      return false; 
     } 
     finally 
     { 
      myAccessConn.Close(); 
     } 
    } 

我希望這將有助於

+0

這不會特別與此問題中描述的情況相關。 – Servy 2014-04-02 16:43:15