Init to NULL
[править], так как есть правильное обсуждение, я немного изменил порядок опций, чтобы подчеркнуть рекомендуемый вариант.
Переменные должны быть объявлены как локальные и как можно позже , а инициализироваться немедленно .Таким образом, наиболее распространенный шаблон:
Order * order1 = order(...);
непосредственно перед тем, как требуется order1
.
Если есть какая-либо причина отделить объявление order1
от экземпляра, например:
Order * order1; // Oh no! not initialized!
// ... some code
order1 = order(...);
order1
следует инициализировать в NULL, чтобы предотвратить общие ошибки, возникающие с неинициализированными переменными, которые легко вводятся при // some code changes
.
Заводской метод
Опять же, здесь есть еще некоторая устойчивость к изменениям: требования к созданию Order
могут измениться.Есть два сценария, которые я могу придумать сразу же:
(1) Проверка, которую не может выполнить конструктор Ордена.Order
может поступать из сторонней библиотеки и не может быть изменен, либо для экземпляра необходимо добавить проверку, которая не входит в область действия Order
:
Order* order(Customer* customer, Product* product)
{
// Order can't validate these, since it doesn't "know" the database
database.ValidateCustomer(customer); // throws on error
database.ValidateProduct(product); // throws on error
return new Order(customer, product);
}
(2) Вам может понадобитьсяпорядок, который ведет себя по-разному.
class DemoOrder : public Order { ... }
Order* order(Customer* customer, Product* product)
{
if (demoMode)
return new DemoOrder(customer, product); // doesn't write to web service
else
return new Order(customer, product);
}
Тем не менее, я бы не стал делать это в общих чертах вслепую.