重复功能

时间:2018-05-14 18:11:13

标签: c#

在我的代码中,我与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)
    {
        ....
    }
}

4 个答案:

答案 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)

文档说

https://developers.google.com/resources/api-libraries/documentation/calendar/v3/csharp/latest/classGoogle_1_1Apis_1_1Calendar_1_1v3_1_1EventsResource_1_1ListRequest.html#a2d1fe67042944d5f7bd0cf2d3bcaac88

  

&#34;此参数可能会重复多次以返回事件   匹配所有给定的约束&#34;

在同一个函数中重复三次......它的类型为Google.Apis.Util.Repeatable