Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有哪些技巧可以让计算量大的函数变得清晰?_C++_Oop_Function_Coding Style - Fatal编程技术网

C++ 有哪些技巧可以让计算量大的函数变得清晰?

C++ 有哪些技巧可以让计算量大的函数变得清晰?,c++,oop,function,coding-style,C++,Oop,Function,Coding Style,如何实现这样的功能: void Map::Display() { if(initialized) { HRESULT hr; int hScrollPos = GetScrollPos(M_HWnd, SB_HORZ); int vScrollPos = GetScrollPos(M_HWnd, SB_VERT); D2D1_RECT_F region = {0,0,TILE_WIDTH,TILE_HEIGHT};

如何实现这样的功能:

void Map::Display()
{
    if(initialized)
    {
        HRESULT hr;
        int hScrollPos = GetScrollPos(M_HWnd, SB_HORZ);
        int vScrollPos = GetScrollPos(M_HWnd, SB_VERT);

        D2D1_RECT_F region = {0,0,TILE_WIDTH,TILE_HEIGHT};
        D2D1_RECT_F tFRegion = {0,0,TILE_WIDTH,21}; // tile front's region
        Coor coor;
        int tileHeight;

        RECT rect;
        GetWindowRect(M_HWnd, &rect);
        int HWndWidth = rect.right - rect.left;
        int HWndHeight = rect.bottom - rect.top;


        pRT->BeginDraw();

        pRT->Clear(D2D1::ColorF(0.45f, 0.76f, 0.98f, 1.0f));

        pRT->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
        for(int x=0; x<nTiles; x++)
        {
            coor = ppTile[x]->Getcoor();
            tileHeight = ppTile[x]->Getheight();

            pRT->SetTransform(D2D1::Matrix3x2F::Identity());

            if((coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos > 0 - TILE_WIDTH &&
                (coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos < HWndWidth &&
                ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos > 0 - (TILE_HEIGHT * 2.5) &&
                ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos < HWndHeight)
            {
                /* Draws tiles */
                pRT->SetTransform(D2D1::Matrix3x2F::Translation(
                    (coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos,
                    ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos
                    ));

                pRT->FillRectangle( &region, pBmpTileBrush[ppTile[x]->GetType() + 1]);

                /* Draws tiles' front */
                if((coor.Y - 1) / 2 < mapSizeY - 1) // If we are not in the front row,
                {
                    if(coor.X > 1)
                    {
                        for(int diffH = tileHeight - ppTile[x + mapSizeX - 1]->Getheight(); diffH == 0; diffH--)
                        {
                            pRT->SetTransform(D2D1::Matrix3x2F::Identity());

                            pRT->SetTransform(D2D1::Matrix3x2F::Translation(
                                (coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos,
                                ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos  + (TILE_HEIGHT * 0.75) + (diffH * TILE_PIXEL_PER_LAYER)
                                ));

                            pRT->FillRectangle( &tFRegion, pBmpTileFrontBrush[ppTile[x]->GetType()]);
                        }
                    }

                    if(((coor.X -1) / 2) + 1 < mapSizeX)
                    {
                        for(int diffH = tileHeight - ppTile[x + mapSizeX]->Getheight(); diffH == 0; diffH--)
                        {
                            pRT->SetTransform(D2D1::Matrix3x2F::Identity());

                            pRT->SetTransform(D2D1::Matrix3x2F::Translation(
                                (coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos,
                                ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos  + (TILE_HEIGHT * 0.75) + (diffH * TILE_PIXEL_PER_LAYER)
                                ));

                            pRT->FillRectangle( &tFRegion, pBmpTileFrontBrush[ppTile[x]->GetType()]);
                        }
                    }

                    if(coor.X == 1 || (coor.X - 1) / 2 == mapSizeY - 1) // If the tile if at any of left or right edge,
                    {
                        for(int n = ((TH * 1.5) / TPPL) - (ppTile[x + mapSizeY + mapSizeY - 1]->Getheight() - tileHeight); n>=0; n--)
                        {
                            pRT->SetTransform(D2D1::Matrix3x2F::Identity());

                            pRT->SetTransform(D2D1::Matrix3x2F::Translation(
                                (coor.X - 1) * (TILE_WIDTH * 0.5) - hScrollPos,
                                ((coor.Y - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos  + (TILE_HEIGHT * 0.75) + (n * TILE_PIXEL_PER_LAYER)
                                ));

                            pRT->FillRectangle( &tFRegion, pBmpTileFrontBrush[ppTile[x]->GetType()]);
                        }
                    }
                }

                else // If we are in the front row
                {
                    for(int h = tileHeight; h >= 0; h--)
                    {
                        pRT->SetTransform(D2D1::Matrix3x2F::Identity());

                        pRT->SetTransform(D2D1::Matrix3x2F::Translation(
                            (coor.GetX() - 1) * (TILE_WIDTH * 0.5) - hScrollPos,
                            ((coor.GetY() - 1) * (TILE_HEIGHT * 0.5) * 1.5f) + ((MAX_MAP_HEIGHT - tileHeight) * (TILE_PIXEL_PER_LAYER)) + TILE_HEIGHT - vScrollPos  + (TILE_HEIGHT * 0.75) + (h * TILE_PIXEL_PER_LAYER)
                            ));

                        pRT->FillRectangle( &tFRegion, pBmpTileFrontBrush[ppTile[x]->GetType()]);
                    }
                }
            }
        }
        pRT->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);

        hr = pRT->EndDraw();
    }
}

让它更容易阅读?随着我的代码变得越来越大,我意识到拥有一个干净、易读的代码是多么重要,即使有时不是必要的。有哪些技巧可以使上述代码更干净?

我的一般重构实践通常是执行以下操作:

  • 找出代码中不明显的内容的名称。您可以使用局部变量为小块代码提供定义名称。那么,在上一个例子中,
    (coor.X/2+((coor.Y-1)*mapSizeY)
    代表什么

    在大多数情况下,最好有好的名称,而不是担心存储局部变量(当堆栈离开函数时,它们将被删除,并且通常您不会太担心内存空间/代码的速度)

  • 将一组执行代码提取到方法中。一个很好的经验法则是,如果你的函数超过6行代码,你可能可以从中提取一个较小的函数。这样你的代码就能更好地理解它实际上在做什么

    一个非常常见的地方是循环。你几乎总是可以用一个好的描述性名称将循环中的代码拉到它自己的函数中

  • 拉出方法后,您可以将常见的共享功能分组到较小的对象中。让较小的对象一起工作几乎总是比让巨大的对象做大量工作要好。您希望您的对象都有一个单独的责任


  • 我的一般重构实践通常是执行以下操作:

  • 为代码中不明显的内容提取名称。您可以使用局部变量为小块代码提供定义名称。因此,在上一个示例中,
    (coor.X/2+((coor.Y-1)*mapSizeY)
    代表什么

    在大多数情况下,最好有好的名称,而不是担心存储局部变量(当堆栈离开函数时,它们将被删除,并且通常您不会太担心内存空间/代码的速度)

  • 将一组执行代码提取到方法中。一个很好的经验法则是,如果你的函数超过6行代码,你可能可以从中提取一个较小的函数。这样你的代码就能更好地理解它实际上在做什么

    一个非常常见的地方是循环。你几乎总是可以用一个好的描述性名称将循环中的代码拉到它自己的函数中

  • 拉出方法后,您可以将常见的共享功能分组到较小的对象中。让较小的对象一起工作几乎总是比让巨大的对象做大量工作要好。您希望您的对象都有一个单独的责任


  • 非常可靠的代码,做得很好。我会考虑:

    • 对函数本身进行高级注释,然后为代码中的所有重要块以及任何异常棘手的部分添加更好的注释

    • 使用描述性常量或#定义你正在使用的所有神奇变量。为什么要乘以0.675?0.675代表什么?与0.25、1.25、-0.25等相同

    • 将“检查单击是否在当前平铺区域内”测试(以及其他测试)转换为您调用的单独方法,例如isclickinsideetile(x,y,tile)

    • 添加调试跟踪,以便下一个负责人可以启用调试以获取诊断


    PS在变量名和方法名方面做得很好。

    代码非常可靠,做得很好。我会考虑:

    • 对函数本身进行高级注释,然后为代码中的所有重要块以及任何异常棘手的部分添加更好的注释

    • 使用描述性常量或#定义你正在使用的所有神奇变量。为什么要乘以0.675?0.675代表什么?与0.25、1.25、-0.25等相同

    • 将“检查单击是否在当前平铺区域内”测试(以及其他测试)转换为您调用的单独方法,例如isclickinsideetile(x,y,tile)

    • 添加调试跟踪,以便下一个负责人可以启用调试以获取诊断


    PS在变量名和方法名方面做得很好。

    很好的一般建议。关于#1的第二段,几乎所有现代编译器都足够聪明,可以尽可能完全优化临时变量。这是你不必担心代码性能的另一个原因,而应该担心可读性。很好的g一般建议。关于你的#1的第二段,几乎所有的现代编译器都足够聪明,可以尽可能完全优化临时变量。这也是你不应该担心代码性能,而应该担心可读性的另一个原因。我想这个问题应该解决。我已经决定请主持人看一看,看他们是否同意我的观点,因为这是标准的迁移路径之一。我不知道有代码审查,但我想你是对的。我的问题应该在那里。我想这个问题应该在那里。我已经打了个旗子,让主持人看一看,看他们是否同意我的观点,因为这是标准之一rd迁移路径。我不知道存在代码审查,但我想你是对的。我的问题属于那里。肯定需要摆脱这些神奇的数字。没有更快的方法来消除代码的可读性。根据需要,在本地或全局范围内使它们保持常量。运行时成本将是零。肯定的需要摆脱这些神奇的数字。没有更快的方法来消除代码的可读性。根据时间的不同,使它们在本地或全局范围内保持常量
    Tile* Map::GetClickedTile(short xPos, short yPos)
    {
        Tile* pNoClickedTile = NULL;
        int hScrollPos = GetScrollPos(M_HWnd, SB_HORZ);
        int vScrollPos = GetScrollPos(M_HWnd, SB_VERT);
    
        if(xPos < (mapSizeX * TILE_WIDTH) - hScrollPos) // If the click is within width of the map then...
        {
            Coor coor;
            int height;
            int currentTile;
            int tileDistanceFromTop;
    
    
            /* Checks if click is in an odd row of tiles */
            int column = (xPos + hScrollPos) / TILE_WIDTH;
    
            for (int y=mapSizeY-1; y>=0; y--)
            {
                currentTile = column + (y * (mapSizeX+mapSizeX-1));
    
                coor = ppTile[currentTile]->Getcoor();
                height = ppTile[currentTile]->Getheight();
    
                tileDistanceFromTop =   ((coor.Y / 2) * TILE_HEIGHT * 1.5f) + // Distance between two tiles
                                        ( (MAX_MAP_HEIGHT - height) * TILE_PIXEL_PER_LAYER) -
                                        vScrollPos +
                                        SPACE_LEFT_FOR_BACKGROUND;
    
                /*if (tileDistanceFromTop < 0)                               // If the tile is partially hidden,
                    tileDistanceFromTop = tileDistanceFromTop % TILE_HEIGHT;     // then % TILE_HEIGHT*/
    
                if( yPos > tileDistanceFromTop &&
                    yPos < tileDistanceFromTop + TILE_HEIGHT)
                {   
                    /* Get relative coordinates */
                    int rpx = xPos % TILE_WIDTH;
                    int rpy =   ( (yPos - SPACE_LEFT_FOR_BACKGROUND) - 
                                (y * (TILE_HEIGHT /2) ) -
                                ( ( MAX_MAP_HEIGHT - height) * TILE_PIXEL_PER_LAYER) +
                                vScrollPos) %
                                TILE_HEIGHT;
    
                    /* Checks if click is withing area of current tile */
                    if (rpy + (rpx / (TILE_WIDTH /16)) > TILE_HEIGHT * 0.25f &&     // if click is Down Right the Upper Left slope and,
                        rpy + (rpx / (TILE_WIDTH /16)) < TILE_HEIGHT * 1.25f &&     // it is UL the LR slope and,
                        rpy - (rpx / (TILE_WIDTH /16)) < TILE_HEIGHT * 0.75f &&     // it is UR the LL slope and,
                        rpy - (rpx / (TILE_WIDTH /16)) > TILE_HEIGHT * -0.25f)      // it is DL the UR slope,
                            return ppTile[currentTile];                             // Then return currentTile
                }
            }
    
    
            /* Checks if click is in an even row of tiles */
            column = (xPos + hScrollPos - (TILE_WIDTH/2)) / TILE_WIDTH;
    
            for (int y=mapSizeY-2; y>=0; y--)
            {
                currentTile = column + (y * (mapSizeX+mapSizeX-1)) + mapSizeX;
    
                coor = ppTile[currentTile]->Getcoor();
                height = ppTile[currentTile]->Getheight();
    
                tileDistanceFromTop =   (((coor.Y - 1) / 2) * TILE_HEIGHT * 1.5f) + // Distance between two tiles
                                        ( (MAX_MAP_HEIGHT - height) * TILE_PIXEL_PER_LAYER) +
                                        (TILE_HEIGHT * 0.75) -
                                        vScrollPos +
                                        SPACE_LEFT_FOR_BACKGROUND;
    
                /*if (tileDistanceFromTop < 0)
                    tileDistanceFromTop = tileDistanceFromTop % TILE_HEIGHT;*/
    
                if( yPos > tileDistanceFromTop &&
                    yPos < tileDistanceFromTop + TILE_HEIGHT)
                {   
                    /* Get relative coordinates */
                    int rpx = xPos % TILE_WIDTH;
                    int rpy = (int)((yPos - SPACE_LEFT_FOR_BACKGROUND) - 
                                    (y * (TILE_HEIGHT /2) ) -
                                    ( ( MAX_MAP_HEIGHT - height) * TILE_PIXEL_PER_LAYER) -
                                    (TILE_HEIGHT * 0.675) +
                                    vScrollPos) %
                                    TILE_HEIGHT;
    
                    /* Checks if click is withing area of current tile */
                    if (rpy + (rpx / (TILE_WIDTH /16)) > TILE_HEIGHT * 0.25f &&     // if click is Down Right the Upper Left slope and,
                        rpy + (rpx / (TILE_WIDTH /16)) < TILE_HEIGHT * 1.25f &&     // it is UL the LR slope and,
                        rpy - (rpx / (TILE_WIDTH /16)) < TILE_HEIGHT * 0.75f &&     // it is UR the LL slope and,
                        rpy - (rpx / (TILE_WIDTH /16)) > TILE_HEIGHT * -0.25f)      // it is DL the UR slope,
                            return ppTile[currentTile];                             // Then return currentTile                      // Then return currentTile
                }
            }
        }
        return pNoClickedTile;
    }
    
    int Map::GetTileNByCoor(Coor coor)
    {
        return ((coor.X / 2 + ((coor.Y - 1) * mapSizeY) - (coor.Y / 2));
    }