1

我正在编写一个创建 Hammock REstRequest 对象扩展的过程,并且想知道哪种实现(非常相似)会被认为是更好的编程实践。这是对象定义,它有 2 个构造函数

public class RequestObject : RestRequest
{    
    public RequestObject()
    {
        this.Encoding = System.Text.Encoding.UTF8;
        System.Net.ServicePointManager.Expect100Continue = false;
    }

    public RequestObject(WebMethod webMethod, byte[] ContentArray)
        : this()
    {
        if (webMethod == Hammock.Web.WebMethod.Put
            || webMethod == Hammock.Web.WebMethod.Post)
        {
            //encode payload string to a utf8 byte array
            this.AddPostContent(ContentArray);
            this.AddHeader("Content-Type", "application/json");
        }
    }
}

对于对象的构造,我有两种方法可以做到,内联实例化它,如下:

string payload = serializer.Serialize(user);

RequestObject request
    = new RequestObject(WebMethod.Put, BuildAPI.GetBytes(payload))
      {
          Credentials = new BasicAuthCredentials
          {
              Username = ConfigurationManager.AppSettings["UserName"],
              Password = ConfigurationManager.AppSettings["Password"]
          },
          UserAgent = ConfigurationManager.AppSettings["UserAgent"],
      };

或者调用“构建类”的成员来构造对象:

public static RequestObject BuildRequest(WebMethod method, byte[] byteArray)
{
    RequestObject request = new RequestObject(WebMethod.Put, byteArray)
    {
        Credentials = new BasicAuthCredentials
        {
            Username = ConfigurationManager.AppSettings["UserName"],
            Password = ConfigurationManager.AppSettings["Password"]
        },
        UserAgent = ConfigurationManager.AppSettings["UserAgent"],
        Method = method
    };

    return request;
}

并按如下方式调用它:

RequestObject request = BuildAPI.BuildRequest(WebMethod.Put, payload);

我只是想知道这两个选项中的哪一个被认为是更好的编程实践。我正在阅读 SOLID,现在我对同一类中的多个“功能”感到紧张,但不想过度思考。

4

1 回答 1

1

在SOLID原则之前开始,您的代码非常不连贯。你有一些静态BuildAPI- 所以要么决定坚持它,要么不使用它。因为它是静态的,所以这个决定应该基于您是否怀疑将来这些构造需要是多态的。

第二个注意事项:你真的需要两个构造函数吗?好像只用了一个。

第三个注意事项:您在构造函数中初始化了一些属性,并且使用属性初始化器初始化了一些属性 - 为什么不只坚持一个范例(POD 对象或类)?

最后,至于 SOLID 原则 - 您RequestObject显然违反了单一职责原则,这一点从事实中可以看出,您将 an 传递enum给构造函数。所以这个类实际上代表了几个可以组合在一起的类。考虑进行RequestObject抽象,并为每个请求类型实现一个单独的子类。

像这样的东西:

abstract class RequestObject
{
    //properties and methods common to all requests

    protected RequestObject(...)
    {
        //initialize common properties
    }
}

class GetRequest : RequestObject
{
    public GetRequest()
    {
        this.Encoding = System.Text.Encoding.UTF8;
        System.Net.ServicePointManager.Expect100Continue = false;
    }

    //... other specific things for GET
}

class PutRequest : RequestObject
{
    public PutRequest()
    {
        this.AddPostContent(ContentArray);
        this.AddHeader("Content-Type", "application/json");
    }

    //... specific things for PUT
}

......你明白了。可能您还可以在RequestObjectand之间设置另一个级别PostPut因为它们也可能共享一些行为。

于 2013-10-11T13:56:42.757 回答