design - 好的,我不是一个新手了。 下一步怎么办?

  显示原文与译文双语对照的内容

于在一定意义上说,我是为了便于reference,相关仍然非常多的初学者,但我不需要阅读 C++ 底漆或者 C++ 21天中学习,或者至少,我只窥视一下时不时 then. 我的问题是什么?

基本上,我开始写一个小游戏来帮助我的学习过程。 在在这个过程中,我学习到的任何东西你需要知道要调用的大部分 我知道所有关于重载,模板,异常,RTTI,多态性,等等 我也向前迈出了一步,并开始使用STL及其容器和算法。 最近我开始阅读关于Boost库的文章。 我还阅读了一些关于设计模式的好材料,并实际应用了一些关于这个游戏的想法。

但是现在整个东西在大约 3 k的代码行之后停止了。 为什么不是我不懂语言或者没有想法。 但知道词汇并有创意并不是一个小说家。 甚至知道如何写句子还不够。 你必须理解流程,结构和其他所有的东西,才能写出一个成功的小说。

在我的实际案例中,因为我更趋于平稳。浪费了大量时间结构化使馆藏图书的正常工作,比如 我是是否要发送某种类型的事件才能执行其他的数不清。 程序显然编译良好,但运行时行为可能不是完全按照预期。 我也在失去谁拥有什么,谁应该负责什么,等等。 也许我在算法方面不够强壮,或者可能是面向对象的设计- 我不确定。

事实在于,但代码看上去更像一个混沌混乱,不是这么多在实际的代码的外观方面,为在该方面的创意自身及其相互关系。 维护时间已经过多了。

无论如何,对于长期的帖子,抱歉,但我想知道下一步应该怎么做。 我看了一下书的线程,这是非常棒的,但我希望有一个更具体的方向。 我需要花更少的时间在重写上,并在实际写作上更多。

时间:

好的,我有 2个答案- 选一个最相关的。

首先,要成功完成你的应用,你需要领域特定的信息。 这与 C++ 无关。 如果你是编程游戏,你需要阅读更多关于游戏如何实现的信息。 否则,就像试图写一本写着字典和语法指南的犯罪小说,继续类推。 它不仅仅是关于流程和结构的- 那些仍然是低级的概念。 你需要检查人们如何接近流派,然后你就可以从中挑选出你需要的流类型和结构。 杂乱的代码常常与不完全理解规范一样,因为它不知道如何有效地编程。 了解域有助于你确定清晰和well-understood解决方案。

我建议来个游戏编码完整( 3 rd ) 书由迈克McShaffrey为一个很好地了解整体的方法来制作一个游戏。 我还听说过好的事情关于游戏引擎架构由 jamie 格里高利的但我自己还没读过。 注意,这两个书都相当复杂,并且专注于industrial-strength解决方案。 如果你不需要industrial-strength解决方案,你可能会问自己为什么在其他语言更适合快速开发时使用 C++ 来编写游戏。 Flash 是一个不错的选择,例如。

这就引出了我的第二个答案: 编写你真正关心的代码。 如果你只使用这个游戏项目的媒介物学习这门语言,那么有很大可能性你丢失了兴趣当你走到这一步,你有关的语言和不得不中断学习新事物会开始担心事情具体到游戏的都是更多关于重新排列了,一些你已经了解的这个。 这通常是你应该把学习融入实际解决方案的地方,而不是你必须强迫自己做的仅仅是教学的原因。 当任务有趣时我们学习最好。

于我当well,相关经过多年现场我必须说,所有这些事情继续成为题里 维护和开发大型项目是很困难的。 它变得越多似乎越大新组成的开发通常为维护的各个要素和重构旧代码。 你可以走到研讨会和crap像是有,但老实说,我不认为这些人知道如何解决这个问题要么,我总是站在想如果我真的了解了什么有用的等我再回之前我发现我还在之前在哪里工作。

每个项目都是不同的。 这就是不喜欢可以从中学习一些秘密的技巧集- 那就得把这一切简单。

问题是,人的大脑只是无法在其中抓住了足够信息的一部分进行一次,以便能够跟踪的所有内容都需要发生在程序中的任何可以调整的复杂性。 你唯一能做的来缓和来构成项目转化为较小的区域,并可能来跟踪这个过程。 这才是需要练习的。我看过拥有数不清的书,去了吨的研讨会,学院等。都不是它真的确实多,不过给我一对夫妇的想法在这里和那里。

