我目前正在对C ++的一个小的2D游戏引擎,但我现在面临一个守护进程 - 我吸在设计,实际工作“类系统”。 有在我的脑海封锁禁用我看不到,我应该使用一个类,我不应该。 我正在读关于引擎设计的文章,其意要使用“国家”类来管理不同的游戏条目的状态(我使用一个int)。 它还建议,为游戏(不是IO /视频/声音等)的所有对象无论从渲染或不可渲染类派生。 这是聪明的。 我已经知道这是做的一个聪明的办法 - 我的意思是,Java中的每个对象是基类的对象吧? 聪明,我知道! 为什么我没有那样做? 我有什么阅读真正进入这种心态?
另一个例子。 我正在用Ruby(很简单)今年夏天,当然和我们应该设计一个露营地。 简单! 因此,露营是“阴谋”,每有一个电轨多少来衡量权力的客人已经消耗的集合。 我的设计是三个班,一个是露营 - 这反过来使用Guest和剧情类的阵列。 我的老师建议我用更多的类。 WTF(!)是我的第一个念头,在哪里,什么课? 一切都在我看来一类 - 直到我意识到,也许计应该是一个类? 眼下计是在剧情类的整数。
我想学习如何拿出一个面向对象的解决方案,我的问题 - 不只是如何使最明显的东西分成类!
提示/书籍/文章/博客?
我两岁到CS拼贴程度,并已规划作为一种业余爱好很多年! 我“只是”坚持 - 这是阻止我造成任何大的软件!
Answer 1:
我个人的经验是学习用面向对象软件工程面向对象软件工程,第二版由伯特兰·迈耶。
这本书是非常宝贵的我在那个时间,仍然是一本书从我学到最关于面向对象编程和一般的软件建设。
下面是它的一些长处:
- 在A部分:这些问题 ,软件质量的一个很好的定义。
- 在B部分:道路到面向对象 ,逻辑,一步步搜索OO技术的方式,使读者认为,调查工作正在现场进行,也就是,好像有还是没有已知结果。 你可能会获得你从这个部分寻找心态。
- 在C部分:面向对象技术 ,这本书的技术核心,你会让你的知识扎实,学习有关的合同,继承,泛型等设计非常有用的技术
- 部分d:OO方法:应用方法以及为设计更实用的方式,这也是我觉得非常有用。 例如见如何找到类(22),你可以找到网上 。
这些部分后,更高级的主题来,如并发(30)或数据库(31)。
由于书中使用的艾菲尔语言(由作者设计的),这将让你在正确的心态,教你去思考。 这将是很容易被这些观点应用到其他,或多或少二OO编程语言。
Answer 2:
面向对象
面向对象编程是关于询问的对象做一些事情:一个看似难以理解的概念正确适用。
Goban
考虑一个2D游戏板,像玩围棋 (称为goban)。
首先想到它需要完成其任务的行为。 这意味着上市的某个对象的行为,而不是决定行为操纵数据。 例如,一个基本的电路板可能有下列行为:
对于围棋的电脑版,可以很方便地让人们关注具体领域:
- 标记的交点(例如,三角形,数字,字母,圆形,正方形)。
- 从标记的交叉点删除的标记。
- 删除所有的标记。
请注意,一个goban并不需要提供一种方式,为客户提供在特定路口参考石。 相反,它可以回答有关其状态的问题。 例如,goban可以回答以下问题:
- 有没有在给定的路口黑色的石头?
- 是否有一个白色的石头,在一个给定的交集?
- 有没有在给定路口的标志?
这不是goban的责任,知道比赛的状态:即属于博弈的一个实例(有规则 )。 在现实生活中,goban简直是石头的舞台。
在这一点上,我们可以写一个goban接口不知道底层的实现将如何工作。
public interface Goban {
public void place( Stone stone, Point point );
public void removeStone( Point point );
public void removeStones();
public void place( Mark mark, Point point );
public void removeMark( Point point );
public void removeMarks();
public boolean hasWhiteStone( Point point );
public boolean hasBlackStone( Point point );
public boolean hasMark( Point point );
}
请注意如何板上干净地从规则和游戏分开。 这使得其他游戏(包括石块和路口)的goban重用。 该goban可以从通用接口(例如,一局接口)继承,但这应该足以解释认为,在对象方面的一种方式。
封装
在Goban接口的实现不暴露其内部数据。 在这一点上,我可以问你实现这个接口,编写单元测试,当你完成送我编译的类。
我并不需要知道你用什么数据结构。 我可以用你的实现上播放(和描绘)一Goban。 这是一个关键点,很多项目得到错误的。 许多人,许多项目代码如下:
public class Person {
private HairColour hairColour = new HairColour( Colour.BROWN );
public Person() {
}
public HairColour getHairColour() {
return hairColour;
}
public void setHairColour( HairColour hairColour ) {
this.hairColour = hairColour;
}
}
这是无效的封装。 考虑以下情况:鲍勃不喜欢有他的头发涂上粉红色的情况。 我们可以做到以下几点:
public class HairTrickster {
public static void main( String args[] ) {
Person bob = new Person();
HairColour hc = bob.getHairColour();
hc.dye( Colour.PINK );
}
}
鲍勃现在已经把头发涂上粉红色,并没有什么可以阻止它。 有办法避免这种情况,但人们不要做。 取而代之的是,封装被打破,导致刚性的,不灵活的,充满错误的,并且难以维护系统。
执行封装的一种可能的方式是通过返回的克隆HairColour
。 修订后的Person类现在使它难以改变头发的颜色为粉红色。
public class Person {
private HairColour hairColour = new HairColour( Colour.BROWN );
public Person() {
}
public HairColour getHairColour() {
return hairColour.clone();
}
public void setHairColour( HairColour hairColour ) {
if( !hairColour.equals( Colour.PINK ) {
this.hairColour = hairColour;
}
}
}
Bob可以寐,知道他不会醒的粉红色染料的工作。
Answer 3:
它支付要记住:OO本身并不是目的。 OO的关键是使发展,特别是维护的代码在产品的生命周期更容易。 当心“OO为OO的缘故”的思维定势。
Answer 4:
深入浅出面向对象分析与设计
我爱的Head First书,因为它们是有趣的阅读。 他们有练习和困惑划伤你的头。 我读过这本书,发现它非常好。
本书涵盖:
- 使用OO原则(封装和代表团)
- 开闭原则(OCP)
- 单一职责原则(SRP)
- 设计模式,UML,使用案例等。
Answer 5:
有在我的脑海封锁禁用我看不到,我应该使用一个类,我不应该。
当它归结为它类的复杂系统分离成彼此交互的简单零件的方式。 尝试创建类另有你会重复自己。
眼下计是在剧情类的整数。
是否规需要一个类? 什么将它变成一类的优势是什么? 这些都是那种事情,你总是需要问自己。
- 游戏引擎是很难设计。 这样的定义模糊的要求的分离是一个复杂的过程,在这里读到: 文章的游戏引擎
- 设计是迭代的,你会重构几次,不要被这个感到惊讶。
Answer 6:
有没有在这本书“的文章ThoughtWorks的诗集 ”由杰夫湾:他在其中给出了一组规则设计OOP sofware“对象健身操”:
- 仅使用一个级别每个方法压痕
- 不要使用其他关键词
- 包装所有基本类型和字符串
- 每行仅使用一个点
- 不要缩写
- 保留所有的实体小
- 不要使用任何类有两个以上的实例变量
- 用一流的收藏
- 不要使用任何getter / setter方法/属性
在第一次看它可能看起来太严格遵守所有这些规则。 请记住,即使尝试写一些代码,coplies他们会让你更好的面向对象设计。
Answer 7:
只记得从未有1解决问题的办法。 谈到一切都变成类也解决不了问题。 特别是微小的东西(如计)很可能是一个整数或浮点数成员的情节类中喜欢你了。
我的建议是,实践是一个好老师。 只要不断努力,并继续阅读。 随着时间的推移,你会越来越流畅。
Answer 8:
我大概从克雷格Larman's了解到大多数面向对象的软件开发UML和模式应用:介绍面向对象分析与设计和迭代开发 。
在他的做法,类派生从使用情况的系统方法:
- 用例中的名词被映射到类,
- 动词的方法和
- 形容词成员变量。
这当然适用于在问题领域比,也就是说,GUI控件的概念更好。 然而,从将要写入的程序的描述/使用情况下帮我找到比我省略这一步更好的抽象。
Answer 9:
对我来说OO没有“点击”,直到我读了一本关于设计模式。 如果你喜欢用抽象类,接口等概念已经舒服,这只是成功的一半。
下一步是找出为什么你应该更喜欢在组成继承,如何编写一个接口以及如何编写你的类,使它们分离和良好的封装。 设计模式显示您共同OO问题的解决方案,并帮助你组织你的代码秉承上述原则。
我不能推荐一下C任何特定的书籍++但GOF的书是设计模式(Java)的标准。 我喜欢的书,在一个特定的语言谈论设计模式,这样就可以得到具体的代码示例。 设计模式在Ruby中是相当不错的,因为是PHP:对象,模式与实践 。
我得到你的老师不是特别知道他在说什么的感觉。 “更多班”是由本身相当无用的建议。
Answer 10:
也许你会发现在思维模式由Bruce Eckel的有用。 你可以从他的网站下载这本书免费(我只能发布一个链接作为新成员,所以只需点击链接那里,你可以找到它)。 虽然,这本书是2003年,也许在这本书中提出的想法会帮助你成长为一般程序员。
Answer 11:
写一个真正巨大的软件部分,并在整个过程中,就会越大,越extensiblity你需要和更多的好一流的设计,你需要,因此下一次你会想前进,使你的类设计好在一开始的时候...
Answer 12:
其中一个这有助于进入OO的心态,与实践,此前描述的职位一直沿着东西,是重写/改善您使用面向对象的原则编写的现有代码。
例如 :
一个。 在情况下有很多的if / else结构那么很可能你能想到有一个类结构,相应地分配分支代码,并使用多态的。
湾 任何使用运营商一样(的instanceof在Java中)将显示编程的具体类型和你能想到如何instanceof检查可以摆脱的。
C。 使用“得墨忒耳定律”为指针,看到类之间的耦合是高
在一定程度上“测试驱动开发”的做法也帮助了我,因为它迫使你去思考的接口/行为方面的一类被暴露,而不是仅仅集中在如何将问题最好的解决方案可以被编码。
Answer 13:
拿出一套合理的事情,大概应该是对象(因此,班)一个简单的方法:写下你的任务的问题描述,如:
在露营地有客人,每个客人访问了几个网点。 该软件应该能够管理由每位客人消耗的功率,所以应该知道一个客人,并通过每个出口消耗的功率使用的插座。
现在,创建所有的名词的列表哪些类(=类型的对象)涉及您的问题的一个好主意:
这不一定是一个明确的清单,但它是一个良好的开端。
Answer 14:
哈哈。 我记得这一点。 整个“地狱请问这是怎么OO事工作吗?”。 只要坚持下去,在某些时候,它只是点击。 这真的是像一个灯泡回事。 一会儿它并没有真正意义,然后一秒钟后,你会在课堂上编码的一切行动。
尝试下载一些开源工具,你很可能会最终使用和阅读的代码。 它会给你一些参考您的代码风格反对。
Answer 15:
彼得·科德和Ed Yourdon的几年前写了一本书了。 虽然不是充满了新言过其实methdologies, 这本书提供了对象样式思维打下良好的基础。
Answer 16:
在我看来,我已经阅读学习面向对象概念的最好的书之一是:
面向对象的思想历程
对我来说,这本书真的让你在面向对象的方式思考(当然,线索是在标题!:)这是相当语言无关,包含遍及VB.NET,C#和Java文本一些小的代码示例和经常引用许多“大师”在OO分析和设计,像世界格雷迪Booch的 , 马丁·福勒等人。
由于这本书可以帮助您在面向对象的思维方式,它会经常拿一个具体的例子,并显示接近问题的OO方式和程序的方式之间的差异。 这可能是一个很大的帮助,如果你从更多或程序背景的。 这也倒是喜欢的东西UML来帮助解释和理解背后的类完整库设计(例如框架)和类还含有丰富的类层次使用的概念,如聚合和组合设计之间的相互作用。
文章来源: Learning object oriented thinking [closed]