小编Ric*_*ket的帖子

你如何重构一个庞大的混乱代码库?

我的代码很乱.不可否认,我自己写了一年 - 一年前.它没有得到很好的评论,但它也不是很复杂,所以我可以理解它 - 只是不足以知道从哪里开始重构它.

我违反了过去一年中我读过的所有规则.有些职责有多个职责,有间接访问(我忘记了这个术语 - 类似的东西foo.bar.doSomething()),就像我说的那样评论不好.最重要的是,它是游戏的开始,所以图形与数据耦合,或者我试图解耦图形和数据的地方,我制作数据public以便图形能够访问数据需要...

这是一个巨大的混乱!我从哪里开始?你会如何开始这样的事情?

我目前的方法是获取变量并将它们切换为私有,然后重构破坏的碎片,但这似乎不够.请建议其他策略来浏览这个烂摊子并把它变成干净的东西,以便我可以继续我离开的地方!


两天后更新:我一直在绘制类似UML的图表,并沿途捕捉一些"低挂水果".我甚至发现了一些代码是新功能的开始,但是当我试图减少一切时,我已经能够删除这些位并使项目感觉更清洁.在绑定我的测试用例之前,我可能会尽可能地进行重构(当然,只有那些100%肯定不影响功能的东西!),所以我不必重构测试用例.改变功能.(你认为我做得对吗,或者你认为,我更容易吸吮它并先写下测试吗?)

请投票选出最佳答案,以便我公平地标记!您也可以随意添加自己的答案,还有空间给您!我会再给它一天左右,然后可能将最高投票的答案标记为已接受.

感谢迄今为止做出回应的所有人!


2010年6月25日:我发现了一篇博文,它直接回答了那个似乎对编程有很好掌握的人的问题:(或者,如果你读了他的文章,可能不会:))

为此,当我需要重构代码时,我做了四件事:

  1. 确定代码的用途是什么
  2. 绘制所涉及的类的UML和动作图
  3. 四处寻找合适的设计模式
  4. 确定当前类和方法的更清晰的名称

language-agnostic oop refactoring

40
推荐指数
5
解决办法
6096
查看次数

程序中消息传递的数据结构?

我正在尝试编写一个简单的RPG.到目前为止,每次我尝试启动它立即变得一团糟,我不知道如何组织任何东西.所以我重新开始,试图构建一个基本上是MVC框架的新结构.我的应用程序在Controller中开始执行,它将创建View和Model.然后它将进入游戏循环,游戏循环的第一步是收集用户输入.

用户输入将由View的一部分收集,因为它可以变化(3D View将直接轮询用户输入,而远程View可能通过telnet连接接收它,或者命令行视图将使用System.in ).输入将被转换为消息,每个消息将被提供给Controller(通过方法调用),然后可以解释消息以修改模型数据,或通过网络发送数据(因为我希望有一个网络选项) .

在联网游戏的情况下,该消息处理技术也可用于处理网络消息.到目前为止,我是否保持MVC的精神?

无论如何我的问题是,表示这些消息的最佳方式是什么?

这是一个用例,每条消息都用斜体显示:假设用户启动游戏并选择角色2.然后用户移动到坐标(5,2).然后他说公开聊天,"嗨!" .然后他选择保存并退出.

视图应该如何将这些消息包装成控制器可以理解的内容?或者您认为我应该有单独的控制器方法,如chooseCharacter(),moveCharacterTo(),publicChat()?当我转向网络游戏时,我不确定这种简单的实现是否有效.但在极端的另一端,我不想只是向控制器发送字符串.这很难,因为choose-character动作需要一个整数,move-to需要两个整数,聊天需要一个字符串(和一个范围(公共私有全局),在私有情况下,一个目标用户); 这一切都没有真正的设置数据类型.

任何一般性的建议都非常受欢迎; 我在合适的时间担心这件事吗?我是否正确地走向一条布局合理的MVC应用程序?有什么我忘了吗?

谢谢!

