Re[6]: Существуют ли задачи, где использование GOTO оправдан
От: unreg_flex  
Дата: 31.07.07 17:07
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Этого не видно из исходного кода


Согласен, хотелось как проще а получилось как всегда, вот оригинал этого метода:

template< class ValueType >
void EstimateContour(
  const TGL::Point< ValueType,2 > *pPoints,
  int nPoints,
  const TGL::Polygon< ValueType,2 > &rPolygon,
  const CirclesCondition &rCirclesCond,
  const PointsCondition &rPointsCond) {

  msg_assert(nPoints>0,"Множество точек пусто");

  std::vector< TGL::Circle< ValueType > > Circles;
  TGL::Point< ValueType,2 > Inv1,Inv2;
  TGL::Circle< ValueType > c;

  Inv1=Inv2=pPoints[0];

  for(int i=0;i<nPoints;++i) {
    // отбрасываем точки вне оболочки
    if(!rPolygon.IsPointIn(pPoints[i])) continue;

    for(int j=i+1;j<nPoints;++j) {
      // первое условие двойственности
      if(!rCirclesCond.CheckFirst(pPoints[i],pPoints[j],rPointsCond)) goto next1;
      rPointsCond.Invert(Inv1,pPoints[j]);

      for(int k=j+1;k<nPoints;++k) {
        // второе условие двойственности
        if(!rCirclesCond.CheckSecond(pPoints[j],pPoints[k],rPointsCond)) goto next2;
        rPointsCond.Invert(Inv2,pPoints[k]);

        c.Estimate(pPoints[i],pPoints[j],pPoints[k]);
        c.Refine(Inv1,Inv2);
        // сохраняем если центр окружности принадлежит оболочке
        // и найденные параметры входят в заданный диапазон
        if(rPolygon.IsPointIn(c.Center())&&
           rCirclesCond.Check(c)) Circles.push_back(c);
      }
      
    }
    next2:;
  }
  next1:;
  EstimateHull(Circles,pPoints,nPoints);
}


NBN>Я??? Где я предлагаю N4??? Я вообще не знаю что это за алгоритм и с какого перепугу это критический участок кода. Это кодек какой-то?

Не совсем, но нечто подобное.

NBN>Это прикидка — какая доля людей дрова пишет (0.05%).

Дрова это теже программы, в которых также как и везде гото может встретится а может и не встретится.

NBN>Гм. А как у тебя с С++? Зачем нужны конструкторы/деструкторы? А смартпоинтеры?

NBN>Когда в последний раз один чел задавал подобный вопрос — выяснилось, что он со строками руками работал (char*, выделение и освобождение памяти ручками). Ты тоже этим страдаешь? Когда это возможно — исключения используешь? Контейнеры?
Нееее, мы ничего такого не используем, все пишем только в машинных кодах
А если серьезно:
boost мы не юзаем, из того что нам требуется там почти ничего нет.
stl используем везде где это возможно, однако до сих пор ни у кого в коде даже не нашлось нормальное применение обычным спискам из стл.
Либо количество элементов очень невелико (порядка 10-20) и можно обойтись обычным вектором или использовать массив указателей,
либо оно велико и можно легко найти верхнюю оценку, других случаев почему-то небыло.
А как только нужно реализовать какой-нибудь специализированный геометрический алгоритм (к примеру),
то для него не подходит ни один из стандартных контейнеров стл, и приходится все писать самим (например N мерный кластер точек).
Исключения не используем вообще, и более того, открою страшный секрет
Мы два года назад отказались от проверок на ошибки выделения памяти
И с тех пор ни разу, ни одна из наших програм не упала по этой причине.
А насчет смартпоинтеров скажу:
COM мы не используем (не та область разработки), хотя иногда бывает, ну например MSXML подключить.
А других применений для него так и не нашлось.
Однажды, очень давно, на старом месте работы (не скажу где) люди шарахались с ужасной гримасой от строчки вида: SomeType *p;
И пихали смартптры везде где только можно их запихнуть, но от этого количество багов почемуто не уменьшалось.
По сути все эти биндеры смартптры итераторы (которые на самом деле вовсе не итераторы) фишки из буста (я не имею ввиду алгоритмы)
и прочая хренотень есть большой набор костылей призванный хоть как-то внести в язык отсутствующую функциональность.
Лично мое мнение таково, если ее там нет, то нечего и рыпаться, а если она нужна, то надо выбирать язык по ее наличию.

NBN>>>Нормальный программист будет использовать автоматику (конструкторы/деструкторы).

А кто их не использует при программировании на С++?

NBN>По твоему это типа так?

NBN>
NBN>for(int i=0;i<n1;++i){for(int j=0;j<n2;++j){if(c1)goto next1;for(int k=0;k<n3;++k){if(c2)goto next2;}}next2:;}next1:;
NBN>

Не надо утрировать, ни я, ни кто-либо из нашей команды такого не писал.
NBN>Судя по отсуствию пробелов в for'ах действительно лаконично написано...
Пробелы в форах это так?: for ( int i = 0; i < n; ++i ) { }
Что я могу тут сказать, в нашем отделе работает 6 человек и многие пишут по разному:
Например так:
for( int i = 0; i < n; ++i )
{
}

Так:
for( int i=0; i<n; ++i ) {
}

Или так:
for(int i=0;i<n;++i)
{
}

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

NBN>Я предпочитаю писать так чтобы хорошо читалось.

Аналогично.

NBN>>>GOTO для выхода из вложенных циклов? По хорошему эти циклы должны разноситься на отдельные функции.

NBN>Использую, правда два вложенных — это максимум на одну функцию и в дальнейшем это очень часто подвергается рефакторингу.
Параноидальное разнесение вложенных циклов на функции?

NBN>Функторы?

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

NBN>Ну, тут тебе надо почитать классиков.

Читали мы и классиков и современников.

NBN>названия надо нормальные давать... вполне возможно можно заменить... принципы рефакторинга... отдельные модули...

Это мы все видели и слышали, теперь я привел полную версию метода. Напишите этот метод как считаете нужным. И сравним читабельность

PS Любые, даже самые хорошие советы содержат исключения. Тем же свойством обладают и советы в книгах.
Поэтому если пишут что делать нужно так и сяк, то это вовсе не значит что надо поступать именно так и именно сяк фанатично и всегда.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.