Триггеры имеют свое использование - вход/аудит и поддержание "последней измененной" даты являются двумя очень хорошим использованием, которое было упомянуто в предыдущих ответах.
Однако один из базовых принципов хорошего дизайна - то, что бизнес-логика/независимо от того, что правил/бизнеса, которую Вы хотите назвать им, должна быть сконцентрирована в единственном месте. При помещении части логики в базе данных (через триггеры или сохраненный procs) и некоторые в приложении нарушают тот принцип. Дублирование логики в обоих местах еще хуже, поскольку они неизменно выйдут из синхронизации друг с другом.
существует также "принцип наименьшего количества удивления" проблема, которая была уже упомянута.
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
.
Как нам убедить людей, что в программировании простота и ясность - короче говоря: то, что математики называют «элегантностью», - это не лишняя роскошь, а решающий вопрос, который делает выбор между успехом и неудачей ?
- Эдсгер В. Дейкстра
Вы будете укушены, если кто-то возьмет Панду по значению, например,
//compiler allocates 16-bytes on the stack for this local variable
Panda panda = *createPanda(15, bamboo);
Это может быть приемлемо (но очень вероятно, что это преждевременная и ужасная оптимизация), если вы только когда-нибудь обратитесь к вещи по указателю, а не по значению, и если вы остерегаетесь конструктора копирования и оператора присваивания.
Исходя из моего опыта, преждевременная оптимизация чаще всего является «преждевременной». То есть вы должны профилировать свой код и определять, есть ли необходимость в оптимизации, или вы просто создаете в долгосрочной перспективе больше работы для себя.
Кроме того, мне кажется, что вопросы о том, стоит ли оптимизация того или нет, во многом зависят от размера класса Bamboo и среднего количества объектов Bamboo на Panda .
Это было найдено в C.
Но в C ++ в этом нет реальной необходимости.
Настоящий вопрос в том, почему вы хотите это сделать?
Это преждевременная оптимизация, просто используйте std :: vector <> внутри, и все ваши проблемы исчезнут.
Поскольку вы используете внутри RAW-указатель, которым владеет класс, вам нужно будет переопределить версии по умолчанию :
Вы используете "новый" вид оператора new. Это полностью правильный родственник Panda, но почему бы вам не использовать инициализатор Bamboo?
Если вы в таком отчаянии, вы, вероятно, можете сделать что-то вроде этого:
template<std::size_t N>
class Panda_with_bamboo : public Panda_without_bamboo
{
int a;
int b;
Bamboo bamboo[N];
}
Но я считаю, что вы не в отчаянии, но оптимизируете преждевременно.