Лучшая организация класса для моего проекта на C #

1

Я пытаюсь лучше организовать свои функции и классы. В настоящее время у меня есть следующие первичные классы (Примечание: все эти классы обладают множеством свойств и функций, но для разъяснения я их всех смываю):

internal class Class0{ } 

internal class Class1: Class0 { }

internal class Class2: Class1 
{ 
    List<Class1> mainDataStructure; 
}

Я вполне согласен с организацией вышеупомянутых классов, но моя главная забота - следующие классы.

public class Class3: Class2
{
    InsertClass anInstance = new InsertClass();

    public void Insert(Item item)
    {
        anInstance.mainDataStructure = mainDataStructure;
        anInstance.Insert(item);
    }
}

internal class InsertClass
{
    List<Class1> mainDataStructure;

    internal void Insert(Item item)
    {
        // adds item to mainDataStructure.

        // some clean-ups using following function
        // how to clean-up ? User will define it.
        CleanUp();
    }

    // a function that use should implement
    // define it as:
    internal abstract string CleanUp();
    // or as:
    internal Func<string> CleanUp();
}

Как вы заметили, моя проблема возникает, когда я пытаюсь определить некоторые классы (например, Class4), которые управляют моей mainDataStructure. То, что я могу сделать (как я здесь сделал), - передать mainDataStructure классам, которые будут ими управлять. Хотя это работает, но для меня это не кажется элегантным. Мне интересно, есть ли какая-либо возможность лучше организовать мои Class4 Class3 и Class4.

Кроме того, классы, которые управляют mainDataStructure (например, Class4), имеют некоторые функции, которые должны определяться конечным пользователем... которые я полностью застрял там! Если я определяю функцию как abstract пользователь должен наследовать класс и определять abstract функцию в дочернем классе, или если я определяю их с помощью делегатов Func<> пользователь должен передать определение функции. Основной проблемой этих решений является уровень доступности класса! Мне очень нравится получать только Class3 как общедоступный. Таким образом, наследование может быть и речи, и делегат, должен быть путь в новой организации передать определение функции в Class4 изнутри Class3.

Я ценю любую помощь для этой проектной организации.

Объяснение класса
Этот проект представляет собой проект поиска информации. mainDataStructure сохраняет информацию. Class3 - это удобный пользовательский интерфейс. Пользователь начинает взаимодействие, получая экземпляр этого класса; и делает все в этом случае (например, добавляет новую информацию, результаты поиска, статистику и т.д.). Class4 добавляет новую информацию в mainDataStructure. Class5 извлекает какое-то сходство между хранимой информацией. Class6 получает некоторую статистику mainDataStructure (например, правостороннюю вероятность) и так далее.

Пример: добавить новый элемент информации Используйте экземпляр Class3 и вызвать public void Add(Item item). Этот метод затем будет использовать экземпляр класса Class4 и его internal void Add(Item item) метод internal void Add(Item item) чтобы позаботиться обо всех процессах ввода новых элементов. См. Измененный код

  • 0
    Ваш пример кода не помогает мне понять вашу проблему, я не совсем понимаю, что вы пытаетесь достичь. Вы не передаете структуру данных, насколько я вижу. Кажется, вы устанавливаете свойство, а затем вызываете функцию, которая что-то делает? Попробуйте прочитать о внедрении зависимостей, инверсии управляющих и чистых функций / разделении концерна.
  • 0
    Я думаю, это немного открыто для мнения, но ваш вопрос не слишком ясен. На ум приходят две вещи: интерфейсы вместо абстракции и некоторая инъекция зависимостей, так что вы можете передавать то, что хотите, в классы.
Показать ещё 2 комментария
Теги:
class
code-organization

1 ответ

1
Лучший ответ

Я предлагаю фабрику в сочетании с, например, Стратегией.

public interface MainDataStructureManipulations {
   // define all needed functions here.
}

public abstract class Class3 {
    static Class3 getInstanceWith(MainDataStructureManipulations strategy) {
        return new Class4(strategy);
    }

    private Class3() {}
}

internal class Class4 : Class3 {
    MainDataStructureManipulations strategy;
    public Class4(MainDataStructureManipulations strategy) {
        this.strategy = strategy;
    }
}

Возможно, вам даже не понадобится дополнительный Class4 если все ваши требования к стратегии покрываются MainDataStructureManipulations.


Фабрика - это метод, который создает для вас экземпляр объекта. Самое замечательное в том, что вам не нужно точно знать, какой класс этот экземпляр, если он реализует базовый класс, указанный на заводе. В этом случае вы не должны выставлять Class4, и пользователь библиотеки никогда не увидит его, но может взаимодействовать с экземпляром точно так же, как с любым экземпляром класса, который является производным от Class3.

Стратегия инкапсулирует функциональность с помощью простых методов. Я выбрал его, потому что он, по-видимому, хорошо подходил к вашему описанию, но я мог ошибаться. Стратегия просто содержит методы взаимодействия, если вы хотите сохранить состояние, возможно, более подходящим будет другой шаблон. Если вы сообщите нам, что вы на самом деле пытаетесь сделать, мы можем дать более подробные советы.

  • 0
    Ваше предложение кажется интересным; однако, мне это не так ясно, может быть, потому что я не знаком с Фабрикой и Стратегией. Не могли бы вы уточнить, пожалуйста?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню