Skip to content

🟡 High: Refactor God Classes - CatalogueChildProvider (1,958 lines) #119

@jas88

Description

@jas88

Summary

Several classes have grown too large and violate Single Responsibility Principle. The largest offender is CatalogueChildProvider at 1,958 lines with 40+ AddChildren method overloads.

Critical God Classes

1. CatalogueChildProvider.cs - 1,958 lines

File: Rdmp.Core/Providers/CatalogueChildProvider.cs

Issues:

  • 92+ methods (including 40+ overloaded AddChildren methods)
  • Manages hierarchical relationships for ALL catalogue entities
  • Combines caching, hierarchy building, and object navigation
  • 60+ public properties for different entity types

Current Responsibilities (should be separate):

  1. Object caching (AllLoadMetadatas, AllCatalogues, AllProcessTasks, etc.)
  2. Hierarchy construction (40+ AddChildren overloads)
  3. Descendancy tracking (_childDictionary, _descendancyDictionary)
  4. Object lookup and navigation
  5. Performance optimization

2. Catalogue.cs - 1,591 lines

File: Rdmp.Core/Curation/Data/Catalogue.cs

Issues:

  • 56+ public methods
  • 70+ database-mapped properties
  • Mixes data access, business logic, validation, and presentation concerns

3. DataExportChildProvider.cs - 928 lines

File: Rdmp.Core/Providers/DataExportChildProvider.cs

Issues:

  • Inherits from CatalogueChildProvider (already a god class)
  • Duplicate pattern of parent class

4. Other Large Classes

File Lines Issues
TableRepository.cs 1,025 CRUD + caching + transactions + versioning
BasicActivateItems.cs 825 Dialog + repo + command execution
RDMPCollectionCommonFunctionality.cs 933 Icons + drag-drop + copy-paste + favorites + filtering

Recommended Refactoring

For CatalogueChildProvider:

// Extract hierarchy building
public class HierarchyBuilder<T> where T : IMapsDirectlyToDatabaseTable
{
    void BuildHierarchy(T root, IHierarchyNode<T> node);
}

// Extract caching
public class EntityCache<T> where T : IMapsDirectlyToDatabaseTable
{
    T[] GetAll();
    void Invalidate();
}

// Extract descendancy tracking
public class DescendancyTracker
{
    void Track(object parent, object child);
    IEnumerable<object> GetDescendants(object parent);
}

For Catalogue.cs:

// Extract validation
public class CatalogueValidator { }

// Extract metadata
public class CatalogueMetadata { }

// Keep entity slim
public class Catalogue : DatabaseEntity { }

Expected Impact

  • ~3,000 lines of duplicated code eliminated
  • Improved testability (smaller, focused classes)
  • Clearer responsibility boundaries
  • Easier maintenance and onboarding

Labels

refactoring, technical-debt

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions