如何轻松阅读代码

时间:2009-07-30 14:06:27

标签: c++ design-patterns

我是专业发展的新手。我的意思是我只有5个月的专业开发经验。在此之前,我自己或在大学学习。所以我在查看问题,并在此处找到有关代码质量的问题。我自己也得到了一个与之相关的问题。如何提高我的代码理解/阅读技巧?它还会提高我写的代码质量吗?是否有比匈牙利语更好的代码符号?是否有任何非常好的C ++设计模式书籍(或者语言无关紧要?)? 感谢您提前回答这些问题并帮助我改进:)

P.S。 - 我也忘了告诉你我正在用C ++和C#语言开发。

14 个答案:

答案 0 :(得分:18)

我发现只有这样才能更好地阅读其他人的代码并且阅读其他人的代码,当你找到一个你不理解的方法或语言结构时,请查阅并使用它直到你明白发生了什么事。

匈牙利表示法很糟糕,今天很少有人使用它,它更像是程序员之间的一个笑话。

事实上匈牙利名字的名字本身就是一个笑话:

  

“匈牙利语符号是   因为很多人难忘   一串不可发音的辅音   模糊地类似于辅音丰富   一些东欧的正字法   语言“。

来自How To Write Unmaintainable Code

  

“匈牙利表示法是战术   源代码核武器   混淆技术;用它!由于   源代码的庞大数量   被这个成语污染了什么都没有   更快地杀死维护工程师   比计划好的匈牙利表示法   攻击“。

在这件事情上,有一句话可以说几句话。

  

“将函数类型编码为   这个名字(所谓的匈牙利语   符号)是脑损伤的 -   编译器无论如何都知道这些类型   可以检查那些,它只会混淆   程序员。“

     

- Linus Torvalds

编辑:

取自Tobias Langner的评论。

“Apss Hungarian和匈牙利系统之间的区别见Joel on Software”。

Joel on Software提供了有关如何阅读名为Reading Code is Like Reading the Talmud的其他人代码的提示。

答案 1 :(得分:12)

  

如何增加代码   理解/阅读技巧?

读取读取读取。从错误中吸取教训。在SO和其他地方查看答案。当你可以回想一下你写的一段代码并且去“啊哈!我应该完成xyz!”那你就是在学习。阅读一本好书,选择您的语言,超越基础并理解更高级的概念。

然后,除了阅读:写写写!编码就像数学:你不会在没有实际解决问题的情况下完全克服它。瞥一眼数学问题的解决方案不同于拿出一张白纸并自己解决它。

如果可以的话,也可以进行一些配对编程,以了解其他人如何编码和反复思考。

  

它也会提高代码质量   我会写吗?

见上文。随着您的进步,您应该提高效率。阅读有关设计模式的书不会发生这种情况。它将通过解决现实世界的问题并理解为什么你的阅读有效来实现。

  

是否有更好的代码符号   匈牙利人?

这取决于。通常我会避免它们并使用描述性名称。我可能使用匈牙利语表示法的一个例外是用于UI元素,例如Windows窗体或ASP.NET控件,例如:使用 btn 作为提交按钮的前缀( btnSubmit < / em>), txt 用于TextBox( txtFirstName ),依此类推,但根据所使用的方法和模式,项目与项目不同。

关于UI元素,有些人喜欢按字母顺序保存,可能会在最后添加控件类型,因此前面的示例分别成为submitButton和firstNameTextBox。在Windows窗体中,许多人将表单命名为frmMain,这是匈牙利语,而其他人则更喜欢根据应用程序名称或表单目的命名它,例如MainForm,ReportForm等。

编辑:请务必查看@Tobias Langner在对早期回复的评论中提到的Apps Hungarian and Systems Hungarian之间的区别。

Pascal Case通常用于方法名称,类和属性,其中每个单词的首字母大写。对于局部变量,通常使用Camel Case,其中第一个单词的第一个字母是小写,后面的单词的首字母大写。