java model-view-controller

35
推荐指数
1
解决办法
8196
查看次数

Maven和JOGL库?

我在过去几天的空闲时间里一直在研究Maven,但似乎无法弄清楚如何组织项目以便使用JOGL库.我最好喜欢以下内容:

  1. 如有必要,从此处自动下载特定于操作系统的JOGL zip文件(包含4个jar文件和一些本机库文件(.so/.dll)); 或依赖于Maven项目,该项目是其中一个文件的包装.
  2. 适当地解压缩该zip文件,以便:
    1. jar文件被添加到类路径中并根据需要进行部署
    2. 本机库文件被添加到最终的jar文件中(这会使它们自动使用,还是需要更多参与?)

我认为我的问题的一部分是我不完全理解JOGL的使用,在运行代码时放置本机库的位置等等.我需要回到基础并编写一个JOGL hello世界,从中编译它命令行并从命令行运行它,以确切了解它对本机库的目录放置所需的内容; 实际上,我现在可能会这样做.

在第1项中,我发现了一些特定于操作系统的功能; 可以基于系统的属性(包括操作系统)激活Maven配置文件.那么我就可以激活一个Windows配置文件,该配置文件具有Windows特定的JOGL库的依赖性,对于Linux也是如此,并且都具有64位的改变自我.(激活官方文档/非官方文档.)

我尝试创建一个基于JOGL jar文件的Maven存储库,然后添加JOGL jar文件项目作为我项目的依赖项; 依赖项已下载,但未使用.我不知道jar文件在哪里或如何使用它,解压缩等等.这是我使用的命令.

简而言之:JOGL由四个.jar文件和一些本机库组成.如何将这些文件集成到我的Maven项目中,以便我可以使用Maven编写JOGL应用程序来处理我的构建过程?此外,我如何根据操作系统使用不同的文件集,因为Windows,Linux和Mac之间的本机库甚至.jar文件当然不同.

java build-process maven-2 jogl maven

28
推荐指数
4
解决办法
1万
查看次数

如何确定在JavaScript动画循环中使用的最佳"帧速率"(setInterval延迟)?

编写JavaScript动画时,您当然会使用setInterval(或重复的setTimeout)进行循环.但是在setInterval/setTimeout调用中使用的最佳延迟是什么?

.animate()函数jQuery API页面中,用户"fbogner"说:

如果有人感兴趣:动画是使用setInterval"渲染"的,时间超过13毫秒.这很快!Chrome的最快间隔时间约为10毫秒.所有其他浏览器在20-30ms左右"采样".

知道jQuery如何决定使用这个特定的数字吗?


开始赏金.我希望有了解Chromium或Firefox背后的源代码的人可以提供一些可能支持特定帧速率决策的硬性事实.或者可能是动画(或框架)列表及其延迟.我相信这为进行一些研究提供了一个有趣的机会.


有趣 - 我只是花时间看看谷歌的吃豆人来源,看看他们做了什么.他们设置了一系列可能的FPS(90,45,30),从第一个开始,然后每帧检查帧的"慢度"(帧的数量超过其分配的时间).如果慢度超过50ms 20次,则帧速率下降到列表中的下一个(90 - > 45,45 - > 30).看起来帧速率永远不会提升,大概是因为游戏的寿命很短,所以编码就不值得了.

哦,setInterval延迟当然设置为1000 /帧速率.事实上,它们使用setInterval而不是重复的setTimeouts.

我认为这种动态帧率功能非常整洁!

javascript jquery

26
推荐指数
2
解决办法
1万
查看次数

Java:匿名枚举?

Java是否有匿名枚举的可能性?

例如,我希望我的类有一个变量,其值可以是5种不同的设置之一.显然,变量应该是枚举.但这是使用特定枚举的唯一地方.通常我会在变量上方声明一个枚举类型,然后将变量声明为该类型,但我想知道是否有更简洁的方法.Java是否支持匿名枚举?

例:

