我应该如何组织通用编程库的目录结构?

时间:2011-05-13 21:01:45

标签: php organization

我一直在编写我自己的通用PHP库,我正在考虑如何组织目录结构,但我想在我正式化库的目录结构之前得到人们的想法。

这是我到目前为止所拥有的: https://github.com/homer6/altumo/tree/master/source/php

我以为我可以“按主题”或“按类别”进行。到目前为止,我只能想到一个我喜欢“按类别”的例子:提升http://www.boost.org/doc/libs/1_46_1/?view=categorized

此外,Qt是按模块组织的,但我觉得它有点乱,因为所有内容都有点塞进QtCore http://qt-project.org/doc/qt-5/qtmodules.html

有什么想法吗?

提前致谢。

更新: 我发现了一本非常好的书,它向我展示了许多很棒的图书馆设计惯例:http://www.apibook.com/blog/

更新: 我发现了一篇有趣的文章提到了代码组织(http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html)。在底部,它说: “你的代码树会是什么样子?他希望用这些词来形容它:简单,实用,优雅,正交,可组合。这是理想的,现实有点不同。”

7 个答案:

答案 0 :(得分:18)

首先,所选择的结构是折衷决定,这意味着您必须根据您的目的处理某些方面并优先考虑其他方面。您可以遵循一些分组标准,例如:

  • 功能性凝聚力,我认为这应该是您设计中最强大的。具有相同或相似功能的类/文件/资源​​应该在一起
  • 组件层次结构,根据您选择的粒度级别,这意味着如果您更喜欢细粒度组件与粗粒度组件,则在一个文件夹中可能会有更多或更少的文件/资源​​。这可以使用文件夹层次结构和嵌套来控制。
  • 更改,某些文件比其他文件更有可能被更改,您必须牢记这一点,以便根据概率提供文件夹层次结构修改。
  • 可扩展性,对于一个有用且适应几乎任何场景的框架,您必须提供扩展组件和功能的可能性。添加扩展文件夹(也就是插件)是一个好主意。

你应该使用很多标准,但要始终牢记KISS Principle。您可以在The Unified Software Development Process(Ivar Jacobson等人)等书籍中搜索包管理,我希望这可能有所帮助。

答案 1 :(得分:7)

由于它是专用于解决通用问题或为常用功能提供接口的多用途库,因此最好使用subject结构,这可能是数据类型/技术/语言/协议等,如下所示:< / p>

+ Http
  - request
  - response
  + util
    - status_codes
+ Html
  - Validator
  + Form
    - UploadFile
  + Tag
+ JavaScript
  - JSON
+ Ajax
+ XML
  - Reader
  - Writer
  - Parser
+ DataType
  - Array
  - Integer
  - String
  - Double
  - Float
  + util
    - datatypes_cast_lib

最重要的是我们:

  • Http 这是一个协议,因此您的Http.request将成为执行Http请求的界面
  • Html 这是标记语言,因此Html.Form.UploadFile将为开发人员提供创建上传文件表单的功能
  • JavaScript 这是编程语言,因此您的Javascript.JSON可以解决从JSON转换为数组的问题
  • Ajax 这是技术
  • XML ,这是标记语言
  • DataType ,这是......好吧,数据类型。

请注意,status_codes位于util的{​​{1}}下。每个子库都有自己的util功能,如Http lib可能需要datatype_cast_lib才能知道如何处理数据类型。

这种图书馆组织方式大多类似于PECL

的组织

好问题,BTW!我经常问自己同样的问题。多年来我一直在组织和重组我的目录结构。这真的取决于项目。我已根据您提供的here结构修改了上面的结构。

答案 2 :(得分:4)

我建议你看看最近两个php 5.3框架Symfony2Lithium中的事情是如何组织的。

他们背后的核心开发人员(以及其他主要框架开发人员和php名人)在定义标准的php 5.3命名约定时是活跃的,这样他们各自的组件可以相互玩,Zend和其他可能遵循的框架/框架相同的约定:

http://groups.google.com/group/php-standards/web/php-coding-standard

在这两种情况下,捆绑/库都是一等公民,在组织它们时,两者遵循类似的模式。

锂核心尤其是一个独立的图书馆。它的组织如下:

$ ls
LICENSE.txt analysis    core        g11n        security    template    tests
action      console     data        net         storage     test        util

(我倾向于发现Symfony 2有点混乱/预测性较差,但这只是我自己的看法。)

答案 3 :(得分:4)

请与PSR-0兼容,无论您要使用何种结构。

我个人建议使用PEAR2 directory structure

答案 4 :(得分:3)

我想说一个好的起点是看看其他框架和/或库是如何做到的。

我个人喜欢Zend Framework的组织方式,具有相当平坦的命名空间,Zend目录中包含所有主要组件。当使用Zend MVC项目结构时,你会得到一个添加的自动加载器,将_转换为/所有类都命名为Zend_Form并放入Zend目录中名为Form.php的文件中,以便在调用new Zend_Form时 - 自动加载器会查找Zend/Form.php。只有'main'类直接位于Zend文件夹中,任何其他类文件(如exception和abstract)都放在Zend/Form文件夹中,类名称如Zend_Form_Exception - 这会导致自动加载器查找Zend/Form/Exception.php

另一点是,保持后端逻辑远离任何public_html文件夹。 E.G - 只有用户可以直接访问的文件应该在这里(javascript,css和你的loader.php + .htaccess)。然后让loader.php包含它需要的文件,通常是一个目录级别。

外部库通常被视为这样,并与/ lib,/ library和/或/ vendor文件夹中的其余代码分开,以指示外部作者负责这些类。

答案 5 :(得分:3)

我会说这取决于你是如何/如果你使用名称空间等。否则我会看到像ZendFramework目录布局一样的用法(即使它像罪一样丑陋......呵呵)。然后我通常有一个Core,其中包含所有其他部分可能使用的基本功能,如数组和字符串操作,加密/解密

+ Core
 - Array
 - String
 + Encryption
   - MD5
   - SHA1
   ...

然后我尝试将所有后续文件夹视为隔离的部件/模块。我有一个包含大量JQuery助手的Jquery文件夹吗?那么这可能是一个很好的文件夹来添加。

+ Core
 - Array
 - String
 + Encryption
   - MD5
   - SHA1
   ...
+JQuery

我的JQuery是否需要一些其他“模块”也可能使用的HTML细节?那应该进入Core。例如,我的JQuery助手可能会使用JSON。

+ Core
 - Array
 - String
 + Encryption
   - MD5
   - SHA1
   ...
 + Encoding
   - JSON
+JQuery

如果它是Jquery特定的,它应该在JQuery下面。

+ Core
 - Array
 - String
 + Encryption
   - MD5
   - SHA1
   ...
+ JQuery
  - Datepicker

总是问一个问题“我的图书馆的某些部分是否会使用和/或扩展?”如果相关功能应该是您的Core的一部分或特定库模块的一部分,您将会有一个好主意。

答案 6 :(得分:2)

<project name>/
    application/
        configs/
            application.ini
        controllers/
            helpers/
        forms/
        layouts/
            filters/
            helpers/
            scripts/
        models/
        modules/
        services/
        views/
            filters/
            helpers/
            scripts/
        Bootstrap.php
    data/
        cache/
        indexes/
        locales/
        logs/
        sessions/
        uploads/
    docs/
    library/
    public/
        css/
        images/
        js/
        .htaccess
        index.php
    scripts/
        jobs/
        build/
    temp/
    tests/

来源:http://framework.zend.com/manual/en/project-structure.project.html