11

好的,所以我已经在 Delphi 中编程了 3-4 年,并认为自己是一个对概念有深刻理解的中级应用程序设计师。但是我怎样才能变得更好?我一直在查看我经常使用的几个组件的来源(virtualtreeview、asynccalls),其中的代码让我很困惑。是的,我可以理解其中的一部分,但其他事情就在我头上。

那么,提高我的编程能力的最佳资源在哪里?书籍、博客或其他信息来源?

4

10 回答 10

11

编程技能就像肌肉;改善它们的最好方法是锻炼它们。如果你想学习成为一个更好的编码员,那就做一个比以前更难的项目。想出一个你想写但不知道怎么做的想法,然后开始写。一旦遇到你不理解的概念,研究它们,你最终会在你的曲目中添加新的概念和技能。

于 2011-02-16T01:10:58.157 回答
10

理解使用你不熟悉的概念的代码是很困难的。我的建议:

  • 挑一两个你不理解的项目,重新实现它们。根据您的问题,尝试编写自己的树(或列表)组件,并尝试编写一个简单的线程框架,您可以在其中分派作业并在某个时间点恢复它们的工作。这些是您提到的两个项目的简化版本。

    作为程序员,你边做边学。再多的理论也无法弥补解决和解决问题的经验。[*]

    当您解决这两个问题时,您将遇到一些与Virtual TreeviewAsyncCalls的作者相同的问题。(如果您遇到问题,请在此处提问!)您不仅会学到与他们所学相同的东西,而且您可能会回来重新阅读他们的代码并理解他们正在做的一些事情。

    不要被周围的概念(原始项目)和复制代码的工作实现所诱惑 - 随意查看它以获得灵感,但不要复制它。自己写吧。

    请记住,Mike Lischke 和 Andreas Hausladen 都是非常聪明的人。如果工作很辛苦,不要灰心。许多程序员的整个职业生涯只是为了胜任(听起来你就是这样),而不是强迫自己去尝试或学习更难的东西(所以如果你不介意我这么说,你问这个问题很好!)

其他几个想法:

  • 学习另一种语言。Delphi 很棒,但是你用一种语言“思考”,所以如果你学好另一种语言,你就会接触到其他概念或思维方式,或者做同一件事的不同方式。这真的让你大开眼界。

    例如,C++ 非常适合使用RAII模板元编程(这比 Delphi 的模板所允许的更强大)、各种额外库中的一些非常令人惊奇的东西,例如boost和射击自己的脚 :) 函数式语言将完全改变你的想法(我不得不承认在这里有点虚伪:我已经接触过它们,但我自己并不“知道”任何东西。我想。) 目标 C可能有利于不同的看法面向对象意味着什么(它和 C++ 都是面向对象的基于 C 的语言,但非常不同。)你明白了。

  • 查看这些特定项目:此页面上的一个答案建议逐行浏览。我发现理解我之前没有使用过的代码可能会让人不知所措。我曾经在 Embarcadero 工作人员的博客上读到过一些使用分析器的建议,因为它会给你一个很好的高级视图(a)程序的所有类/方法/部分和(b)最常见的使用过的,可能是最重要的部分,以及它们是如何连接在一起的。我不能相信这个建议,但我认为这是个好建议。我建议使用AQTime

    正是出于这个原因,我发现诸如“查找 Foo,研究源代码”之类的答案没有帮助:您是编码员,您当然会查看源代码! 如何看源码,这是一个比较有趣的问题。

  • 最后,如果你到了“查看几个 [项目] 的源代码而那里的代码只是让 [你] 难过”的地步,或者如果你做了上述一些事情并且不理解某些事情,在这里问!

[*] 脚注:我并不是在提倡不了解基本理论,只是通过自己做一些必不可少的事情来获得知识/信心。

于 2011-02-16T03:32:03.567 回答
7

您必须阅读Steve Trefethen的这些文章:

提供了一个优秀的 Delphi 开发人员应该处理的主题的一个很好的总结

  

于 2011-02-16T03:57:42.577 回答
4

(对我来说)理解代码如何工作的最好方法(对我来说)是我无法通过单独查看代码来了解代码,并观察有问题的代码。设置一些断点并在代码运行时开始跟踪代码。

您这样做的次数越多,您以后通过查看代码来跟踪代码的能力就越提高。

另外,您还没有这样做,我强烈建议您阅读以下书籍:

设计模式:可重用的面向对象软件的元素 (ISBN 0-201-63361-2)

写于 1994 年,它在今天仍然和当时一样重要(如果不是更多的话)。

重要的是它教会你识别代码中的某些模式,并为你提供一个词汇表来描述整个代码部分的作用,只用一个术语。

在您在脑海中构建的关于某些复杂代码的作用及其交互方式的模型中,您不再需要保留所有微小的细节,而是可以在脑海中构建更高级别的抽象来描述代码自己作为基于某些设计模式的功能块的交互。

这自然假设有问题的代码设计得很好。有时,某些代码完全是一团糟,可能会让意大利面嫉妒,而您无法遵循和理解代码并不是您的失败,而是编写代码的人的失败。

于 2011-02-16T04:38:14.320 回答
4