如果你确定坚持一定的原则,它会让你变得更加容易。 在你ask,事情比如RAII和模式谁是一开始但你也能加入"面向对象编程的原则";之间存在某个地方 4 -10 depending. 诸如协议 tcp,LSP,SRP等。。这些帮助来识别当你们使用不维护的代码。

当然这些都不是治愈的方法。 它只是它需要练习,如果我的经验是任何指标些。。它采用f'n 多年的它。 欢迎使用该字段。

编辑:

且只有你等待,直到你的作品不仅在试图理解一个大项目更集成和跟踪还有数个变能力,所有都有他们自己的产品有什么好/易的开发人员来处理成任何人都起来的东西哪怕有一点可能要理解。

这是一个的补充答案 。 它不是要取代所有其他答案,但是已经要添加到的大量数据和信息有关的网站链接。 有一些很好的答案,我有upvoted之沟通,但我认为,所有这些错杀一个要说的。

你的问题不是关于

  • 游戏设计: 这个点地址的kylotan和 steve314的答案。 开发中你 game, ( 这很棒) 。是的,你就继续卡住 进一步你是困在一个值,有查询理由不佳的失速不在线束段上的C++ 编程语言的知识。 因此,收集领域特定知识的建议是合理的。 但是,我认为在这两者之间有一个点: 应用程序设计/程序结构/软件工程/任何你想调用它的东西。 你应该处理这些点。
  • 设计模式: 这个点地址 回答关于本主题的书籍 设计模式是整个软件设计的子集,因此解决了我在上面提到的问题。 然而,仅仅学习它们并不会教你什么时候,哪里以及如何应用它们。 他/她的有限experience,那我觉得甚至暂时性地说,一种设计模式在手中的书本的一个不成熟的程序员产生更大的伤害,而不是帮助,当他/她目前正与一个巨大的工具集在错误的情况下based.但不知道如何来应用它,所以也选择了错误的工具

你的问题实际上是关于

你的问题是一个的导师。 是,你已经学会了在 C++ ( 我不能说 myself^^ ) 中进行流畅的编程,你可能不再是初学者了。 但你是个不成熟的程序员 ! ( 每个好程序员都是不成熟的,直到他的生命结束) 。 和你沿着这些线条 ~ of,我想我想我需要一个导师,一个人,它将有一个再把你的代码和建议你可以怎样改进基于他多年长期的经验虽然可能与你分享一些的他/她 passion:

Mentor:"Wow, I really like Your game, nice job mate! Hm, that's the part that causes You trouble?, let's see. I think these two parts of Your programm know too much of each other and every change in one results in the need of the change of the other. But we can decouple them with an interface, it's easy, you'll see =D...".

总结:从我的观点来看,你应该专注于软件设计,毕竟你学会了语言。 一些答案也指出了这样的问题,比如"语用程序员"" 中而且,当你找不到一个好的顾问,我觉得这些都是最好的办法,但是从我的观点看他们永远也尽可能有效地一位经验丰富,激情的程序员,他可以解释概念,模式,设计决定( 和原因) 。。 以一种易于理解的方式给你。

为了不会松动兴趣过早as,掌握编程需要长,不要放弃,代码的东西,你们喜欢 Kylotan 建议。我希望你能最好的 !

不要气馁。你正在进入软件开发的主要部分。 代码组织和保持你的思想是如何相互关联的,这是任何实质性编程项目的重要部分。

试着从项目中休息一段时间,也许只是一天。 返回并制作你的程序所有关键部分的映射以及它们之间的关系。 绘制出来。随着你的项目向前移动,保持更新。 听起来你需要某种参考来提醒你项目是如何工作的。

开发不仅仅是编程,它是多个学科的组合。 你也可以试着阅读一个关于设计模式的书,就像这个线程中其他人建议的那样。 我已经使用应用UML和模式在一定成功,而且我认为你应该能够找到一个PDF副本就更容易。

