2013-05-26 2 views
3

У меня вопрос о дизайне ООП.Список классов против класса списков

Предположим, что у меня есть класс, который содержит несколько числовых скалярных свойств, таких как максимум, минимум, частота и т. Д. Поскольку данные непрерывно текут, я в конечном итоге заканчиваю список таких экземпляров класса. Чтобы получить, скажем, глобальный минимум I для всех классов в списке, чтобы найти его.

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

Вопрос: Какие критерии определяют, какой подход выбрать? Если эффективность важна, следует ли выбрать один класс, содержащий списки для каждого свойства? Если читаемость является ключевой, следует ли выбрать список классов?

Спасибо за предложения.

+0

зависит от того, что вы пытаетесь спроектировать. Пожалуйста, разместите некоторый код sudo и добавьте дополнительную информацию. какие классы? что они будут содержать? как вы видите, как взаимодействуют классы и т. д. –

+0

Как пишет @Dory Zidon: это зависит от того, что вы пытаетесь выполнить. Если у вас есть некоторые требования к высокой производительности, может потребоваться разбить данные в списки, но если ясность и простота обслуживания являются приоритетом, может потребоваться сделать обратное. – mzedeler

+0

Пожалуйста, обратитесь к [FAQ относительно того, почему это плохой вопрос] (http://stackoverflow.com/faq#dontask). – msw

ответ

1

В основном вы askyng, если это предпочтительнее иметь «массив структур (AOS)» или «Структура Массивы (СОА)»

Ответ зависит от того, что вам нужно сделать с этими данными. Если вы хотите написать более читаемый код, чем перейти к массиву структур, если вы хотите использовать SSE или CUDA для оптимизации вашего сложного кода, то перейдите к структуре массивов.

Если вы будете искать в литературе термины «массив структур (AOS)» и «Структура Массивы (СОА)» вы найдете много углубленных диссертаций на эту тему, я связать только некоторые обсуждения здесь:

+0

Спасибо за этот ответ. Я уже начал читать. Я считаю, что ваш ответ решает мою проблему как можно лучше, поскольку она указывает на то, что этот вопрос широко обсуждается в литературе и что нет никакого решения да/нет. – user2423086

0

В принципе, ООП не является решением любого вопроса в программировании, иногда вы должны видеть это ниже, ниже этого. Дело в том, что вам нужно сосредоточиться на проблеме. Эффективность должна быть более предпочтительной. Но если ваш код занимает слишком много времени для загрузки, или вы можете сказать, что его временная сложность слишком высока, то снова у вас будут проблемы. Вы должны держать обе руки в руках. Что я предпочел, это список классов, а не класс списка. Но у разных людей разные точки зрения, поэтому мы должны их уважать. Почему я выбираю список классов, потому что у меня будет каждый объект с уважаемыми данными, скажем, у меня есть один объект с более высокой частотой, один с более низким, один со средним, будет легче управлять всем этим, плюс не много времени будет принято. я думаю, что в обоих случаях это будет O (n), где n - число элементов или классов в моем случае.

1

Вы просили критерии принятия решения. Позвольте мне порекомендовать один:

Вы должны подумать о том, что составляет точку данных в вашем приложении. Предположим, вы измеряете значения, а одна точка данных состоит из нескольких числовых свойств. Тогда вам обязательно понадобится список классов, где класс представляет все свойства, которые идут вместе (что я назвал «точкой данных» из-за отсутствия лучшего термина).

Если вы должны выполнить некоторую агрегацию этих «точек данных», например, найти глобальный минимум в течение более длительного периода времени, я бы предложил создать дополнительный компонент для этого.Таким образом, вы получите компонент сбора данных, который состоит в основном из «списка классов» и компонента агрегации, который может использовать разные структуры данных, но обрабатывает части вашего «списка классов» (например, часть, по которой глобальный минимум должен быть найден).

+0

Спасибо, также полезно для меня. – user2423086

0

Можно также сохранять значения и статистику в одном классе, и делать расчеты на лету при добавлении нового значения (пример в Java):

public class YourClass { 
    private List<Integer> values = new ArrayList<Integer>(); 

    private long sum = 0; 
    private int minimum = Integer.MAX_VALUE; 
    private int maximum = Integer.MIN_VALUE; 
    // add more stuff you need 

    public synchronized void add(Integer value) { 
     values.add(value); 
     sum += value; 

     if (value < minimum) { 
      minimum = value; 
     } 

     if (value > maximum) { 
      maximum = value; 
     } 
    } 

    public List<Integer> getValues() { 
     return Collections.unmodifiableList(values); 
    } 

    public long getSum() { 
     return sum; 
    } 

    public long getAvg() { 
     return values.isEmpty() ? 0 : sum/values.size(); 
    } 

    public int getMaximum() { 
     return maximum; 
    } 

    public int getMinimum() { 
     return minimum; 
    } 
} 
+0

Спасибо. Правда, свойства, упомянутые в вопросе (и, фактически, совсем некоторые), обладают математическим свойством, что они могут обновляться «на лету» с каждой новой точкой данных. Однако есть еще более привлекательные свойства, которые явно требуют всех данных. Я хотел бы сохранить код, например, включить такие свойства позже. – user2423086

0

В вашем случае, список данных

struct Statistic{ 
    int max; 
    int min; 
    std::vector<int> points; 
    int average; 
}; 

int main(){ 
    std::vector<Statistic> stats; 
    return 0; 
} 
Смежные вопросы