Объекты переменной длины: Когда-нибудь хорошая идея?

Триггеры имеют свое использование - вход/аудит и поддержание "последней измененной" даты являются двумя очень хорошим использованием, которое было упомянуто в предыдущих ответах.

Однако один из базовых принципов хорошего дизайна - то, что бизнес-логика/независимо от того, что правил/бизнеса, которую Вы хотите назвать им, должна быть сконцентрирована в единственном месте. При помещении части логики в базе данных (через триггеры или сохраненный procs) и некоторые в приложении нарушают тот принцип. Дублирование логики в обоих местах еще хуже, поскольку они неизменно выйдут из синхронизации друг с другом.

существует также "принцип наименьшего количества удивления" проблема, которая была уже упомянута.

8
задан Mr Fooz 13 April 2018 в 09:50
поделиться

7 ответов

C ++ дает вам другой вариант. Вам следует рассмотреть возможность использования std :: vector.

class Panda
{
    int a;
    int b;
    std::vector<Bamboo> bamboo;
    // if you do not want to store by value:
    //std::vector< shared_ptr<Bamboo> > bamboo;

    Panda (int count, Bamboo* bamb) : bamboo( bamb, bamb+count ) {}
}

Если вы хотите хранить Panda и Bamboos в непрерывной памяти, вы можете использовать решение из этой статьи . Основная идея состоит в том, чтобы перегрузить оператор new и оператор delete .

11
ответ дан 3 November 2019 в 13:09
поделиться

Как нам убедить людей, что в программировании простота и ясность - короче говоря: то, что математики называют «элегантностью», - это не лишняя роскошь, а решающий вопрос, который делает выбор между успехом и неудачей ?

- Эдсгер В. Дейкстра

7
ответ дан 3 November 2019 в 13:09
поделиться

Вы будете укушены, если кто-то возьмет Панду по значению, например,

//compiler allocates 16-bytes on the stack for this local variable
Panda panda = *createPanda(15, bamboo);

Это может быть приемлемо (но очень вероятно, что это преждевременная и ужасная оптимизация), если вы только когда-нибудь обратитесь к вещи по указателю, а не по значению, и если вы остерегаетесь конструктора копирования и оператора присваивания.

5
ответ дан 3 November 2019 в 13:09
поделиться

Исходя из моего опыта, преждевременная оптимизация чаще всего является «преждевременной». То есть вы должны профилировать свой код и определять, есть ли необходимость в оптимизации, или вы просто создаете в долгосрочной перспективе больше работы для себя.

Кроме того, мне кажется, что вопросы о том, стоит ли оптимизация того или нет, во многом зависят от размера класса Bamboo и среднего количества объектов Bamboo на Panda .

3
ответ дан 3 November 2019 в 13:09
поделиться

Это было найдено в C.
Но в C ++ в этом нет реальной необходимости.

Настоящий вопрос в том, почему вы хотите это сделать?

Это преждевременная оптимизация, просто используйте std :: vector <> внутри, и все ваши проблемы исчезнут.

Поскольку вы используете внутри RAW-указатель, которым владеет класс, вам нужно будет переопределить версии по умолчанию :

  • Конструктор по умолчанию
  • Деструктор
  • Конструктор копирования
  • Оператор присваивания
3
ответ дан 3 November 2019 в 13:09
поделиться

Вы используете "новый" вид оператора new. Это полностью правильный родственник Panda, но почему бы вам не использовать инициализатор Bamboo?

1
ответ дан 3 November 2019 в 13:09
поделиться

Если вы в таком отчаянии, вы, вероятно, можете сделать что-то вроде этого:

template<std::size_t N>
class Panda_with_bamboo : public Panda_without_bamboo
{
    int a;
    int b;
    Bamboo bamboo[N];
}

Но я считаю, что вы не в отчаянии, но оптимизируете преждевременно.

3
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: