Как построить объекты из похожих шаблонных классов
Моя цель заключается в следующем.
Я работаю с белками в условиях анализа данных. Данные, доступные для любого данного белка, являются переменными. Я хочу быть в состоянии построить класс белка из более простых родительских классов. Каждый родительский класс будет определенным для уровня данных, который у меня есть.
Различные проекты могут иметь разные слои данных. Я хотел бы написать простые классы для белка, которые содержат все переменные и методы, связанные с конкретным слоем данных. И затем, для любого данного проекта, будет возможность скомпилировать специфический для проекта класс белка, который наследуется от соответствующих классов белка, специфичных для уровня данных.
Кроме того, для каждого класса белка, специфичного для уровня данных, требуется аналогичный класс цепи, уровень остатка и класс атома. Они все строительные блоки. Атомы используются для создания остатков, которые используются для построения цепей, которые используются для создания белка. Класс белка должен иметь доступ ко всем его атомам, остаткам и цепям. Точно так же цепочки нуждаются в доступе к остатку и атомам.
Я использовал векторы и карты для хранения указателей на соответствующие объекты. Существуют также соответствующие методы get и set. Чтобы дать КАЖДУЮ версию переменных белка и методов получения и установки, я создал 1 шаблонный класс для атома, остатка, цепи и белка. Этот шаблонный класс содержит векторы и методы получения и установки, которые предоставляют белку доступ к его цепям, остаткам и атомам. Этот шаблонный класс затем наследуется каждым классом белка определенного уровня данных.
Это лучший подход?
2 ответа
Возможно, вы захотите взглянуть на Composite Design Pattern для организации ваших многоуровневых данных и на Visitor Design Pattern для написания алгоритмов, которые "посещают" вашу структуру данных.
Composite Design Pattern создает интерфейс Component (абстрактный базовый класс), который позволяет выполнять итерацию по всем элементам своего подслоя, добавлять / удалять элементы и т. Д. Он также должен иметь accept(some_function)
метод, позволяющий применять внешние алгоритмы к себе. Каждый конкретный слой (атом, остаток, цепь) будет тогда конкретным классом, который наследуется от интерфейса Компонента. Не позволяйте слою наследоваться от его подуровня: наследование должно отражать только отношения "есть", за исключением особых случаев.
Шаблон проектирования посетителя создает иерархию алгоритмов, которая не зависит от точной структуры ваших данных. Этот шаблон работает лучше всего, если иерархия классов ваших данных не изменится в обозримом будущем. [ПРИМЕЧАНИЕ: вы все равно можете получить любую молекулу, какую захотите, заполнив структуру вашими данными, только не меняйте количество слоев в вашей структуре].
Независимо от того, что вы делаете, всегда рекомендуется использовать наследование только для повторного использования или расширения интерфейса, а также использовать композицию для повторного использования / расширения данных. Например, контейнеры STL, такие как vector
а также map
не имеют виртуальных деструкторов и не предназначены для использования в качестве базовых классов.
Прежде всего, использование наследования является хорошим способом абстракции и должно помочь вам создавать собственные классы, легко прокладывая путь для повторного использования и обслуживания. Однако вы можете уделить время рассмотрению ваших структур данных. Использование вектора кажется наиболее естественным способом применения динамических Однако данные, изменяющие размеры векторов, имеют некоторые накладные расходы, и иногда при работе с большими данными это становится проблемой. Чтобы преодолеть это, попробуйте составить среднее количество данных, которое обычно у каждого было бы. Таким образом, вы можете иметь массив и вектор, и вы можете использовать вектор только тогда, когда закончите работу с массивом. не сталкивайтесь слишком часто. В зависимости от фактической обработки, которую вы собираетесь выполнить, вы можете переосмыслить свои структуры данных. Если, например, ваши данные достаточно малы и управляемы, вы можете просто использовать векторы и больше концентрироваться на реальном вычислении. наборы данных должны быть обработаны, вы можете немного изменить свои структуры данных, чтобы сделать обработку проще. Удачи.