我正在写一个简单的回合制RPG系统.我有一个BattleScreen
类来处理绘图...屏幕.事情是,它必须知道关于我Player
班级的几乎所有事情.它Name
,HP
值,MP
值,JobName
,Level
,Experience
,Money
etc.etc.etc.为了把它写在屏幕上.我的Draw()
方法最终会从中抽取几乎所有变量Player
,并且它要求我在Player
公共场合制作几乎所有的东西
这让我相信让这个Player
类自己画出来更好一点,但最后我得到了需要调用的多个Draw()
方法BattleScreen
.如果Player
是主要播放器(具有所有数据和名称)的情况下的绘制方法,以及它在场边(只有精灵和HP/MP可见)的一个绘制方法,以及其他屏幕的其他方法.
两种方式都感觉很蠢.
这两种方式中的任何一种都被认为是"正常"吗?有没有更好的方法来设计它?
你不应该公开任何成员变量,因为这被认为是不好的做法.
你应该使用属性.
所以代替:
public string PlayerName;
Run Code Online (Sandbox Code Playgroud)
你应该使用
private string playerName;
public string PlayerName
{
get { return playerName; }
set { playerName = value; }
}
Run Code Online (Sandbox Code Playgroud)
或者甚至更短
public string PlayerName { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后,您可以像Corak已经提到的那样从外部将该属性设置为"只读":
public string PlayerName { get; private set; }
Run Code Online (Sandbox Code Playgroud)
然后从你的内部Player
你可以得到并设置值PlayerName
,但是从外面来看,就像在你的Draw
方法中一样,你只能得到它.您也可以稍后使用其他逻辑(例如验证)扩展getter/setter,而不会破坏任何其他代码.
注意:
注意:以下性能的考虑仅在有效的极少数情况下,你应该永远不要假设该属性有性能上的损失!如果你认为你可以有你应该使用不同的方法(甚至在释放模式与优化分析器可以给你这样的情况下,错误的结果)比较做性能测试这种情况.
正如克里斯正确提到的,属性可以是非常轻微慢然后成员,如果他们不内联由JIT(应具有自动性质几乎所有的时间发生的),因为"方法调用",为的getter/setter的.这是不是在大多数情况下,相关的,但在MANY每秒千个呼叫它可能得到相关.在这种情况下,您应该进行性能测试以查看是否是这种情况(您需要在启用了优化的发布模式下运行此类测试,而不仅仅使用分析器!)并且只有在这样的情况下才可以使用公共成员.
我在我的一个程序中有这样一个罕见的情况,它在每秒10k到100k的调用之间有相关性,但是我们仍然只讨论几百毫秒的100k调用.即使在这种情况下,如果你不需要你可以获得的绝对性能(我的情况就是如此),我建议使用这些属性,因为在我看来,在这种情况下,可维护性更重要.
归档时间: |
|
查看次数: |
483 次 |
最近记录: |