小编Fin*_*las的帖子

接口继承 - 一件好事?

我刚刚第一次使用它 - 考虑:

IGameObject
    void Update()

IDrawableGameObject : IGameObject
    void Draw()
Run Code Online (Sandbox Code Playgroud)

我有一个使用DrawableGameObjects的级别类 - 我把它改为IDrawableGameObject,而不是减少耦合和辅助TDD.

但是我当然失去了在没有强制转换的情况下调用Update(..)的能力 - 为了解决这个问题,我使用了继承.我之前从未使用过基于接口的继承 - 除非在这种情况下,我也没有真正找到需要.

我真的不想每次都在我的更新方法中,因为它每秒调用60次,另一方面foreach(..)可以使用IGameObject的.

有什么建议?

编辑

我应该添加 - 我之后创建的假单元用于单元测试,然后实现IDrawableGameObject - 这些类现在有很多方法,而不是每个接口只有少数几个.我知道接口必须只是少数几个成员,但继承是否违反了这一规则?

谢谢

c# language-agnostic inheritance interface

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

将条件扁平化为重构

考虑:

if (something) {
    // Code...
}
Run Code Online (Sandbox Code Playgroud)

安装CodeRush后,建议:

if (!something) {
    return;
}
// Code...
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这更好吗?当然,没有任何好处.

refactoring coderush

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

Subversion - 在没有检查的情况下引用项目?

我喜欢谷歌这个(我已经尝试过),但我不确定它叫什么,更不用说怎么做了.

考虑:

project A
project B
Run Code Online (Sandbox Code Playgroud)

我正在研究项目A,这恰好需要项目B.我如何在没有用项目A检查项目B的情况下,引用它?

换句话说,有一种方法(我在放置时经历过)允许您在项目中使用项目,如果有人要更新该项目,您将获得更改.基本上它意味着你不必担心过时或管理两份东西.

没有必要(但如果你能/想要)解释,只需一个链接或名称就可以解决问题.

干杯.

svn

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

幻数 - 从配置文件读取与全局空间相同?单元测试不好?

考虑以下课程:

class Something : ISomething {

    public void DoesSomething(int x) {
        if (x == 0) {
            x = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我当然要删除神奇的数字 - 我的单元测试正在通过等...但我想重构可怕的魔法数字.

我正在使用C#,但我想这个问题非常通用.从配置文件(xml文件)读取是通过以下方式完成的:

ConfigurationManager.AppSettings["MyOldMagicNumber"]...
Run Code Online (Sandbox Code Playgroud)

当然,这将是一个测试的草皮.我可以轻松地在这个标记为虚拟的类中创建一个私有函数.其目的是封装上面的代码.这将允许我在我的单元测试中访问以覆盖和插入我自己的值.

我的问题是 -

这是不是我在做什么?见标题.

编辑:

这是一个游戏 - 因此很可能在开发过程中价值观会经常变化,重新构建将是一件苦差事.我应该提到的是,上面的代码是通用的,我这样做是为了让问题尽可能简单.虽然有点上下文 - '0'是游戏区域的界限.

提前致谢.

c# unit-testing

0
推荐指数
1
解决办法
401
查看次数

接口和其他依赖项应该放在哪里?

通过其他依赖,我的意思是抽象类,以及其他任何东西.

我有一个形式的一个项目dll,其需要一定的interface,IInput.测试项目也需要这个接口,所以我将这个接口放在我的主项目中,而后者又是一个单独的exe程序集.

这是因为当我将所有内容连接在一起时,最终主项目将需要使用此接口.现在我遇到的问题是当我尝试将主项目中的引用添加到dll时引用了主项目我收到了循环依赖.

我以前从未遇到过这个问题,也不知道对付它的最佳方法.作为一个临时修复我已经将界面移动到单独的dll,但很快我将在主项目中需要它,所以我回到了第一个方块.

编辑:

我应该提到设计,所以这里.

Menu
Menu Tests
Runner
Run Code Online (Sandbox Code Playgroud)

菜单具有IInput,它实际上是第三方库的接口适配器,以便进行单元测试.

所以菜单需要输入,但跑步者也是如此.转轮项目(exe)将需要输入,所以我将再次需要IInput.

c# interface

0
推荐指数
1
解决办法
309
查看次数

定时一组方法 - 第二次运行时,它们更快

我有一个算法,我正在使用System.Diagonstics来计时 - 通过秒表.

它工作得很好但我注意到的一件事是我第一次运行算法需要大约52毫秒,这很棒.

第二次运行算法时,它只需要一小部分时间.

这是由于.NET的性质吗?

每次我使用一组新数据运行算法时,我都会重新初始化它.换句话说,我创建一个新对象,而不是重新使用旧的引用,所以我不知道为什么这仍然会发生.通常我不会关心这样的事情,但对于这项任务,我必须衡量算法的效率和速度,因此了解为什么会发生这种情况对我自己很重要.

我如何使用计时器的伪代码如下:

 Algorithm class

 Stopwatch get/set

 Method A
     Start stopwatch
     // Do work.
     Stop stopwatch
 End

 Method B
     Start stopwatch
     // Do work.
     Stop stopwatch
 End

End
Run Code Online (Sandbox Code Playgroud)

在我的跑步者中调用这两种方法后,我得到秒表并检查时间.

算法

该算法是计算机控制的AI对偶的战术航路点推理.我试图在上面的例子中尽可能简单.

结果

19.7847
0.0443
0.0102
0.0159
0.0091
0.0073
0.0079
0.0079
0.0079
0.0079
0.0079
0.0079
0.0136
0.0079
0.0073
0.0079
0.0079
0.0079
0.0079
0.0073
...
Run Code Online (Sandbox Code Playgroud)

我应该在第一次运行算法时忽略它吗?否则,我最终得到的平均值与第一次运行时的值基本相同.

.net c# performance

0
推荐指数
1
解决办法
194
查看次数