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

时间:2020-03-05 18:43:14  来源:igfitidea点击:

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

在引用参考时,请同时提及我们喜欢的东西。

解决方案

回答

这取决于兴趣,但是我使用过Quake III代码库,因此编写得相当好,很不错。它是用C编写的。

回答

我会推荐Scott Hanselman的每周源代码文章,他完全按照建议去做,即阅读更多源代码以使它变得更好。值得一读。

回答

我们会发现很多示例。但是吉姆·巴克(Jim Buck)说过,这取决于兴趣。我从SharpDevelop来源学到了一吨的"东西"。

回答

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

@Avinash:如果我们想了解一般的编程知识,我建议我们同时阅读Spinellis的Code Reading和Code Quality。我相信,它们具有来自各个项目(所有FOSS)的代码示例,因此我们不仅可以阅读它们,还可以获取书中讨论的版本以及最新版本以从中阅读更多代码并学习。

回答

Linux内核是学习的很好方法。

我知道由于多架构的结构和大量的代码,可能很难深入研究,但是里面有一些很好的文章要慢慢介绍,例如Tim Jones的文章。

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

回答

我可以推荐西蒙·塔瑟姆(Simon Tatham)的拼图系列。这是一系列益智游戏(扫雷,数独,十五个),可用于Windows,OS X和Linux(以及Java小程序)。架构非常简单:有一个前端接口,具有三种实现方式(每个平台一个),一个后端接口,每个游戏具有一种实现方式(我已经给出了三个示例),以及一个使它们能够相互交谈的中端,做序列化和其他整洁的东西。

基本上,这是很好的OOP。用C编写。它很容易被贡献(我实现了Filling and Range游戏),因为它有据可查且易于阅读。

回答

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

Apache的Log4Net日志记录框架。

它的源代码非常易读,并且是"跨平台的" [可在.NET 1.0、1.1、2.0,CF,MONO ...上编译],因此对于"跨平台的" CDevelop开发中的课程很有用...

回答

我发现的简洁明了的源代码中最好的部分之一就是jQuery源。无论我们是否喜欢Javascript,它都非常适合反对"代码即文档"的提倡者。

有很多评论,但不是ascii艺术品,我们可以看到清楚的论据,可以使我们确切地知道要实现的目标。

一个例子(全文):

(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 );

...