1. C++ / Говнокод #9423

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    void CXMLParser::Parse(std::map< std::pair<int, int>, int >& link)
    {
      _di_IXMLNode areaNode = MessageNode->ChildNodes->FindNode( WideString("area") );
      if( areaNode )
      {
        Area.reset( new CAreaPart( areaNode ) );
        IXMLNodeList* pointList = areaNode->ChildNodes;
        if( pointList )
        {
          for(int pointIndex=0; pointIndex<pointList->GetCount(); pointIndex++)
          {
            _di_IXMLNode pointNode = pointList->Get( pointIndex );
            int typePoint = -1;
            if( pointNode->GetNodeName() == WideString("measuringpoint") )
              typePoint = MEASURING;
            if( pointNode->GetNodeName() == WideString("accountpoint") )
              typePoint = ACCOUNT;
            if( pointNode->GetNodeName() == WideString("deliverypoint") )
              typePoint = DELIVERY;
            switch( typePoint )
            {
            case MEASURING:
            case ACCOUNT:
            case DELIVERY:
              {
                const int pointCode    = pointNode->GetAttribute( WideString("code") );
                const String pointName = pointNode->GetAttribute( WideString("name") );
                IXMLNodeList* channelList = pointNode->ChildNodes;
                if( channelList )
                {
                  for(int channelIndex=0; channelIndex<channelList->GetCount(); channelIndex++)
                  {
                    _di_IXMLNode channelNode = channelList->Get( channelIndex );
                    if( channelNode->GetNodeName() == WideString("measuringchannel") )
                    {
                      const int channelCode    = channelNode->GetAttribute( WideString("code") );
                      const String channelDesc = channelNode->GetAttribute( WideString("desc") );
                      IXMLNodeList* periodList = channelNode->ChildNodes;
                      if( periodList )
                      {
                        for(int periodIndex=0; periodIndex<periodList->GetCount(); periodIndex++)
                        {
                          _di_IXMLNode periodNode = periodList->Get( periodIndex );
                          if( periodNode )
                          {
                            String str = periodNode->GetAttribute( WideString("start") );
                            periodNode->GetAttribute( WideString("end") );
                            TDateTime time;
                            time = TDateTime( StrToInt( str.SubString( 1, 2 ) ), StrToInt( str.SubString( 3, 2 ) ), 0, 0 );
                            periodNode->GetAttribute( WideString("summer") );
                            time = IncMinute( time, 30 );
                            _di_IXMLNode valueNode = periodNode->ChildNodes->FindNode( WideString("value") );
                            if( valueNode )
                            {
                              const int status = valueNode->GetAttribute( WideString("status") );
                              const int value = StrToInt( valueNode->Text );
                              if( RTDBWrite )
                              {
                                map< pair<int, int>, int >::iterator i = link.find( make_pair( pointCode, channelCode ) );
                                if( i!=link.end() )
                                {
                                  (*RTDBWrite)( Date->DateInterval.first + time, (*i).second, value, status );
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      RTDBWrite->Flush();
    }

    Древний legacy-код на БорландЦэпэпэБыдлере, обнаруживаемый на текущей работе (почти госпредприятие), выглядит в основной своей массе примерно так. Новый код на C# чуть получше, но в целом тоже жуткое мракобесие.
    Сил больше нет работать с подобным, увольняюсь и ищу норм работу.

    Запостил: invi, 15 Февраля 2012

    Комментарии (9) RSS

    • глубина }}..} = 14
      and we need to go deeper
      Ответить
    • > for(int pointIndex=0; pointIndex<pointList->GetCount(); pointIndex++)
      Хороший заголовок цикла.
      То, что в Дельфи работает оптимально, в крестах создаёт переголовы.
      Ответить
      • харе вбрасывать, язык тут не при чём.
        Ответить
        • как раз очень даже причем
          этот язык называется МыПишемНаБорланд
          IXML - очевидно, очередное их гениальное творение
          в нормальных парсерах перебрать дочерние элементы можно легко и просто
          for (xml_node<>* node = some.first_child(); node; node = node->next_sibling())

          а в борланд метод NextSibling() возвращает не NULL, если соседи закончились, а raises an exception
          это пиздец
          Ответить
          • >NextSibling() возвращает не NULL, если соседи закончились, а raises an exception
            Ну мудаки... Нарушают не писанное правило: "Не используй исключения в частых не исключительных ситуациях".

            Хотя, конечно, лучшеб итератор использовали.
            Ответить
          • интерфейс IXML творение microsoft, а судя по сырцам возвращается все таки nil:
            function TXMLNode.PreviousSibling: IXMLNode;
            begin
            if Assigned(ParentNode) then
            Result := ParentNode.ChildNodes.FindSibling(Self as IXMLNode, -1) else
            Result := nil;
            end;
            Ответить
            • http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/XMLIntf_IXMLNode_NextSibling.html
              Ответить
              • наверное они и вправду мудаки, так как я не нашел в сырцах где же у них там исключение выбрасывается. или там для билдера свой лесапед написали...
                Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий