库和命名空间的最佳实践

时间:2013-04-17 05:30:25

标签: javascript repository etiquette

创建库的最佳做法是什么?

我已经开发了近10年,并且在我工作的时候一直在建立我的图书馆。

我目前的设置方式遵循以下模式:

MYLIB.SomeUtility.utilFunc();
new MYLIB.SomeProject.ProjectClass(); //project specific classes

//Sometimes I have classes that extends external libraries,
//like JQuery, or KinteticJS objects
new MYLIB.SomeExternalLibrary.ExternalLibraryClass();

我的图书馆有css / js / php / as3中的文件,但为了避免混淆,我将它们分别放入各自的库中,如:MYLIB_JS等......

例如,在JS库中,我有WebGL,Canvas,JQuery,Regular JS类(如果我们称之为那些)。

你可以看到它有点混乱,所以我试图了解其他人在做什么,所以我列出了一些快速问题:

如何处理:

  • 不同的语言?
  • 不同的平台(就是它的名称?WebGL,Canvas,JQuery等......)?
  • 不同的项目
  • 外部库和依赖项

在我研究的过程中,我想到了谷歌,我问自己,他们如何处理谷歌地图库,他们必须拥有一个包含一系列实用功能的通用谷歌库,但也有谷歌地图的文件,他们有一个后端可能是PHP和一个JS前端,那么它们是如何管理的呢?

感谢您的帮助:D

PS。我使用Git进行版本控制工作

2 个答案:

答案 0 :(得分:8)

我写这篇文章是因为你想知道别人做了什么。这就是我的工作。我不会声称这是“最佳做法”。

1)当岁月流逝时,我意识到我通过项目记住了我的图书馆。因为项目是实际的挑战,而不是图书馆。

2)我们不再用单一语言编写程序。趋势是云服务器和应用程序必须以多种语言处理多个平台。

3)我看到,每次构建应用程序时,如果它变得更好,平台代码就会开始反映编码语言和框架的独立性(尽可能多),功能相似。

4)回顾项目时,它应该准备好重新工作,或者任何编译都是可能的,而无需重新定义目录结构等...所以如果你使用特定于平台的代码,你必须根据平台进行编码要求,例如强制将android代码存储在另一个目录结构中然后eclipse的几乎是荒谬的。

所以我该怎么做:

主要入口点始终为project。 在那之下,我分成了平台。 在此之下,我分为平台工具和框架。

即:

   TheGreatWebProject
      |------->Server
      |           |------>Php
      |           |              |------>aScaryPhpFrameWork
      |           |              |------>myPhpLibraries
      |           |                           |-----------> myPhpLib1
      |           |                           |-----------> myPhpLib2
      |           |------>DotNet
      |                          |------>aScaryDotNetFrameWork
      |                          |------>myDotNetLibraries
      |                                       |-----------> DotNetOutputs
      |                                       |-----------> myDotNetLib
      |                                       |-----------> myDotNetSources
      |           
      |
      |------->Client
      |           |------>Html
      |           |         
      |           |------>Css
      |           |
      |           |------>JavaScript
      |           |              |-----------> aScaryJsLibrary
      |           |              |-----------> myJsLib1
      |           |              |-----------> myJsLib2
      |           | 
      |           |------>ActionScript3
      |                          |-----------> aScaryAs3Library
      |                          |-----------> swfOutputs
      |                          |-----------> myClient1.fla
      |                          |-----------> myClient2.fla
      |                          |-----------> myAs3AppSrc(in package 
      |                                        management file structure)
      |            
      |           
      |------->Extras
                  |------>Locales
                  |------>Documents
                  |------>Images
                  |------>Audio
                  |------>Video
                  |------>Other

对于每个子部分,子分类将反映实施,ide和平台依赖性。所以没有great cure that fits all存在......


现在终于有了一个目录:项目,在它下面我有多年的目录,每年我都有我当年制作的项目......

我希望这会有所帮助。

答案 1 :(得分:2)

在项目结构方面,我的建议是:

1)与你的结构保持一致比你使用的确切结构更重要

2)不要重新发明轮子 - 使用现有框架布局的结构是有意义的

至于您的具体问题:

1)不同的语言

我假设你的意思是人类语言,因为我们在这里讨论的是javascript。我认为国际化应该与代码的结构分开。有许多现有的库可以处理它,并在这个问题中详细讨论了它:https://stackoverflow.com/questions/9640630/javascript-i18n-internationalization-frameworks-libraries-for-client-side-use

2)不同的平台

我喜欢垂直打包代码,而不是水平打包。换句话说,我认为代码应该按域而不是技术层进行打包。在Domain Driven Development一书中有一个很好的解释。

3)不同的项目

我认为这通常会由于代码位于不同的源树中而隐式处理。尽管如此,拥有根命名空间可能解决了这个问题并且是一种很好的做法,因为它具有最小的全局覆盖范围。

4)外部库

我会看一下CommonJS - 它是加载JavaScript库的惯例,并且正在成为一种无处不在的标准。 http://www.commonjs.org/