我寫了一個按引數過濾串列的方法,效果很好。但我擔心違反“開閉原則”。
開閉原則指出“軟體物體(類、模塊、函式等)應該對擴展開放,對修改關閉”
目前,如果我想再添加一個過濾器,我需要修改 Params類和Filter方法。
我想問如何將這些物體重構為可擴展的?或者這是一個愚蠢的問題,我不需要在這里重構任何東西?我會很感激對此的任何想法。
過濾方式:
public IEnumerable<Meeting> Filter(Params params)
{
IEnumerable<Meeting> selectedMeetings = new List<Meeting>(_dataContext.Meetings);
if (request.Description is not null)
selectedMeetings = selectedMeetings.GetByDescription(request.Description);
if (request.Name is not null)
selectedMeetings = selectedMeetings.GetByResponsiblePerson(request.Name);
if (request.Category is not null)
selectedMeetings = selectedMeetings.GetByCategory(request.Category);
if (request.Type is not null)
selectedMeetings = selectedMeetings.GetByType(request.Type);
if (request.StartDate is not null)
selectedMeetings = selectedMeetings.GetByStartDate(request.StartDate);
if (request.EndDate is not null)
selectedMeetings = selectedMeetings.GetByEndDate(request.EndDate);
if (request.AttendeeCount is not null)
selectedMeetings = selectedMeetings.GetByAttendeesCount(request.AttendeeCount);
return selectedMeetings;
}
引數類:
public class Params
{
public string? Description { get; set; }
public string? Name { get; set; }
public string? Category { get; set; }
public string? Type { get; set; }
public string? StartDate { get; set; }
public string? EndDate { get; set; }
public string? AttendeeCount { get; set; }
}
uj5u.com熱心網友回復:
如果您希望過濾邏輯可擴展,您可以為過濾條件創建一個基類:
public abstract class FilterCriteria
{
IEnumerable<Meetings> Filter(IEnumerable<Meetings> meetings, string input);
}
對于每個條件,您將創建一個派生自 的類FilterCriteria,例如:
public class DescriptionFilterCriteria : FilterCriteria
{
public override IEnumerable<Meetings> Filter(IEnumerable<Meetings> meetings, string input)
{
return meetings.GetByDescription(input);
}
}
您的Filter方法將接收過濾器串列而不是Params實體并對其進行回圈:
public List<Meetings> Filter(IEnumerable<FilterCriteria> criteria)
{
IEnumerable<Meetings> selectedMeetings = new List<Meetings>(_dataContext.Meetings);
foreach (var crit in criteria)
selectedMeetings = crit.Filter(selectedMeetings, input);
return selectedMeetings;
}
如果您需要創建另一個過濾條件,您可以從FilterCriteria;派生一個新類。您不必再更改Params全域Filter方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476110.html