您可以从.NET Framework设计指南中查看命名约定等内容。有a book,其中一些是on MSDN

  

还有什么好书   C ++设计模式(或语言   无所谓?)?

设计模式应适用于任何语言。一旦理解了该模式的实用背后的概念和推理,您就应该能够以您选择的语言应用它。当然,不要以“一成不变”的态度对待一切;模式是目标,语言之间的实现可能略有不同,具体取决于您可以使用的语言功能。以Decorator pattern为例,see how C# extension methods allow it to be implemented differently than without it

设计模式书:

Head First Design Patterns - 使用Java的好初学者介绍,但代码可用于C ++和C#作为下载(请参阅the book's site上的“书籍代码和下载”部分)

Design Patterns: Elements of Reusable Object-Oriented Software - 经典四人组(GOF)

Patterns of Enterprise Application Architecture - Martin Fowler

如果您正在寻找C ++和C#中高质量编码的最佳做法,那么请查找“Effective C++”和“More Effective C++”书籍(由Scott Meyers撰写)和“Effective C# “和”More Effective C#“书籍(比尔瓦格纳)。他们不会牵着你的手,所以你应该对语言有所了解。 “有效”系列中还有其他书籍,因此请确保您能看到适用于您的语言的内容。

我相信你可以在这里搜索其他推荐的阅读材料,所以我会在这里停下来。

编辑:在匈牙利表示法问题下添加了更多详细信息。

答案 2 :(得分:9)

我不能代表其他人说话,但根据我的经验,我发现我学到了关于使可读和/或一般更好代码的最佳方法正在阅读(并最终清理)很多其他人的代码。有些人可能不同意我,但我认为这是非常宝贵的。这是我的理由:

  • 当你开始编程时,很难确定什么是废话而不是垃圾与好。在制作优秀的代码时具有逻辑性,理性和极其聪明的帮助,但即使这些因素也不总是有所贡献。通过阅读其他人的作品和做肮脏的工作,你将体验到哪些有效,哪些无效。最终,你将能够在精神上导航其他人必须穿越的雷区,你将准备避开那些相同的雷区。

  • 通过阅读其他作品,您可以深入了解他们的思维以及他们如何解决问题。仅从建筑或技术方面来说,这对你来说是非常有用的 战术好坏。通过阅读其他人成功或不成功的实施,你已经获得了这些知识,而没有投入他们学习它的实际时间

  • 设计模式非常有用。只有时间和经验可以帮助您了解适当的模式,无论哪个问题。如果他们已成功构建了一些可能对您有用的模式,请再次阅读其他人的代码。

  • 在处理人们工作不足的极端问题时,您将学习研究并深入了解您正在使用的任何系统/语言/平台/框架的内部。当其他所有方法都失败时,这种研究能力对你自己非常有用。但是你永远不会知道什么时候开始寻找或者直到你完成其他人的工作。好的代码或坏的,它在某种形式或时尚方面都很有价值。

  • 所有这些符号,格式和术语都很有帮助,但可以相当快速地学习或实施,并且它们的收益相当可观。通过阅读其他人的代码,您将开发自己的逻辑风格。当您遇到其他人的工作以及需要花费大量精力进行阅读时,您将了解要避免的逻辑缺陷以及下次为自己实施的内容,甚至更快地修复错误的代码。

我从未觉得自己是一个优秀的程序员。不是说我也是一个坏人,但我对自己的能力充满信心,因为我的经验教会了我很多,而且我适应各种情况的能力使我成为一名可靠的程序员。向其他人学习他们的代码对我有所帮助。无论他们的工作是好还是坏,总有一些东西可以从他们身上获取,他们的经验,将它添加到你的记忆,知识等等。

答案 3 :(得分:6)

请其他人阅读您的代码!请尝试查看是否有同事和类似的同事与您进行代码审核。让其他人梳理您的代码并向您询问有关您的代码的问题将为您的风格和技术提供新的见解和批评。从错误和其他方面学习。

答案 4 :(得分:6)

