我目前正在开发一个简单的Java游戏,有几种不同的模式.我扩展了一个主要的Game类,将主要逻辑放在其他类中.尽管如此,主要的游戏类仍然非常沉重.
在快速浏览一下我的代码后,其中大部分是Getters and Setters(60%),而其余部分则是游戏逻辑真正需要的.
一些谷歌搜索声称Getters和Setters是邪恶的,而其他人声称他们是良好的OO练习和伟大的程序所必需的.
所以我该怎么做?应该是哪个?我应该为我的私人变量更改我的Getters和Setter,还是应该坚持使用它们?
我已经在C#中编程了一段时间,现在我想要提高我的C++技能.
上课:
class Foo
{
const std::string& name_;
...
};
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法(我只想允许对name_字段的读访问):
inline const std::string& name() const { return name_; }谢谢.
我知道由于舍入错误,浮点数不适合存储货币值.有没有一种标准的方式来代表C++中的钱?
我查看过boost库并没有发现它.在java中,似乎BigInteger就是这样,但我找不到C++中的等价物.我可以写自己的钱类,但如果有测试的话,我宁愿不这样做.
Allen Holub写了以下内容,
如果没有一些耦合,你就无法拥有一个程序.尽管如此,您可以通过盲目地遵循OO(面向对象的)规则来最大限度地减少耦合(最重要的是对象的实现应该完全隐藏在使用它的对象之外).例如,对象的实例变量(非常量的成员字段)应始终为私有.期.没有例外.永远.我是认真的.(您可以偶尔有效地使用受保护的方法,但受保护的实例变量是令人厌恶的.)
这听起来很合理,但他继续说,
你不应该出于同样的原因使用get/set函数 - 它们只是过于复杂的方式使字段公开(尽管返回完整对象而不是基本类型值的访问函数在返回对象的情况下是合理的class是设计中的关键抽象).
坦率地说,这对我来说听起来很疯狂.
我理解信息隐藏的原理,但是如果没有访问器和更改器,你根本就不能使用Java bean.我不知道如何在模型中没有访问器的情况下遵循MVC设计,因为模型不能负责渲染视图.
但是,我是一名年轻的程序员,而且我每天都在学习更多关于面向对象设计的知识.也许拥有更多经验的人可以在这个问题上权衡.
我对C++比较陌生,我认为我的问题最好通过例子来理解.在我的头文件中,假设我有
class myClass{
public:
double getVar1();
void setVar1(double newVar1);
void copyVar1(myClass* dat);
private:
double var1;
};
Run Code Online (Sandbox Code Playgroud)
在我的实现.cc文件中,在实现copyVar1方法时,我应该这样做
void myClass::copyVar1(myClass* dat){
var1 = dat->var1;
}
Run Code Online (Sandbox Code Playgroud)
要么
void myClass::copyVar1(myClass* dat){
var1 = dat->getVar1();
}
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,我使用getter方法代替.两者都可以在Visual C++中正常工作,但我想知道在实践中哪个更好用.
谢谢您的意见!
在Java中,代码约定简单明了,在这种风格中:
public:
int GetMyAge(){
return myAge;
}
void SetMyAge(int myAge){
this->myAge = myAge;
}
private:
int myAge;
Run Code Online (Sandbox Code Playgroud)
(我知道这是"同样的事情",但是)我已经阅读了大部分关于SO的相关问题,我仍然不知道用C++做"最好的"和"最官方的"方式.这不仅仅是一个偏好的问题,可以吗?
编辑:
好像它可以.
c++ ×4
coding-style ×2
getter ×2
oop ×2
setter ×2
accessor ×1
currency ×1
header ×1
immutability ×1
java ×1