Информация об изменениях

Сообщение Re[9]: Почему программисты прошлого были умнее от 13.01.2026 4:10

Изменено 13.01.2026 4:16 Sinclair

Re[9]: Почему программисты прошлого были умнее
Здравствуйте, vdimas, Вы писали:

V>На практике этот паттерн хорошо работает лишь в случае отсутствия полей у объекта, т.е. когда есть только виртуальные ф-ии и им можно приписать некое "нулевое" поведение либо выбрасывание исключений (одно время широко использовали этот паттерн в реальных разработках, потом отказались).

V>Потому что на практике в программе, допустим, будет связанный список объектов некоего типа, и если использовать как конец списка ссылку на "нулевой" объект, то при непроверке на null (в чём суть ошибки, которую пытаемся лечить) будет обращение к полям этого null-объекта с чтением фигни, т.е. ошибка маскируется и себя никак не проявляет. Или проявляет себя намного позже, вдали от места и времени возникновения — это самый неприятный случай.

V>В общем, такие костыли обычно ведут к еще худшим ошибкам, т.е. требующим гораздо больше усилий на обнаружение самого факта ошибки и затем на её локализацию.


record IntegerList(integer Value; reference(IntegerList, Null) Next);
record Null();

Чтобы делать current := Next(current) нужно, чтобы а) current имел тип reference(IntegerList, Null), и б) чтобы была выполнена проверка if(current is IntegerList).
Re[9]: Почему программисты прошлого были умнее
Здравствуйте, vdimas, Вы писали:

V>На практике этот паттерн хорошо работает лишь в случае отсутствия полей у объекта, т.е. когда есть только виртуальные ф-ии и им можно приписать некое "нулевое" поведение либо выбрасывание исключений (одно время широко использовали этот паттерн в реальных разработках, потом отказались).

V>Потому что на практике в программе, допустим, будет связанный список объектов некоего типа, и если использовать как конец списка ссылку на "нулевой" объект, то при непроверке на null (в чём суть ошибки, которую пытаемся лечить) будет обращение к полям этого null-объекта с чтением фигни, т.е. ошибка маскируется и себя никак не проявляет. Или проявляет себя намного позже, вдали от места и времени возникновения — это самый неприятный случай.

V>В общем, такие костыли обычно ведут к еще худшим ошибкам, т.е. требующим гораздо больше усилий на обнаружение самого факта ошибки и затем на её локализацию.


record IntegerList(integer Value; reference(IntegerList, Null) Next);
record Null();

Чтобы делать current := Next(current) нужно, чтобы а) current имел тип reference(IntegerList, Null), и б) чтобы была выполнена проверка if(current is IntegerList).