The OpenNET Project / Index page

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

Red Hat [...........] - Вопрос про стиль программирования...


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
 From : Vladimir A. Butenko                 2:5020/400      05 Dec 99  23:13:02 
 Subj : Re: Red Hat [...........] - Вопрос про стиль программирования...        
________________________________________________________________________________
From: butenko@stalker.com (Vladimir A. Butenko)

In article <AAb-dIu0D2@elex.saratov.su>, alex@elex.saratov.su wrote:

> > типа
> > STErrorCode& (в Це++) или STErrorCode* (для Це),
> 
> Hу, в Це под Униксом выход: void perror( const char * s ),
> выдающий задаваемую строку s и стандартный текст диагностики,
> зависящий от значения errno.

Вы не совсем поняли. Ошибки не надо никуда выдавать. Ошибки должны:
а) передаваться наверх.
б) ошибкок (кодов) должно быть столько, сколько нужно - то есть сотни, а не
   пара десятка унихных.
в) если не смотря на б) есть риск, что не вся информация будет уловлена из
   текста ошибки или ошибка сурьезна настолько, что об этом надо бы знать кому
   следует - она пишется в лог (на худой конец - в stderr в простой программке)

Основное - это не печатать ошибку, а ВЕРHУТЬ. И привыкнуть к тому, что
ЛЮБАЯ функция сложности более memmove можеть вернуть ошибку. Либо
переходить на exceptions, что отнюдь не есть панацея - увы.
 
> > STErrorCode updateObject(STKey parm1,STHren parm2) {
> >   STErrorCode errorCode = NIL;
> >   if(STObject* theObject = getThatObject(parm1,errorCode)) {
> >     if((errorCode = theObject->modify(parm2)) == NIL) {
> >       errorCode = storeThatObject(theObject,parm1);
> >     }
> >     theObject->release();
> >   }
> >   return(errorCode);
> > }

> Hе знаю как другим, но лично мне - интересно и это.
> К "лесенке" я тоже имею склонность. :)

> > Hу и Це++ профессионал сократил бы приведенный пример на одну строку - не
> > для экономии байт, естественно, а для реального улучшения стиля.
> 
> Btw, о сокращении (по другому поводу) - в конструкции, указанной
> в самом начале письма, я усмотрел еще один плюс: чисто визуально,
> она более компактна, чем моя "старая" - не тратится лишняя строчка
> на открывающую `{', то есть больше строчек я увижу на экране и на
> распечатке... ;)

Это - само собой. Как и строчки длиной в 150 (или более символов :-) -
ежели очень нужно, и знаешь, что у читающего не консоль от Электроники-85.
Хотя злоупотребления тут, как все злоупотребления - наказуемы. Идент
равный 2 взялся не от балды, а именно для уменьшения числа слишком длинных
строк.

Фишка же, о которой я упоминал заключается в том, что в приведенном
кусочке забыть theObject->release() - как не фиг делать (и делаю я это, то
есть забываю - регулярно). Дампер это ловит - но все равно.

Так вот, "профессионал" сделал бы класс STObjectPtr:
class STObjectPtr {
  STObject*  object;
public:
             STObjectPtr(STObject* anObject) : object(anObject) {}
             ~STObjectPtr(void) {if(object != NIL) object->release();}
  STObject*   operator ->(void) const {return(object);}
  STObject*   operator  *(void) const {return(object);}
};

 и писал бы:
   if(STObjectPtr theObject = getThatObject(parm1,errorCode)) {
     if((errorCode = theObject->modify(parm2)) == NIL) {
       errorCode = storeThatObject(*theObject,parm1);
     }
   }

Одна беда - такая IF-а не будет работать в C++ %-(. Придется писать:
   STObjectPtr theObject = getThatObject(parm1,errorCode);
   if(*theObject != NIL) {
     if((errorCode = theObject->modify(parm2)) == NIL) {
       errorCode = storeThatObject(*theObject,parm1);
     }
   }


А это уже на строку больше, да theObject вылез за пределы блока, значит -
еще две строки на блок, да отступ - туфта, короче, получается :-(. Вот и
приходится трахаться с этими theObject->release() пока кто-то лучшего
решения не предложит.

Леня... Ау! :-)

> SY, Alex "Cloudy" Snastin
> alex@elex.saratov.su

-- 
Vladimir Butenko
Stalker Software, Inc.
--- ifmail v.2.14dev3
 * Origin: Stalker Software, Inc. (2:5020/400)

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>



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

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