我该如何重构这段代码
本文关键字:代码 段代码 何重构 重构 | 更新日期: 2023-09-27 18:28:24
我有以下代码,分散在整个应用程序中。我真的很想把它作为样板,放在一个静态类或一些实用程序类集中,这样我就不会有这些重复了。
然而,函数的小部分是独一无二的,以至于我不知道如何重构它
private void callResponseCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response;
// End the get response operation
response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
string responseData = streamReader.ReadToEnd();
streamResponse.Close();
streamReader.Close();
response.Close();
ExpectedResponseType regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpectedResponseType>(responseData);
if (regResponse.ok == "0")
{
//error - handle the msg
//whether the user not loggin or not exist
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show(CustomErrorMessage);
});
}
else
{
//check the variables unique to the ExpectedResponseType and do Stuff here;
}
}
catch (WebException e)
{
// Error treatment
// ...
Debug.WriteLine("error " + e);
}
我最好奇的是如何传入"ExpectedResponseType",使其可以是任何类(即,有没有一种方法可以传入T?),或者可能如何激发事件,然后由UI线程执行并进行适当处理。
谢谢。
edit:"ExpectedResponseType"或"T"是每种类型的服务器调用的大型类集合。例如,我有LoginResponse、RegisterResponse、GetFilesResponse、UpdateResponse、DownloadResponse等。
EDIT:我删除了前面的示例,因为它不适用于委托签名。
为了处理特定于类型T的参数的检查,您需要添加一点抽象,最干净的方法可能是将代码封装在一个模板化的类中,该类允许注册用于处理检查的委托。我相信这是一个特定的模式,但记不起是哪种模式:
public class ResponseHandler<T>
{
public ResponseHandler(Action<T> typeSpecificCheckFunction)
{
this.CheckVariables = typeSpecificCheckFunction;
}
Action<T> CheckVariables;
public void callResponseCallback(IAsyncResult asynchronousResult)
{
// stuff
T regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseData);
CheckVariables(response);
// stuff
}
}
在回答你关于处理大量T的问题时,也许上面清理过的代码会将其清除,如果没有,那么这就是泛型的作用——前提是你知道在每种情况下你期望的是什么。因此,对于你期望的每种类型,你都会称之为
var handler = new ResponseHandler<ExpectedResponseType>( response =>
{
// code to check your response properties here
});
xxx.RegisterResponseCallback(handler.callResponseCallback);