История изменений
Исправление den73, (текущая версия) :
Но всё-таки. Как по твоему, решить задачу просто и изящно?
Я бы тоже не отказался узнать мнение того оратора, который ныл.
Пункт 1. Есть атрибут переменной const, есть где-то, скажем, mutable. А надо добавить спец. атрибут «обязательно прочитать после каждой записи», который выдаст ошибку компиляции при нарушении этого правила.
Также, каждая ф-я, возвращающая код ошибки, должна для этого получать параметр по ссылке (или по имени). Т.е., прикладной программист будет вынужден завести переменную, в которую будет записан код возврата, и передавать её. Разработчик библиотеки должен сделать параметр с атрибутом «прочитать после записи». Компилятор может проверять соответствие типа.
Тогда, если прикладной программист забудет обработать код возврата, ему об этом скажет компилятор - так же, как в Расте.
Пункт 2. Null хорош тем, что он всё же даёт аппаратно отлавливаемое исключение «ошибка защиты памяти», можно считать аналогом паники. Т.е., в С любой указатель - это на самом деле «дармовой» тип Option и все об этом знают.
Пункт 3. Вместо типа «возврат либо код ошибки», который в Расте надо каждый раз дополнительно определять или обрабатывать, в С имеем просто две переменные «возврат» и «код ошибки», которые между собой никак не связаны. А значит, их пару, уникальную для данного вызова или для данной функции API, не нужно рассматривать и обрабатывать как нечто единое - достаточно просто написать код, который с ними работает. Думаю, что это проще.
Как-то так.
Пп 2 и 3 направлены на объяснение, почему в Расте сложнее, чем в С. А п 1 - это предложение, как сделать так же просто как в С и при этом так же надёжно, как в Расте.
Исправление den73, :
Но всё-таки. Как по твоему, решить задачу просто и изящно?
Я бы тоже не отказался узнать мнение того оратора, который ныл.
Пункт 1. Есть атрибут переменной const, есть где-то, скажем, mutable. А надо добавить спец. атрибут «обязательно прочитать после каждой записи», который выдаст ошибку компиляции при нарушении этого правила.
Также, каждая ф-я, возвращающая код ошибки, должна для этого получать параметр по ссылке (или по имени). Т.е., прикладной программист будет вынужден завести переменную, в которую будет записан код возврата, и передавать её. Разработчик библиотеки должен сделать параметр с атрибутом «прочитать после записи». Компилятор может проверять соответствие типа.
Тогда, если прикладной программист забудет обработать код возврата, ему об этом скажет компилятор - так же, как в Расте.
Пункт 2. Null хорош тем, что он всё же даёт аппаратно отлавливаемое исключение «ошибка защиты памяти», можно считать аналогом паники. Т.е., в С любой указатель - это на самом деле «дармовой» тип Option и все об этом знают.
Пункт 3. Вместо типа «возврат либо код ошибки», который в Расте надо каждый раз дополнительно определять или обрабатывать, в С имеем просто две переменные «возврат» и «код ошибки», которые между собой никак не связаны. А значит, их пару, уникальную для данного вызова или для данной функции API, не нужно никак обслуживать - достаточно написать код, который с ними работает.
Как-то так.
Пп 2 и 3 направлены на объяснение, почему в Расте сложнее, чем в С. А п 1 - это предложение, как сделать так же просто как в С и при этом так же надёжно, как в Расте.
Исправление den73, :
Но всё-таки. Как по твоему, решить задачу просто и изящно?
Я бы тоже не отказался узнать мнение того оратора, который ныл.
Возможно, дело в том, что в С мухи отдельно, а котлеты отдельно. Т.е. отдельно результат (который может быть Null), а отдельно код возврата. Конечно, лучше, когда код возврата возвращается по указателю и хуже, когда нужно его извлекать отдельным вызовом.
Если код возврата возвращается через указатель, можно сделать так: Есть атрибут переменной const, есть где-то, скажем, mutable. А надо добавить спец. атрибут «обязательно прочитать после каждой записи», который выдаст ошибку компиляции при нарушении этого правила.
Также, каждая ф-я, возвращающая код ошибки, должна для этого получать параметр по ссылке (или по имени). Т.е., прикладной программист будет вынужден завести переменную, в которую будет записан код возврата, и передавать её. Разработчик библиотеки должен сделать параметр с атрибутом «прочитать после записи». Компилятор может проверять соответствие типа.
Тогда, если прикладной программист забудет обработать код возврата, ему об этом скажет компилятор - так же, как в Расте.
Null хорош тем, что он всё же даёт аппаратно отлавливаемое исключение «ошибка защиты памяти», можно считать аналогом паники. Т.е., в С любой указатель - это на самом деле «дармовой» тип Option и все об этом знают.
А вместо типа «возврат либо код ошибки», который в Расте надо каждый раз дополнительно определять или обрабатывать, в С имеем просто две переменные «возврат» и «код ошибки», которые между собой никак не связаны. А значит, их пару, уникальную для данного вызова или для данной функции API, не нужно никак обслуживать - достаточно написать код, который с ними работает.
Как-то так.
Из трёх моих пунктов два последний направлены на объяснение, почему в расте сложнее, чем в С. А первый - это предложение, как сделать так же просто как в С и при этом так же надёжно, как в Расте.
Исходная версия den73, :
Но всё-таки. Как по твоему, решить задачу просто и изящно?
Я бы тоже не отказался узнать мнение того оратора, который ныл.
Возможно, дело в том, что в С мухи отдельно, а котлеты отдельно. Т.е. отдельно результат (который может быть Null), а отдельно код возврата. Конечно, лучше, когда код возврата возвращается по указателю и хуже, когда нужно его извлекать отдельным вызовом.
Если код возврата возвращается через указатель, можно сделать так: Есть атрибут переменной const, есть где-то, скажем, mutable. А надо добавить спец. атрибут «обязательно прочитать после каждой записи», который выдаст ошибку компиляции при нарушении этого правила.
Также, каждая ф-я, возвращающая код ошибки, должна для этого получать параметр по ссылке (или по имени). Т.е., прикладной программист будет вынужден завести переменную, в которую будет записан код возврата, и передавать её. Разработчик библиотеки должен сделать параметр с атрибутом «прочитать после записи». Компилятор может проверять соответствие типа.
Тогда, если прикладной программист забудет обработать код возврата, ему об этом скажет компилятор - так же, как в Расте.
Null хорош тем, что он всё же даёт аппаратно отлавливаемое исключение «ошибка защиты памяти», можно считать аналогом паники. Т.е., в С любой указатель - это на самом деле «дармовой» тип Option и все об этом знают.
А вместо типа «возврат либо код ошибки», который в Расте надо каждый раз дополнительно определять или обрабатывать, в С имеем просто две переменные «возврат» и «код ошибки», которые между собой никак не связаны. А значит, их пару, уникальную для данного вызова или для данной функции API, не нужно никак обслуживать - достаточно написать код, который с ними работает.
Как-то так.