The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Forest, средства разработки надежного ПО"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Forest, средства разработки надежного ПО"  
Сообщение от Romik email(??) on 25-Сен-06, 23:16 
Может конечно заругают, но хочу предложить использованную мною методику разработки диагностируемых и протоколируемых программ, реализованную мною на C++.

Когдато устал писать однотипные конструкции вида:

if(!proc1())
{
   delete [] array;
   MyMessage(tr("Error in proc1"));
   return;
}
if(!proc2())
{
   delete [] array;
   MyMessage(tr("Error in proc2"));
   return;
}
....

Другим вариантом является использование сложных обработчиков try catch, которые тоже быстро утомляют.

Однако мне нужно было писать программы выполняющие много проверок, с повышенной надежностью.

Я разработал ряд макросов и классов, которые позволяют решать многие однотипные задачи диагностики ошибок, вывода сообщений о них и освобождать занятые ресурсы, позволяя сконцентрироваться на написании исходного кода, в то же время, легко создавая надежные диагностируемые и протоколируемые программы.

Разработанные модули легли в основу созданной мною и успешно используемой библиотеки классов Forest, в настоящее время полноценно работающих на компиляторах борланд с использованием VCL или CLX (среду вибирал не я). Я хотел переписать библиотеку под Qt + MinGW, но пока не сделал полноценную адаптацию.

Я опубликовал часть своей работы на форуме http://lanserver.org.ru/forum/index.php?showtopic=219

Я бы хотел чтобы мой труд не пропал даром, может быть для когото будет интересен использованный мною подход.

Также прошу совета, где можно опубликовать свои исходники и методологию и полноценно обсудить ее.

Если тема для когото представляет интерес могу описать что-то более подробно или придумать практического примеры использования

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Forest, средства разработки надежного ПО"  
Сообщение от DeadMustdie email(??) on 26-Сен-06, 09:34 
"Ругать" незачем, однако IMHO немножко не в том направлении копаете.
Освобождение ресурсов лучше всего цеплять на деструкторы классов-защелок.
При таком подходе не нужны ни множественные однотипные куски кода в if'ах,
ни "сложные" обработчики исключений.

Защелки же есть и готовые (std::auto_ptr<>, boost::shared_ptr<>),
при необходимости и свою написать недолго.

Нечто типа

template <typename X>
class ArrayGuard
{
public:
  ArrayGuard(X* arr)
    : arr_(arr)
  {}
  ~ArrayGuard()
  {
    delete[] arr_;
  }

private:
  X* arr_;
};

...

ArrayGuard<int> myArray(new int[100]);
...

И никаких обработчиков, никаких лишних delete'ов не потребуется.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Forest, средства разработки надежного ПО"  
Сообщение от Romik email(??) on 26-Сен-06, 17:38 
Однако это решает тока проблему освобождения ресурса.
Это не защищает от исключительных ситуаций, это не выводит месаг в протокол.

Условный пример проги:

#include <Forest.h>

FStatus Calculate(float& a, float b, float c)
{
  fcn_constructor:
    treat_fcn;

  fcn_implement:

    do_protect    
      a = b * sqrt(c);
    on_error_exit("Ошибка!")

  fcn_destructor:
    
    return fcn_status;
}

void MyClass::OnButtonClick(TObject* Sender)
{
  fcn_constructor:

    int a,b,c;
  
  fcn_implement:

    do_protect
      b = StrToFloat(Edit1->Text);
      c = StrToFloat(Edit2->Text);
    on_error_exit("Ошибка синтаксиса задания исходных данных!")

    fcn_check(b < 0 || b > 10, "Значение a должно быть от 0 до 10!");
    fcn_check(c < 0, "Значение c должно быть больше нуля!");

    fcn_protect(Calculate(a,b,c), "Ошибка при вычислении в функции Calculate");

    Edit3->Text = a;

  fcn_destructor:

    if(fcn_status == FOK()) ShowMessage("Выполнено!");

}

Здесь собственно не происходит динамического выделения ресурсов, однако все механизмы защиты и протоколирования работают.

Пример канечно примитивный, но ихмо сама структура программы не лишена некоторой красоты.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Forest, средства разработки надежного ПО"  
Сообщение от DeadMustdie email(??) on 26-Сен-06, 20:26 
>Пример канечно примитивный, но ихмо сама структура программы
>не лишена некоторой красоты.

Специфика изготовления GUI.
Логика серверных программ обычно предусматривает необходимость "вывалиться"
при ошибке до некоего уровня, на котором и производится обработка ошибок.
Что очень хорошо обеспечивается стандартным механизмом исключений,
от коих не столько защищаться надо, сколько разумно использовать ;)

Верификация входных данных - совершенно особая задача. Здесь, действительно,
напрашивается набор либо шаблонов, либо, действительно, макросов, обеспечивающих
контроль по заданному набору условий и при несовпадении разумную диагностику.

Впрочем, лично в моих программах чисто пользовательский ввод - редкость,
поскольку код, с которым взаимодействует конечный пользователь, в нашем
заведении пишут другие люди. А в прочих случаях обычно достаточно указать,
в какой точке входного набора данных возникла ошибка.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Forest, средства разработки надежного ПО"  
Сообщение от Romik email(??) on 27-Сен-06, 18:12 
Средства Forest действительно не претендуют быть столь же универсальными как базовые конструкции языка C++. Это искусственные макросы и классы некоторой более высокоуровневой концепции, предназначеннные для решения определенных задач в рамках определенных условий и соглашений применения. В то же время, они не настолько ограничивают применение средств языка, что про конструкцию try catch можно совсем забыть при необходимости анализа типа ошибок.

