Qraizer

Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору cosmosliva Цитата: создаем объект - один раз програмируем что он сразу заноситься и/или добавляется в соответствующий список | Это хорошо, что закрались. Значит проектирование неосознанно, но тем не менее тобою учитывается. Многие не достаточно ещё опытные программисты считают, что главное - это рабочий код, а его архитектура - дело вторичное. Mickey_from_nsk правильно говорит. От конструктора требуется создать работоспособный объект. Не более, чем. Всё остальное не его задача. Когда создаётся объект, изначально его сторадж заполнен мусором (исключая глобальные объекты, но это частность и наследие C). Поэтому никакие методы ручные методы не смогут абсолютно достоверно определить, был ли этот объект инициализирован. И только конструкторы, которые вызываются автоматически, гарантируют, что объект был инициализирован. И именно поэтому конструкторы никогда не имеют права не выполнить свою задачу. Единстенный способ сообщить о неуспехе - исключение, в результате которого несконструированным объектом невозможно будет воспользоваться. Возлагать бОльшие задачи на конструктор, как и позволить конструктору недоконструировать объект, будет серьёзной ошибкой проектирования. Экономить на количестве действий можно, но это часто чревато. Один из главных принципов "безопасного" пограммирования "каждый метод и каждая функция должны решать ровно одну задачу". Тогда при невозможности выполнить эту свою задачу можно будет без проблем откатить все изменения перед возвратом управления. В твоём случае объединить два действия в одно можно, если предположить, что создаваемый объект не живёт сам по себе, а находится под во владении у списка. Тогда имеет смысл просто предусмотреть метод у списка, который будет сам создавать объект и в случае успеха включать себе в коллекцию. К примеру: Код: class List; class Node { Node* next; Node* prev; Node(int, float, const char*); friend class List; /* ... */ public: /* ... */ }; class List { Node* head; Node* tail; /* ... */ public: bool newItem(Node* here, int i, float f, const char* str) { Node* tmp(i, f, str); tmp->prev = here; tmp->next = here->next; here->next = tmp; tmp->next->prev = tmp; } }; | При неуспехе конструирования tmp исключение не даст выполнить связь несконструированного объекта с коллекцией. Если же он будет успешно создан, то манипуляции с указателями, которые точно не могут вызвать исключения, гарантируют, что объект не будет "потерян" без ссылок на него, а коллекция не окажется в неопределённом состоянии из-за не до конца выполненной связи с коллекцией. Т.е. наблюдаем "или всё, или ничего" - строгая гарантия безопасности.
---------- Одни с годами умнеют, другие становятся старше. |
| Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 14:30 11-09-2007 | Исправлено: Qraizer, 14:52 11-09-2007 |
|