В вашем коде действительно есть место для оптимизации (как и следовало ожидать, когда вы увидите такое количество повторяющегося кода).Это может быть сделано даже при относительно небольших усилиях.
Давайте начнем с низко висящих фруктов: поскольку CollectionViewSource.GetDefaultView
принимает параметр типа object
, вы можете заменить свой код инициализации ...
ICollectionView ParentTable = CollectionViewSource.GetDefaultView(Table);
ParentTable.SortDescriptions.Clear();
ParentTable.SortDescriptions
.Add(new System.ComponentModel.SortDescription("Name", direction));
... при вызове этого метода:
private static void ConfigureSorting(object entity, ListSortDirection direction)
{
ICollectionView view = CollectionViewSource.GetDefaultView(entity);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("Name", direction));
}
Что бы сделать ваш код инициализации более чистым и избежать проблем с обслуживанием повторяющихся частей вашего кода:
public static void OrderTreeSetup(ObservableCollection<tblProject> table,
ListSortDirection direction)
{
ConfigureSorting(table, direction);
foreach (tblProject project in table)
{
ConfigureSorting(project.tblLines, direction);
foreach (tblLine line in project.tblLines)
{
//...etc...
}
}
}
Это, однако, не конец строки.Поскольку вы можете применять интерфейсы к вашим сгенерированным (в случае базы данных или модели в первую очередь) или самописным (в случае кода вначале) объектам POCO, вы можете создать интерфейс, который позволит рекурсивную конфигурацию ваших объектов:
interface ICascadingSetup
{
IEnumerable<object> Children { get; }
}
Вы можете применить этот интерфейс ко всем POCO, у которых есть дочерние элементы, которые разрешают настройку (это будет все за исключением TblSubSubDevice
):
partial class TblProject : ICascadingSetup
{
IEnumerable<object> ICascadingSetup.Children => tblLines;
}
//...etc...
Теперь вы можете ввестирекурсивный метод, который будет выполнять инициализацию:
public static void OrderTreeSetup(ObservableCollection<tblProject> table,
ListSortDirection direction)
{
ConfigureSortingRecursive(table, direction);
//...all further initializations you need to do...
}
private static void ConfigureSortingRecursive(IEnumerable<object> entities,
ListSortDirection direction)
{
ICollectionView view = CollectionViewSource.GetDefaultView(entities);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("Name", direction));
foreach (object entity in entities) {
if (entity is ICascadingSetup cascadingSetup) {
ConfigureSortingRecursive(cascadingSetup.Children, direction);
}
}
}
Всякий раз, когда у вас есть это древовидное представление похожих объектов, всегда стоит проверить, является ли рекурсия опцией, упрощающей вещи.