我正在编写一个创建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"],
};
或者调用“Build Class”的成员来构造对象:
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,现在我很担心多个“函数”在同一个班级,但不想过度思考。
答案 0 :(得分:1)
在SOLID原则出发之前,你的代码非常不连贯。你有一些静态BuildAPI
- 所以要么决定坚持它还是不要使用它。因为它是静态的,所以这个决定应该基于你是否怀疑将来这些结构需要是多态的。
第二个注意事项:你真的需要两个构造函数吗?似乎只使用了一个。
第三个注意事项:您在构造函数中初始化了一些属性,有些属性初始化器 - 为什么不坚持一个范例(POD对象或类)?
最后,至于SOLID原则 - 您的RequestObject
明显违反了单一责任原则,这一事实可以证明,您将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
}
...你明白了。可能你也可以在RequestObject
和Post
,Put
之间建立另一个级别,因为它们也可能有一些共同的行为。