One of the big differences between C++ and Java or .Net Framework for example is the way you write your code. .Net Framework or Java have it's own code style, that is a part of a language and everybody who writes code must obey this code style. For example, exceptions is a must, OOP programming is a must.
C++ is more flexible and allows programmer to write code anyway he wants. If it is a low-level API, is can use function return values instead of exceptions and if you prefer to use functional programming over OOP - it's your choice. If you want you can still use macroprogramming, there is #define.
The con of this design is that still one project limit this possibilities to write code. For example, in C++ you can return errors using return codes and using exceptions, but in our low-level project we must not use exceptions. But, before committing the code, the "eye" review by the other developer must be done. You see, what is prohibited on the level of language in Java and .Net Framework is allowed in C++ but this leads to more reviewing time.
Here is example of C++ code review in our project
void Task::execute(const TaskParames& params)This code will not pass code review. The correct code is:
{
if (!Validate(params))
{
return bad_param_exception(L"Params validation not passed");
}
executeInternal(params);
}
bool Task::execute(const TaskParames& params)This is just one example of code style in one separate project can differs from code style in another project. So, every developer should spend some time understanding project coding rules. In .Net Framework it is also true, of course, but returning error by return value is prohibited somehow on the level of language, not on the level of project, so every developer (who knows .Net Framework) knopws about the rule.
{
bool ret = false;
if (Validate(params))
{
ret = executeInternal(params);
}
return ret;
}
The problem is that the example I showed you is easy and simple. But there are examples of the code where it is not so easy to say if we should allow something or deny it. For example, macroses are generally prohibited in our code (as well as in all c++), but if you are familiar with C++, there are places where it is easier (and more beautiful) to use macros instead of another solution (function, template or whatever)
6 comments:
А кто мешает в C# вместо того чтобы кидать Exception возвращать result codes? Такой подход может быть оправдан когда возвращаются некие enum'ы, а enum как известно в C# не ограничен перечисленным набором значений, а ограничен лишь размером внутренней переменной. Такой подход использует Udi Dahan в pipline его NServiceBus.
Хотя с основным утверждением, что в С++ можно писать как захочется я не спорю. Это я к тому, что писать по-разному можно везде и в C# и Java, если это оправдано какими-то причинами.
Мне кажется, что в NET в отличие от C++ базовая библиотека построена на exceptions - и поэтому если ты хотя бы где то ее используешь, ты уже не можешь использовать коды возврата.
Не построена, а более того, в стандарт CLR введено понятие об Exception как о предпочтительном способе сообщения об ошибке в ходе выполнения программного кода, но в стандарте также сказано, что в качестве Exception может выступать ЛЮБОЙ CLR-совместимый тип, хотя компиллятор C# такую фичу и не поддерживает.
И опять же, никто не мешает спроектировать мою систему таким образом, чтобы она везде использовались коды возврата, просто перехватывая все Exception'ы.
Угу, чтобы сделать это (использовать коды возврата) похоже надо обертывать каждую функцию и из
Object NetFunc(Object input);
делать
ErrorCode NetFuncWrapper(Object input, ref Object output);
+ вообще 50% смысла для чего отказываться от exception в C++ - это производительность, в случае выше она все равно теряется.
Нет, надо пользоватся языком как было задумано до дизайну, остальное изврат =)
епать ребза!!!!
а я тут дизайна ни нашел : )
ну да лана : )
Майлз дизайн это не только то что ты думаешь )
Post a Comment