下面是我推荐的内容:

  • 获取一些关于编程模式的书籍( 关于 SingletonFactoriesReflection 和列表)
  • 练习不要停止调整代码。 于开发为了便于),当你说你到相关 3 k 行代码,重构,直到你感到厌倦并开始一些新的东西( 使用引用,请尝试,使你的每个项目最好的它们可以--变得更加简单
  • 遵循开源项目在 C/C++ ( 也许内核) 使用代码和尝试拿起并获得能够满足--理解为什么人们觉得它的好,是什么让好了好,然后开始构造自己的( 了解如何支持他人的程序) 判断条件。 在Github上查看 C++ 项目。

另外,看看你的问题和其他类似的答案。 已经在这个领域时,很多不错的responses,这是一个非常流行 question.

注意: 就像其他人所说,学习其他语言( 在我看来) 极其尤为重要。 范例应用不同,编程语言有多种不同的规范。 最重要的是,享受它的乐趣。

我认为是时候停止架构架构并开始完成你的应用程序了。 对。你说"运行时行为可能不完全符合预期"和虽然你可能意味着有时你就不会得到你所预期的,我有一个偷渡来的猜疑,你都不是很熟悉,这段代码的运行时行为,你是lavishing朋友对我们有所了解, 我用过的家伙谁会一遍又一遍重写函数一次"用于性能"当该应用作为整体是无法构建和那个特殊的函数甚至从来没有被执行过一次。

我认为整个编写代码会使整个堆变得更加合理,如果你现在花一些时间运行代码,测试代码,在哪里工作以及如何处理它。 在这个过程中,看你会找到所有你要做的只是把一个地方的某个地方移动一行,然后另一个和你必须改变放置处 16函数调用到所有需要一个额外的参数或者检查是否有一个有魔力的返回值或者什么而当你是shoveling掉在其中一个部分的代码你将要为你有一个灯泡的时刻连接到一些你已经知道,就成了混凝土。

如果你的游戏在运行时运行得很完美,那么就模拟一下业务世界。 在现实世界中,企业开始销售的事情他们并没有采用税率变化的某样东西进行销售,或者体积上提供折扣优惠,或者突然有两个他们都鼓吹他们只会有系统。 对你的游戏做类似的事情。 在你universe,哪种如果可以有两个武器或者背包可以容纳另一个背包或者可以 Wear 有环,它使你更强大比最大值或者其他任何做法是 现在,你需要对代码做什么? 同样,部件会很容易,部件也会很痛苦。 将疼痛连接到书的内容。 注意如果使用STL或者使用升压或者使用设计模式在代码或者重建 11 ph值。时间已经做了这个痛苦更好或者更差。 首先注意到哪些技术被轻易,但做了硬的,都很难在第一,但所做的更改容易,一开始并进行更改或者达到了涅磐的简单容易。

然后你将准备好我们会再来一遍在一个完全不同的应用程序在一个完全不同的领域,并再次学习同样的事情,并且从此将开始构建一个感 vs 项目特定的规则普遍原则。 当然,既然你仍然在一个团队中,他们将不会像他们一样 universal,但这将是进步。

大多数人在开始时并不这么想。 准备这么多是不对的,只是不同寻常。 但是单独思考并不能解决问题。 单独设计模式不能取悦用户。 所以运行你的代码并做什么使运行时行为成为你想要的。 从这个过程中学习关于你的架构和方法论的元课程。

无论你是使用数据流图,思维图还是uml图表,花一些时间在视觉上组织你的想法,你的目标。 保持非正式并做最适合你的工作。 试图把它全部放在你的脑子里几乎是不可能的。 我不是崇尚文档化你的系统,只是在了解你的想法,保持该图表仅围绕只要他们保持有用。 你可以探索多种概念和解决方案在很少的时间内就需要花写到,不管是测试驱动与否。

有人提到 Larman应用UML和模式 。 于这个cpu或者其他任何相关architectural,有用的,虽然你可能不那么准备完毕, 如果你是,一定要学习一些模式。 它们可以帮助你组织你的想法,也可能没有帮助,这取决于你的领域。 理解你的域至关重要。 用于域分析和设计的谷歌。 另外一个很好的书,尽管java为中心的,是 生长面向对象软件,根据上面测试。 在设计系统以及通过测试和模拟对象时,作者提出了一些非常好的设计系统的想法。

一些人已经提到学习另一种语言。 当学习另一种语言时可能导致一个真正的什么想法,我相信说得详细则来自于先进的设计理念与体系结构,并期望得到认可,深入地理解分析。 当然,它们都提到建模,但是建模本身就是一个工具。 在敏捷建模中看到Scott的东西,以获得出色的建议。

我想解决这个一个问题你凸起 我也失去跟踪谁拥有什么,谁应该承担处理所等等的 这是一个非常好的问题 !

在看似"随意"times,如果在这里出错,代码最终被spaghetti-looking多于优雅,而且要非常不稳定和 crash.

两方面的问题:对象生存期以及对象所有权 。 在UML中,纯实心菱形 vs 与空心菱形之间的细微区别,但我不想讨论UML语义。

对象生存期处理对象什么时候被实例化以及什么时候销毁。

对象所有权要处理的对象,谁负责谁负责instatiating销毁该对象,并维护一些"引用"( s ) 到对象( 是,一个对象可以被许多其他对象引用) 谁 有趣的是,可以有 1个对象执行所有的creation/referring/destroying, 或者不同的对象。 显然,这两个问题是 hand-in-hand ( 例如 。 对象的生命周期由负责创建/销毁对象的对象定义。

很多时候,对象完全由其他对象拥有,它们的生存期正好匹配,比如 一个CPerson对象包含 2个字符串对象,名称和地址。 然而,一个源自 CPerson CEmployee对象还可能有,而这些 CEmployer CEmployer对象的一个成员,它是一个容器对象,因为该CEmployer对象的生命周期是由这一个CEmployee不得"拥有"completey不同于CEmployee的生存期的对象字符串,然而CEmployee的名称和地址,归 sub-class CPerson,因为线程的生存期内是相同的。

这可以被建模为


class CPerson
{
 private:
 string Name;//Name and address strings are completely OWNED by CPerson
 string Address;
};

class CEmployee : public CPerson
{
 public:
 HiredBy(CEmployer *pNewEmployer);
 DownsizedBy(CEmplyer *pEmployer);
 private:
 CArray<CEmployer *> aEmployers;//I do NOT own any of these CEmployer objects
};

问题 to-be-answered: 谁创建了CEmployee对象? 谁销毁了谁创建了CEmployer对象? 谁销毁了它们其他代码如何访问特定的CEmployee对象- 通过雇主使用雇员标识? 通过使用SSN的单一 CMap?

如果你正在使用框架并从框架的类派生大量的类,那么许多生存期问题都是由框架实现的,但是你仍然需要对指针进行取消引用,并发现它已经被删除 ! 谁写的什么时候我怎么没知道它被安装在删除?

如果你对这些生存期的问题负责,那么你就得详细设计。 可能会导致不适当的对象生存期实现崩溃( 通过取消引用已经删除的指针),或者内存泄漏,它可以成为一种游戏类型中的实质性应用( 假设你从未删除任何"地面轮廓"图资源对象和 30分钟进入游戏后它不稳定,由于可用系统资源 GDI O/S 或堆内存)

然后在栈中分配的函数中的对象,会被利用需要auto-matically销毁该变量时超出范围时容易谈到终身/所有权问题。 但是,由于它的设计要求,必须动态创建的对象,或者由于运行时动态行为,必须在堆中具有thought-out生存期/所有权设计。

是的,我说的是微妙的UML实心实心菱形空心菱形。 设计并文档化,这将使你的一组类更易于使用。

两个建议:

  • 学习其他语言,如 python 或者 Java 。

  • 阅读大量代码。 ( 在开源项目中例如)

这就是你对编程世界的愿景。

我认为你的问题是你对语言的学习太多了。 学习如何最好地使用语言和设计代码随时间和实践而来,除非你正在创建实际的程序,否则你没有真正的实践。 是时候潜水了。

那么什么是最好的方法来获取东西? 大多数软件,特别是像游戏这样的可视化软件,使用了一个框架来处理大量的样板细节,并指导你的代码结构和结构。 如果你开始使用一个关于如何使用GUI框架的教程,你很快就可以充实你的应用程序部分了。 然后,一旦你在那个框架中做了一些事情,代码就会自己编写。

...