我该如何重构这段代码

本文关键字:代码 段代码 何重构 重构 | 更新日期: 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);