2008-08-26 70 views

回答

6

这取决于你的兴趣,但我曾与Quake III codebase,这是写得很好,很好的合作。它写在C.

17

我会推荐Scott Hanselman的weekly source code articles,他确实提出了你的建议,即阅读更多的源代码以获得更好的效果。这是值得的阅读。

3

你会发现很多例子。但吉姆巴克说,这取决于你的兴趣。我从SharpDevelop的来源获悉了一系列的“东西”。

2

如果有人拥有Code Reading by Diomidis Spinellis的副本,他在那里写了哪些开源项目?


@Avinash:如果您想了解一般更多的节目,我将建议代码阅读和代码质量的Spinellis。我相信,他们有来自不同项目的代码样本,所有FOSS,所以你不仅可以阅读它们,而且可以阅读本书和最新版本中讨论的版本,从中阅读更多代码并学习。


5

Linux kernel是一个很好的学习方式。

我知道,由于多架构结构和大量的代码可能很难深入研究,但有一些很好的文章可以慢慢进入,如this one from Tim Jones

我通过查看特定主题(如FAT驱动程序实现和文件系统抽象)了解了很多。

12

我可以推荐Simon Tatham's puzzle collection。这是一系列可用于Windows,OS X和Linux(以及Java小程序)的益智游戏(扫雷,数独,十五)。这个架构非常简单:有三个实现(每个平台一个)的前端接口,每个游戏实现一个实现的后端接口(我给出了三个示例)和一个让他们一起谈话的中端,做序列化和其他整洁的东西。

基本上,这是很好的面向对象。用C写。很容易做出贡献(我实现了灌装和范围游戏),因为它有很好的文档记录,并且很容易阅读。

3

相对较小,但有足够的复杂性,以便能够从中吸取教训,我的投票去:

Apache的Log4Net日志框架。

它的源代码非常易读,并且可以在跨平台的C#开发课程中学到很有价值的“跨平台”[可编译为.NET 1.0,1.1,2.0,CF,MONO ...]。 ...

5

我发现的最清晰简洁的源代码之一是jQuery源代码。无论您是否喜欢Javascript,对于“代码作为文档”的支持者来说,这都是一个很好的例子。

有很多评论,但它不是ascii艺术品,你可以看到明确的推理 - 评论让你知道到底是什么试图实现。

一个例子(full source):

(function(){ 

var 
    // Will speed up references to window, and allows munging its name. 
    window = this, 
    // Will speed up references to undefined, and allows munging its name. 
    undefined, 
    // Map over jQuery in case of overwrite 
    _jQuery = window.jQuery, 
    // Map over the $ in case of overwrite 
    _$ = window.$, 

    jQuery = window.jQuery = window.$ = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context); 
    }, 

    // A simple way to check for HTML strings or ID strings 
    // (both of which we optimize for) 
    quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, 
    // Is it a simple selector 
    isSimple = /^.[^:#\[\.,]*$/; 

jQuery.fn = jQuery.prototype = { 
    init: function(selector, context) { 
     // Make sure that a selection was provided 
     selector = selector || document; 

     // Handle $(DOMElement) 
     if (selector.nodeType) { 
      this[0] = selector; 
      this.length = 1; 
      this.context = selector; 
      return this; 
     } 
     // Handle HTML strings 
     if (typeof selector === "string") { 
      // Are we dealing with HTML string or an ID? 
      var match = quickExpr.exec(selector); 

      // Verify a match, and that no context was specified for #id 
      if (match && (match[1] || !context)) { 

       // HANDLE: $(html) -> $(array) 
       if (match[1]) 
        selector = jQuery.clean([ match[1] ], context); 

       // HANDLE: $("#id") 
       else { 
        var elem = document.getElementById(match[3]); 

        // Handle the case where IE and Opera return items 
        // by name instead of ID 
        if (elem && elem.id != match[3]) 
         return jQuery().find(selector); 

... 
+1

大部分意见都可以避免。 “代码是文档”不是乱七八糟的代码,真的。当我读到评论是代码味道的时候,马丁福勒启发了我。 – rpattabi 2010-05-21 22:17:33