Побуждением написания средств была также необходимость написания программ, которые не рассматривают ошибки реализации, шаг влево или вправо в исходных данных или условиях протекания вычислительных процессов как попытку к бегству, и не выдают столь осмысленное для оператора сообщение Runtime Error at this a very biutefull address. А как показала моя практика разработки сложных программных комплексов, происходить иногда могут совершенно непредвиденные ошибки в совершенно непредвиденных местах, сколько бы программер не старался предусмотреть все варианты развития событий. Такие уж у меня руки кривые.

В целом вроде методология себя оправдала, позволив достаточно шаблонно подходить к программированию множества проверок вычислительного процесса, а не только исходных данных. При этом комплексно решаются задачи вывода детального отчета о типе и месте происхождения ошибки в скольугодно сложную систему протоколирования и управление ресурсами.

Я думал и о контекстной обработке ошибок и восстановлении вычислительного процесса, но понял, что конструкции try catch здесь более чем достаточно, и никакие специфические макроопределения по этому поводу в модуле fcn не созданы. Надо только не мешать две концепции. Например вместо:

try{ fcn_protect(myfun1(), "Error message 1!"); }
catch(...)
{
   // do something
}

fcn_protect(myfun2(), "Error message 2!");

Писать нечто вроде:

try{ throw myfun1(); }
catch(FStatus status)
{
  if(status == FOK())
  {
     // do something
  }
  else
  {
     // do something else
  }
}
catch(...)
{
   // do something
}

fcn_protect(myfun2(), "Error message 2!");

Иначе если последовательно произойдет ошибка в myfun1 и будет перехвачена в catch а потом еще произойдет ошибка в myfun2, то в отчет поступит информация о первой ошибке, потому что ее контекст был сохранен макроконструкциями и действует до окончания работы функции. Просто не надо мешать средства модуля fcn и обычный анализ ошибок.

По поводу исключений скажу что хотя эт теоретически оч мощное средство, я стараюсь его избегать :(. В моем дебаггере исключения вызывают останов выполнения и если их много программу оч сложно отлаживать. Вообще пора уже было начать объявлять все функции как nothrow(), но я этого не делаю. По сути все проверки выполняются в виде анализа FStatus и его наследников. FStatus можно возвращать как результат функции, он хранит в себе информацию об ошибке, и хотя для всяких dynamic_cast это будет FStatus, а  не его наследник, но операции сравнения работают корректно. Анализ исключительных ситуаций я применяю, но только когда это действительно необходимо, что бывает редко, т.к. я использую минимум готовых функций.

Механизм защелок я никада не использовал. Он мне понравился. И притом похоже на современных компиляторах корректно вызываются деструкторы даже при выходе из блоков с помощью goto, как бы это уже не было неактуально :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Forest, средства разработки надежного ПО"  
Сообщение от DeadMustdie email(??) on 29-Сен-06, 21:02 
Строго говоря, применение catch(...) полностью корректно в единственной ситуации -
когда все ветки обработчика исключений заканчиваются повторным выбросом
отловленного через 'throw;'. В противном случае, как минимум, не будут
вызваны деструкторы пойманного объекта, что, опять-таки как минимум,
приведет к утечке памяти.

Попросту говоря, вот так можно:

try {
  ...
} catch(...) {
  printf("Попка дурак!\n");
  throw;
}

а вот так лучше не надо:

try {
  ...
} catch(...) {
  printf("Попка дурак!\n");
}

Вообще ловить "непонятное" исключение бессмысленно - его нельзя корректно
обработать.

Программистам, находящимся в моем подчинении, я фактически запрещаю использовать
конструкцию catch(...). Поскольку польза бывает редко, а вред - очень часто.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Forest, средства разработки надежного ПО"  
Сообщение от Hordi email on 02-Окт-06, 11:07 
>не будут
>вызваны деструкторы пойманного объекта,

демонстрирующий примерчик можно, плз.?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Forest, средства разработки надежного ПО"  
Сообщение от Romik email(??) on 04-Окт-06, 20:56 
Вообще говоря у меня все деструкторы вызываются
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Forest, средства разработки надежного ПО"  
Сообщение от DeadMustdie email(??) on 06-Окт-06, 21:58 
>Вообще говоря у меня все деструкторы вызываются

Примерчик сходу слабо изготовить. Своими глазами я чудеса видел, когда
исключения выбрасывались из динамической библиотеки, а оный catch(...)
был нарисован в основной программе.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Forest, средства разработки надежного ПО"  
Сообщение от qq (ok) on 01-Окт-06, 22:47 

>Когдато устал писать однотипные конструкции вида:

я когдато тоже устал это делать, и открыл для себя common lisp: http://gigamonkeys.com/book/


>Однако мне нужно было писать программы выполняющие много проверок, с повышенной надежностью.

А под это очень хорошо заточен Erlang: http://www.erlang.org/faq/t1.html#AEN9

Сейчас я считаю целесообраным писать на си только какойнить кернел модуль, или что-то очень требовательное к скорости, но тогда это будет скорей всего библиотека, прикручивающаяся к высокоуровневому коду.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру