Иван Денисов писал(а):
По истории кода не может быть мнения, так как существует фактическая история изменений, где видно, что документация не была изменена следом за измененным кодом.
Как из того, что изменение не было сделано, следует, что его должны были сделать именно так, как сделали в Центре?
Берем оригинальный код.
Код:
PROCEDURE (f: File) NewWriter (old: Files.Writer): Files.Writer;
VAR w: Writer;
BEGIN (* portable *)
ASSERT(f.state # closed, 20); ASSERT(f.state # shared, 21);
...
Первое предусловие 20 прописано в оригинальной документации File.Close: "The file f and the riders operating on file f are not valid anymore after closing f, i.e., no more file or rider operations may be performed on it".
Оминки могли забыть прописать это предусловие для NewWriter аналогично: "Если файл только для чтения, то вызов NewWriter -- недопустимая операция".
Это выглядит логичнее введения Shared() и Closed(), которые, как практика Центра на примере Stores64, используются для того, чтобы генерировать тот же трап на один уровень выше, т.е. не непосредственно в реализации Files, а в клиенте:
Код:
PROCEDURE (this: Segment) NewWriter (old: Files.Writer): Files.Writer;
VAR segWr: SegmentWriter;
BEGIN
ASSERT(~this.Closed(), 20); <--- здесь
ASSERT(~this.Shared(), 21); <--- или здесь
IF (old # NIL) & (old IS SegmentWriter) THEN segWr := old(SegmentWriter) ELSE NEW(segWr) END;
IF segWr.base # this THEN
segWr.base := this;
segWr.wr := this.container.NewWriter(NIL); <<---- а не здесь
И тут я возвращаюсь к своему исходному вопросу (
viewtopic.php?p=108957#p108957). Все пользователи ББ1.7 непротиворечиво используют новые методы Shared и Closed по этой логике и перед использованием файлов ставят эти проверки в своем клиентском коде? Или их никто не ставит, рассчитывая на АВОСТ-защиту от логических ошибок непосредственно в модулях реализации файлов? Т.е. по факту доказывают избыточность Shared и Closed, поскольку других примеров применения ни у кого пока не нашлось.