public class Test {
    public enum Option {
        FirstOption,
        SecondOption,
        ThirdOption
    }
    Option option;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免声明public enum Option,而只是简单地允许选项变量设置为FirstOption,SecondOption或ThirdOption而没有"Option"类型的概念?

java

20
推荐指数
1
解决办法
1万
查看次数

游戏对象的体系结构绘制和更新本身有什么问题?

支持和反对游戏对象绘制和更新的原因是什么?例如,如果你有一个游戏,玩家在屏幕上有一个位置,为什么不拥有一个包罗万象的类:

public class Player {
    private int x, y, xVelocity, yVelocity;
    private Sprite s;
    //...

    public Player() {
        // load the sprite here, somehow?
    }

    public void draw(CustomGraphicsClass g) {
        g.draw(s, x, y);
    }

    public void update(long timeElapsed) {
        x += (xVelocity * timeElapsed);
        y += (yVelocity * timeElapsed);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个设计有什么问题?有哪些垮台或担忧?你怎么能更好地写这样的东西,或者在游戏中更好地构建这类东西呢?

另外,有点连接,你将如何实现加载Sprite图像?

而且,你如何实现两个Players 之间的碰撞呢?

(我应该将这两个额外的问题分成新问题,对吧?)

architecture oop

18
推荐指数
1
解决办法
2121
查看次数

用于开发进口商的COLLADA文件示例?

我正准备用Java写一个COLLADA导入器.没有任何预先写好的进口商,即使有可能我会挑剔,所以我相信这是最好的.我将使用COLLADA 1.4,因为我不需要1.5功能,许多程序还不支持它.我找到了它的规范并计划跟随它,但是通过示例更容易,并参考规范以获取更多信息.

所有这些......在COLLADA经验丰富的人中,有些人能指出一些我可以用来学习和测试我的进口商的简单模型吗?我将导出几个只有几何,但我需要一些纹理或材料,骨架和关键帧动画等.任何建议?

或者,我知道Blender可以导出COLLADA 1.4,它可以导入大多数格式.如果你对一个拥有另一种格式的简单3D模型的网站有一个非常好的建议,我将导入和导出为COLLADA,那也没关系!

谢谢!

java 3d file-format blender collada

17
推荐指数
1
解决办法
2万
查看次数

PHP包含vs include_once(速度)

可能重复:
为什么require_once这么糟糕?

我读的地方,在include_oncerequire_once在PHP语句比其非曾经的同行慢.这是一个显着的放缓?是否有任何测试或研究,并在最近的PHP版本中进行了更改?

php

16
推荐指数
1
解决办法
4万
查看次数

为什么UDP +软件可靠的订购系统比TCP更快?

今天的一些游戏使用通过UDP传输消息的网络系统,并确保消息可靠和有序.

例如,RakNet是一种流行的游戏网络引擎.它仅使用UDP进行连接,并且有一个完整的系统,以确保数据包可靠,并在您选择时进行排序.

我的基本问题是,那是什么?TCP是否与有序,可靠的UDP相同?是什么让人们不得不基本上重新发明轮子?

networking udp tcp

12
推荐指数
2
解决办法
4114
查看次数

Eclipse组织:工作空间,工作集,项目,文件夹,多个源文件夹,....!

Eclipse中有相当一层的组织.您可以拥有多个工作区,每个工作区都可以有项目,这些项目可以分配到工作集,然后每个项目都可以有源文件夹....

你如何使用这个组织?你甚至使用它吗?工作集如此隐蔽,我几乎不知道它们是什么; 它们是常用的,还是因为它们如此常见而被隐藏?

这背后的方法甚至是什么?我想对使用所有这些不同组织层的推荐方法做一个很好的解释,因为目前我基本上只在一个工作区(默认的%USER%/工作区文件夹)中有一堆随机项目,而且它到了是一个字母混乱.

所以从本质上讲:如何保持Eclipse工作空间的整理?

eclipse organization

11
推荐指数
1
解决办法
3161
查看次数