241
Общий раздел / Re:Тезис про Oberon, C, CP и ObjC.
« : Март 15, 2011, 08:21:04 pm »
Насколько я помню, без включённых особо доп. проверок ничего. Приводился пример с переполнением в цикле FOR и байтовым счётчиком.
Онлайн компилятор Oberon-07/11
Путеводитель по Оберон-проектам.
Логи jabber-конференции.
Онлайн исходники BlackBox: тут:WeBB и на github
Исходники Project Oberon V4 на github.
Сборник решений задач книги "Современное программирование с нуля!" тут. А обсуждение здесь.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
Но подумав, я понимаю, что никогда не сталкивался с ошибкой, которую это бы предотвратило.Предполагалось, что повысится читаемость, ясность и исключится возможно путать аргументы. В php не путать параметры без справки просто нереально, но он не типизированный.
procedure WriteChar
(
x: int; Math.InRange(x, 0, WndWidth - 1);
y: int; Math.InRange(y, 0, WndHeight - 1);
col: str; ANY;
)
Смысл: координаты должны быть в рамках окна, а строка цвета - любой.WriteChar(x: 3; y: 4; col: 'black');
! Исключение: если переменная/константа имеет то же имя, что и параметр, то может указываться просто имя параметра:procedure WriteChar
(
x: ...
y: ...
optional Col: string; ANY; (* охрана типа осуществляется только, если аргумент инициализирован *)
)
{
...
if !IsSet(Col)
{
Col := Console.Col;
}
}
IsSet - проверяет, установлен ли аргумент. Прямое присваивание значения аргументу автоматически устанавливает его.function Random
(
Min: int = 0; Min >= 0; (* охрана сработает всегда *)
Max: int = 99; Max >= Min; (* охрана сработает всегда *)
): int;
VAR
AbsX: int = x + Con.Window.x1; AbsX in [0; Con.Width - 1];
-) Записи-константы и записи, создаваемые на лету.coords := (x: MyX, y); (* Заметьте, "y" не указывается два раза, та как имя переменной совпадает с именем поля в записи *)
-) Опциональные поля записей.Cell = record
optional Opacity: float = 1.0; (* прозрачность ячейки *)
end;
-) Обязательное присвоение значений полям записи.TCoord = record
x: int = -1;
y: int = -1;
end;
-) Соглашения.convention (Con: TConsole) UsesRelativeCoords ()
(
x: int;
y: int;
)
{
result := Math.InRange(x, Con.WndWidth - 1) and Math.InRange(y, Con.WndHeight - 1);
}
procedure WriteChar
(
x: int; ANY;
y: int; ANY;
Ch: char; ANY;
); UsesRelativeCoords;
{
...
}
Те аргументы, которые указанны в соглашении, обзяаны быть и в подпрограммах, использующих эти соглашения.[17.1] What are some ways try / catch / throw can improve software quality?Отрицательный результат - тоже результат. И хотя нас часто порывает принять за данность выполнение программы в идеальном окружении с идеальным пользователем, а всю логику обработки ошибок закинуть как можно выше, это не выход. Пора уже понять, что практически все функции не способны гарантировать результат. Что исключения одного класса обезличиваются при всплывании, превращаясь в нечто вроде TIOError. Что если мы хотим обработать 250 вызовов функций по-разному, нам понадобятся 250 обработчиков и их логика должна быть на том же уровне, что и вызов функций.
FAQ: You'll have less if statements in your code: you won't have to check for errors each time you call a function. Conditional statements are known to contain more bugs than other statements. With less if tests, you'll ship a better product, faster.
FQA: This is cargo cult programming. Conditional statements are error-prone because they are used to handle complicated scenarios, where an action can result in many different outcomes, which affect the next actions. In order to make errors less probable, one has to simplify the model of the desired behavior of the software. The problem is the complexity that leads to if statements, not the if keyword, and using different keywords is not going to solve the problem by itself.
Exceptions are supposed to simplify the error handling model based on the assumption that in most cases, a function that detected an error can't handle it, and has to propagate it to the caller. Finally, a "high-level" enough caller is reached and actually makes a decision (pops up an error message, tries a different action, etc.).
Despite its promises, this approach has inherent problems. There's a "social" problem - with exceptions, people are not aware of the different errors that may happen in the code because most of the code doesn't deal with errors. And when people rarely think about a particular aspect of an application, ultimately this aspect is unlikely to be handled well. There's a more "technical" problem - functions essentially doing nothing upon error except for propagating errors to the caller still can't be completely unaware of errors. That's because they may need to release the resources they acquired before returning to the caller, which may lead to more errors, which must also be handled. Finally, in practice exception support has run-time overhead, and very significant code size overhead, even if exceptions are never raised at run time, and even if they are not mentioned in your code. C++ devotees may claim otherwise; you can check by compiling your code with and without exception support (if your compiler doesn't have such a flag, compile code as C and as C++ instead). This is unacceptable in resource-constrained systems.
Вообще хотелось бы конечно что-то совсем своё-заточеное сделать (т.е. движок форума), но оно будет уж слишком страшным для неискушенного пользователя. Потому как я лично оформительствовать не умею.Я тоже не дизайнер, но ношу идею своего движка. Когда-нибудь. Потом смотрю на объём исходного кода, шаблонов и ресурсов у современных движков и возвращаюсь к реальности.
свой пост - это вроде не нарушение приватности жеСвои посты всегда можно. Да и чужие вроде как в public domain по факту публикации на открытом форуме.