在我的代码中,我与Google日历API建立了联系。首先我进行身份验证,然后我请求包含我需要的所有数据的列表。现在我有一个问题,因为我需要以三种不同的方式提出要求。见下文:
PrivateExtendedProperty = new string[] { "UserId=" + userId },
PrivateExtendedProperty = new string[] { "ClassroomId=" + classroomId },
PrivateExtendedProperty = new string[] { "ClassroomId=" + classroomId , "UserId=" + userId },
我在下面的函数中使用这些。但我不想复制此功能三次,只更改参数和私有属性。重构这个并解决重复问题的最佳方法是什么。
整个功能:
public List<Meeting> GetMeetings(DateTime minTime, DateTime maxTime, string userId, int classroomId)
{
CalendarService service = AuthenticateAccount(CalendarId);
EventsResource.ListRequest request = new EventsResource.ListRequest(service, CalendarId)
{
TimeMin = timeMin,
TimeMax = timeMax,
TimeZone = "Europe/Amsterdam",
PrivateExtendedProperty = new string[] { "ClassroomId=" + classroomId , "UserId=" + userId },
};
Events events = request.Execute();
foreach (var item in eventList)
{
....
}
}
答案 0 :(得分:4)
有了这么多参数,这就变成了代码味道。
将参数重构为自己的类(SRP - 单一责任原则)
public class MeetingOptions {
public DateTime minTime { get; set; }
public DateTime maxTime { get; set; }
public string userId { get; set; }
public int? classroomId { get; set; }
}
扩展属性的构建可以被提取到它自己的方法/关注中
string[] buildExtendedProperty(MeetingOptions options) {
var extendedProperty = new List<String>();
if (options.userId != null)
extendedProperty.Add("UserId=" + options.userId);
if (options.classroomId.HasValue)
extendedProperty.Add("classroomId=" + options.classroomId);
return extendedProperty.ToArray();
}
注意:此处有可能将其重构为自己的服务,但这超出了当前问题的范围。
重构方法以使用新类作为参数(显式依赖性原则)
public List<Meeting> GetMeetings(MeetingOptions options) {
CalendarService service = AuthenticateAccount(CalendarId);
string[] extendedProperty = buildExtendedProperty(options);
EventsResource.ListRequest request = new EventsResource.ListRequest(service, CalendarId) {
TimeMin = options.timeMin,
TimeMax = options.timeMax,
TimeZone = "Europe/Amsterdam",
PrivateExtendedProperty = extendedProperty,
};
Events events = request.Execute();
foreach (var item in eventList) {
//....
}
}
然后可以调用该函数,并填充必要的属性以遵循DRY原则。
答案 1 :(得分:3)
只需使classroomId
为空即可,并添加一些逻辑,以便仅使用调用者提供的参数发送请求。
public List<Meeting> GetMeetings(DateTime minTime, DateTime maxTime,
string userId = null, int? classroomId = null)
{
CalendarService service = AuthenticateAccount(CalendarId);
var extProp = new List<String>();
if (userId != null) {
extProp.Add("UserId=" + userId);
}
if (classroomId.HasValue) {
extProp.Add("classroomId=" + classroomId);
}
// Optional: Throw exception if extProp is empty
EventsResource.ListRequest request = new EventsResource.ListRequest(service, CalendarId)
{
TimeMin = timeMin,
TimeMax = timeMax,
TimeZone = "Europe/Amsterdam",
PrivateExtendedProperty = extProp.ToArray()
};
如果我希望随着时间推移添加新参数,或者我想维护“最喜欢”或“最近”搜索列表,我会使用Nkosi的方法。我会使用基类创建一些半聪明的东西,它会创建具有TimeMin,TimeMax等的东西,并且会创建具有适当ListRequest
值的PrivateExtendedProperty
个实例。
答案 2 :(得分:0)
您应该在函数声明中使用可选参数,并动态生成要在“PrivateExtendedProperty”中发送的字符串数组。
查看C# Optional Parameters个文档以供参考。
答案 3 :(得分:0)
文档说
&#34;此参数可能会重复多次以返回事件 匹配所有给定的约束&#34;
在同一个函数中重复三次......它的类型为Google.Apis.Util.Repeatable