写得很好的开源项目(用于学习)?

时间:2008-08-26 11:39:19

标签: open-source

我们通过编写程序和从其他程序中学习来学习编程。 您建议哪些开源代码存储库/程序用于学习/改进编程?

引用参考时请同时提及您喜欢的内容。

9 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:13)

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

基本上,这是一个很好的OOP。用C语言写的。很容易做出贡献(我实现了填充和范围游戏),因为它有很好的文档记录,而且很容易阅读。

答案 2 :(得分:9)

Disruptor的代码是示例性的,也可以从它为实现现代硬件的极端性能所做的工作中学到很多东西。

值得一读的是其Martin Fowler's explanationthe technical paper (PDF)架构的the QCon presentation。开发人员博客也包含了很多好的阅读材料 - 尤其是Mechanical Sympathy Blog,其中教授了很多关于现代CPU和内存如何工作的内容。

答案 3 :(得分:6)

这取决于你的兴趣,但我曾与Quake III codebase合作过,而且编写得非常好,很适合。它是用C语言编写的。

答案 4 :(得分:5)

Linux kernel是一种非常好的学习方式。

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

通过查看特定主题,我学到了很多东西,比如FAT驱动程序实现和文件系统抽象。

答案 5 :(得分: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 );

...

答案 6 :(得分:3)

你会发现很多例子。但吉姆巴克说,这取决于你的兴趣。我从SharpDevelop来源学到了大量的“东西”。

答案 7 :(得分:3)

相对较小,但有足够的复杂性可以学习,我的投票是:

Apache的Log4Net日志框架。

它的源代码非常易读,并且“跨平台”[可编译:.NET 1.0,1.1,2.0,CF,MONO ...],因此对于“跨平台”C#开发的教训非常有价值。 ..

答案 8 :(得分:2)

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


@Avinash:如果你想进一步了解编程,我会推荐Spinellis的代码阅读和代码质量。他们有来自各个项目的代码示例,我相信所有的FOSS,所以你不仅可以阅读它们,而且可以阅读书中讨论的版本和最新版本,从中阅读更多代码并学习。