В статье Apple об объектно-ориентированном программировании изображены объекты, отправляющие сообщения друг другу.Таким образом, Appliance
может отправить сообщение на Valve
, в котором говорится, что он запрашивает воду, а объект Valve
может затем отправить сообщение на Appliance
для "подачи воды".
(дляотправить сообщение на самом деле вызывает метод другого объекта)
Так что мне интересно, не вызовет ли это какой-то тонкий бесконечный цикл, который даже программист не предвидел?Например, если мы запрограммируем два объекта, каждый из которых притягивает друг друга под действием силы тяжести, то есть один посылает другому объекту, что существует сила «притяжения», и вызывается метод другого объекта, и, в свою очередь,отправляет сообщение первому объекту, и они уходят в бесконечный цикл.Таким образом, если компьютерная программа имеет только 1 процесс или 1 поток, она просто войдет в бесконечный цикл и никогда не будет запускать что-либо еще в этой программе (даже если два объекта, наконец, сталкиваются друг с другом, они все равно продолжают тянуть друг друга).Как эта парадигма программирования работает в действительности, чтобы предотвратить это?
Обновление: Это бумага Apple: http://developer.apple.com/library/mac/documentation/cocoa/conceptual/OOP_ObjC/OOP_ObjC.pdf
Обновление: длявсе люди, которые просто смотрят на этот очевидный пример и говорят: «Вы ошибаетесь! Программы должны быть конечными, бла-бла-бла», ну, я стремлюсь к тому, что, если есть сотни или тысячи объектов, и они посылают каждыйдругие сообщения, и при получении сообщения они, в свою очередь, могут отправлять другие сообщения другим объектам.Тогда как вы можете быть уверены, что не может быть бесконечного цикла, и программа не может идти дальше.
С другой стороны, для людей, которые сказали, что "программа должна быть конечной", ну, как насчетпростая программа с графическим интерфейсом?У него есть цикл обработки событий, и это бесконечный цикл, который запускается, пока пользователь явно не попросит программу остановиться.А как насчет программы, которая продолжает искать простые числа?Он может продолжать поиск (с BigNum, например, в Ruby, так что для целого числа может быть любое количество цифр), поэтому программа просто написана, чтобы продолжить работу, и записать следующее большее простое число на жесткий диск (или записатьНа жесткий диск один раз в миллион раз он находит большее простое число - поэтому он находит 1 миллион простых чисел и записывает эту миллионную на жесткий диск, а затем продолжает искать следующий миллион простых чисел и записывает 2 миллиона на жесткий диск(напишите только 1 число, а не 1 миллион из них.) Ну, для компьютера с 12 ГБ или ОЗУ и 2 ТБ жесткого диска, может быть, вы скажете, что программе может потребоваться 20 лет, чтобы превзойти возможности компьютера, когда это сложнодиск заполнен или когда 12 ГБ ОЗУ не могут вместить все переменные (может быть, миллиард лет, что целое число не помещается в 1 ГБ ОЗУ), но что касается программы, она просто продолжает работать, если только менеджер памятине может выделить другой BigNum, или жесткий диск заполнен, что исключениевызывается, и программа принудительно останавливается, но программа написана так, чтобы работать бесконечно.Так что не все программы ДОЛЖНЫ быть написаны, чтобы быть конечными.