Подтвердить что ты не робот

Как мне организовать структуру каталогов библиотеки общего назначения?

Я писал свою собственную PHP-библиотеку общего назначения некоторое время, и я думаю о том, как организовать структуру каталогов, но я хотел получить идеи людей, прежде чем формализовать структуру каталогов для библиотеки.

Вот что у меня есть до сих пор: https://github.com/homer6/altumo/tree/master/source/php

Я думал, что могу либо сделать это "По теме", либо "По категории". До сих пор я могу только подумать о одном примере, который мне нравится в категории "По категориям": Boost http://www.boost.org/doc/libs/1_46_1/?view=categorized

Кроме того, Qt организован модулем, но я думаю, что это немного беспорядочно, потому что все впишется в QtCore http://qt-project.org/doc/qt-5/qtmodules.html p >

Любые идеи?

Спасибо заранее.

UPDATE: Я нашел действительно большую книгу, которая показала мне ряд замечательных конвенций по дизайну библиотек: http://www.apibook.com/blog/

UPDATE: Я нашел интересную статью, в которой упоминается организация кода (http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html). Внизу сказано: "Каково ваше дерево кода?" Он хочет, чтобы эти слова описывали это: простой, прагматичный, элегантный, ортогональный, композиционный. Это идеальный вариант, реальность немного отличается ".

4b9b3361

Ответ 1

Прежде всего, выбранная структура является компромиссным решением, а это означает, что вам придется решать и определять приоритеты некоторых аспектов над другими в зависимости от вашей цели. Существуют следующие критерии группировки, например:

  • Функциональная сплоченность, я думаю, это должно быть самым сильным в вашем дизайне. Классы/файлы/ресурсы с одинаковой или сходной функциональностью должны быть вместе
  • Иерархия компонентов. В зависимости от выбранного уровня детализации это означает, что если вы предпочитаете мелкозернистые компоненты и грубые, у вас будет больше или меньше файлов/ресурсов в одной папке. Это можно контролировать с помощью иерархии папок и вложенности.
  • Изменить. Некоторые файлы с большей вероятностью будут изменены, чем другие, вы должны помнить об этом, чтобы обеспечить иерархию папок в зависимости от вероятности изменения.
  • Расширяемость. Чтобы среда была полезной и адаптируемой практически к любому сценарию, вы должны предоставить возможность расширения компонентов и функций. Добавление папки для расширений (aka plugins) - хорошая идея.

Существует много критериев, которые вы должны использовать, но всегда помните Принцип KISS. Вы можете искать управление пакетами в книгах, например Процесс разработки унифицированного программного обеспечения (Ivar Jacobson и др.), Я надеюсь это может быть полезно.

Ответ 2

Поскольку это многоцелевая библиотека, предназначенная для решения универсальных задач или предоставления интерфейсов для общих функций, лучше иметь структуру subject, которая может быть DataType/Technology/Language/Protocol и т.д. так:

+ 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 в Http. Каждая подбиблиотека может иметь свои собственные функции использования, такие как DataType lib может нуждаться в datatype_cast_lib, чтобы знать, как жонглировать с типами данных.

Этот способ организации библиотеки в основном напоминает организацию PECL

Хороший вопрос, кстати! Я задавал тот же вопрос сам. Я много лет организую и реорганизую свою структуру каталогов. Это действительно зависит от проекта. Я адаптировал структуру выше соответствующей структуре, которую вы предоставили здесь.

Ответ 3

Я бы предположил, что вы смотрите, как все организовано в двух последних фреймах php 5.3, Symfony2 и Литий.

Основные разработчики позади них были активны (наряду с другими крупными разработчиками рамок и знаменитостями 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 более беспорядочным/менее прогностическим, но это только мое собственное мнение.)

Ответ 4

Пожалуйста, PSR-0 совместим, какую бы структуру вы ни использовали.

Я лично предлагаю использовать структуру каталогов PEAR2.

Ответ 5

Я бы сказал, что хорошее место для начала - посмотреть, как это делают другие фреймворки и/или библиотеки.

Лично мне нравится, как Zend Framework организован с довольно плоским пространством имен, имеющим все основные компоненты в каталоге Zend. При использовании структуры проекта Zend MVC вы получаете добавленный автозагрузчик, переводящий _ в/все классы, называются как Zend_Form и помещаются в файл с именем Form.php внутри каталога Zend, так что при вызове new Zend_Form - просмотр автозагрузчика для Zend/Form.php. Только класс "main" находится непосредственно внутри папки Zend, любые дополнительные файлы классов, такие как исключения и абстрактные, помещаются в папку Zend/Form и имена классов, названные как Zend_Form_Exception -, которые заставляют автозагрузчик искать Zend/Form/Exception.php.

Еще один момент - сохранить бэкэнд-логику от любой папки public_html. E.G - здесь должны быть только файлы, которые должны быть доступны для пользователей (javascript, css и ваш loader.php +.htaccess). Затем добавьте loader.php файлы, которые ему нужны, обычно один уровень на уровне выше.

Внешние библиотеки обычно рассматриваются как таковые и отделяются от остальной части кода в папке /lib,/library и/или/vendor, чтобы указать, что внешние авторы несут ответственность за эти классы.

Ответ 6

Я бы сказал, что это зависит от того, как/если вы используете пространства имен и т.д. В противном случае я увижу использование чего-то вроде макета каталога 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 или части вашего конкретного библиотечного модуля.

Ответ 7

<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