为了给你一些鼓励,我已经成为一名专业的程序员已有30年了,我仍然觉得阅读其他人的代码非常困难。遗憾的是,其主要原因是代码的质量遵循鲟鱼法 - 其中90%是废话。所以如果你发现它很难,不要认为这是你的错!

答案 5 :(得分:3)

当我开始大量使用空格时,我的代码的可读性得到了最大的改进。

答案 6 :(得分:3)

我在Joel on Software上发现this article与匈牙利符号辩论非常相关。

似乎符号的原始意图是编码不是很明显的类型信息 - 不是变量是否为int(iFoo),而是int的 - 它是 - 例如以厘米为单位的距离(cmFoo)。这样,如果您看到“cmFoo = mBar”,您可以看出它是错误的,因为即使两者都是整数,一个是米,另一个是厘米,因此语句的逻辑不正确,即使语法很好。 (当然,我个人更喜欢使用类,使得该语句甚至不会编译,或者会为你进行转换)。

问题是在某些时候人们开始使用它而不理解它,世界被大量的dwFoos和bBars诅咒。

每个人都需要阅读该文章 - Making Wrong Code Look Wrong

答案 7 :(得分:3)

  

如何增加代码   理解/阅读技巧?

阅读代码就像自己跳舞一样。你需要一个合作伙伴,我建议使用一个调试器。

使用调试器逐步执行代码是一种真实,生动的舞蹈。我建议用您选择的语言获得一个高质量的开源项目,然后逐步调试。如果你问“为什么会发生这种情况?”,“接下来应该发生什么?”,那么概念就会活跃起来。“

最终应该能够在没有调试器的情况下推理代码;不要让它变成拐杖。但那说,这是一个非常有价值的工具。

答案 8 :(得分:2)

阅读代码与阅读文学非常相似,因为您需要对作者有所了解,以了解您正在看什么以及期待什么。他们只有提高你的理解能力的方法是通过阅读尽可能多的代码和可能性并尝试跟进。

我认为提及的很多内容here适用于编码......

答案 9 :(得分:1)

阅读和理解技能是一个时间问题。随着您的经验越来越丰富,您将会改进它们。还取决于您正在阅读的代码的质量。

请记住,有时候直接从工作中看到的东西学习并不是最好的主意。书籍将教你最佳实践,你将能够根据自己的经验适应自己。

答案 10 :(得分:1)

我正在阅读Head First Design Patterns,它非常有用。它以一种易于理解的新颖方式呈现信息。很高兴看到他们有一个C#版本可供下载。

答案 11 :(得分:0)

除非你是Jon Skeet,否则总会有阅读代码的困难。这并不是说它是一个大问题,而是除非你能吃,睡,用这种编程语言,否则总是需要一点时间来消化代码。查看其他人的代码肯定是在某些方面帮助的一个很好的建议,但要记住,有许多不同的编码约定,有些可能比其他更强制,例如接口名称以I开头,给出一个简单的例子。所以,我想我说即使使用Visual Studio和Resharper,仍然有一点工作要理解几行代码,因为我还不能用C#写出句子。

答案 12 :(得分:0)

1)教育自己。阅读相关文献。 2)编写代码 3)读取代码 4)阅读相关博客。 访问http://hanselminutes.com。他是微软的程序员。即使你不在微软堆栈上编程,也可以通读。那里有播客回答了这个问题。

答案 13 :(得分:0)

另一个建议是在开始深入研究一段代码之前确保您拥有适当的工具。试图理解代码库而无法搜索整个文件集是非常困难的。

当然,我们很少拥有整个文件集,特别是在大型项目中,但无论您绘制什么样的边界,您都应该在这些文件中具有良好的可见性和可搜索性。无论在这些边界之外的任何东西都可以被视为“黑匣子”,也许不在你们的范围内。

有许多优秀的开源编辑器,包括EclipseCDT。花一些时间学习如何有效地创建项目,跨项目搜索,以及启用任何特定于IDE的工具提示/帮助程序可以创造一个与众不同的世界。