我认为,如果您:

  1. 学习构建组件。阅读 Ray Konopka关于自定义 delphi 组件的书,或他的EDN 文章。

  2. 研究 JEDI JVCL 和 JEDI JCL 资源。Jedi API 库和 JWSCL 作为信息来源也很有价值。MSDN 文档 (Microsoft) 也非常宝贵,它是您需要与之交互的各种 Windows 子系统的平台文档来源。

  3. 获取 Marco Cantu 的巨著 Mastering Delphi 书籍,或 Texeira 和 Pacheco 的 Delphi 开发人员指南。

  4. 了解测试驱动开发、单元测试、版本控制(学习几个系统,如 Subversion、Git、Mercurial 等)、持续集成和其他专业级技术。

于 2011-02-16T01:34:10.483 回答
3

如果你想找出不属于你的代码,你必须从头开始,变得肮脏。将你想理解的代码部分分解成一个“最小”的程序,并逐行调试。大多数情况下,这会告诉你在低级别发生了什么。有时,仅此一项就可以为您提供所需的理解。

但是,当您对代码结构的工作方式感到困惑时,请在 Google 中输入部分违规行以获得答案。这通常会引导您阅读讨论类似代码的博客文章或文章,这些代码解释了概念和代码的工作原理。

有时我会去Google Code Search并选择 Pascal/Delphi 语言进行搜索。我发现这里的代码提供了不同的视角,并且通常包含有助于理解这些想法的注释和其他信息。

如果我想不出其他方法,我会使用 StackOverflow,它是来自知识渊博和经验丰富的 Delphi 程序员的 Delphi 信息的绝佳资源。如果这是你,作为一个已经是中级程序员无法弄清楚的东西,那么它可能会在 SO 上提出一个很好的问题,你会在短时间内得到一些很好的答案,我相信这将有助于你的理解和学习.

于 2011-02-16T02:31:57.217 回答
2

编程很复杂。

典型的 RAD 应用程序在事件处理程序中包含带有代码的表单、带有查询的数据模块,而不是单个类。

您可以编写数百个这样的应用程序,除了如何使用各种组件及其属性和事件外,什么也学不到。

这是 Delphi 的主要问题,以错误的方式做事很容易也很自然。辐射 = 坏。可悲的是,可能 90% 的应用程序都是这样编写的。

那么这种方法有什么问题呢?它缺少任何架构。为什么这么糟糕?它不是抗变化的。当您的需求发生变化时,您将不得不做出比设计合理的应用程序更多的更改。

现在人们普遍认为应用程序应该被结构化为层。

典型的层分离是

  • 业务对象/规则
  • 数据映射/持久性
  • 图形用户界面

通过干净分离的业务层,您可以拥有 Win32 GUI、Web GUI、移动设备 GUI...

使用干净分离的 Persistence 层,您可以拥有相同的 Business 和 GUI 层,但可以从 Interbase 切换到 Postgress。

编写测试也容易得多。

现在让我警告你,这是一条漫长而艰难的道路。掌握它需要数年时间,而且你永远不会完全完成。

当你把你的应用程序设计得很好并且设置了这些层,你让它工作,你兴奋地把它展示给你的同事,他们会给你一个奇怪的表情,然后说:好吧,我把这个查询放在表单上,执行,它看起来一样。但你会更清楚。

我不同意学习另一种语言的建议。也就是说,恕我直言,只是绕过了这个问题。正确组织和构建应用程序的技能与语言无关。任何真正的面向对象语言就足够了,因此此时无需学习另一种语言。

我也不认为查看 VirtualTreeView 或类似控件的源代码会教你很多东西。您将了解 Winapi,但虽然有用,但对应用程序设计没有帮助。

总而言之,谷歌搜索有关应用程序设计、业务对象、架构、OPF、模式和测试的资源。

于 2011-02-16T13:23:10.980 回答
0

我不确定你的问题有一个简单的答案。

不断磨练对基础知识的掌握的一种方法是通过练习和重复。实现这一点的一种有趣方法是所谓的代码 kata,它从武术中获得灵感。

这个概念本身与语言无关,并且非常强调 TDD,这是我喜欢的。 朱利安巴克纳尔似乎也是一个粉丝。有些人甚至记录他们的katas。一个快速的谷歌搜索会出现很多不同的参考。

于 2011-02-16T16:07:39.960 回答
0

如果您作为团队的一员工作,请使用 Code Collaborator 或 ReviewBoard 等工具参与同行代码审查。您不仅可以向他人学习以及他们对您的代码的评论,还可以培养对自己工作的批判性眼光,并很快开始更好地编码。

于 2012-04-30T02:19:08.240 回答
-2

virtualtreeview 的代码很糟糕。别担心。

要真正精通面向对象编程,您可能想尝试一下 Smalltalk。对于完全不同的东西,添加Seaside Web 框架。

[编辑] 研究 Seaside 是个好主意有几个原因。它是对 html、css 和 javascript 等暴行创建出色抽象的主要示例,从而可以以合理的方式进行 Web 开发。它展示了如何创建流畅的界面以及如何使用它们来提高工作效率。

经过 20 年的 Turbo Pascal 和 Delphi,我的编码风格在使用 Smalltalk 后得到了显着改善。早该发现的。

另一方面,Virtualtreeview 包含大量结构不良的代码。没有抽象,方法太长,数据结构不好。它唯一的优点是它被广泛使用,所以如果你坚持使用良好的部分,你就不太可能遇到错误。

[edit2] 在您熟悉 Smalltalk 和 Seaside 之后,尝试在 Gemstone(一个面向对象的数据库)上运行它。这将向您展示数据库应该如何(不可见),并让您从此反对关系数据库。

于 2011-02-16T01:01:43.223 回答