Як я можу організувати своє початкове дерево?


89

Я є індивідуальним розробником, який працює, в основному, над веб-проектами (W / LAMP) і, часом, над проектами C / C ++ (не GUI) приблизно середнього масштабу.

Я часто борюся зі структуруванням свого дерева вихідних кодів. Насправді, як правило, я не завершую проект, не скидаючи все дерево і не переставляючи шматки три-чотири рази, що дійсно вимагає великих зусиль, і, тим більше, кінцевий результат здається компромісом.

Іноді я закінчую над класифікацією джерела - дуже довге дерево папок і підпапок. В іншому випадку я просто закінчую концентрування всіх файлів у певній папці на основі більшої мети, яку вони обслуговують, і тим самим призводить до "хаотичних" папок у джерелі.

Я хотів би запитати:

  • Чи є принципи / логіка / найкраща практика, які можуть мені краще допомогти в структурі мого вихідного дерева?
  • Чи є якісь графічні / схематичні методи (наприклад: DFD у випадку потоку даних), які можуть допомогти мені заздалегідь візуалізувати моє вихідне дерево на основі аналізу проекту?
  • Яку стратегію прийняти для структури мультимедійного дерева файлів, пов'язаного з проектом?

Щодо щедрості : Я вдячний за існуючі відповіді з членами, які діляться власними практиками, однак, я хотів би заохотити більш загальні та повчальні відповіді (або ресурси) та більше відповідей від членів.


8
Зараз у мене немає часу на есе, але "назвіть речі такими, якими вони є", "покладіть речі, куди вони належать", "тримайте подібні речі близько один до одного" і, нарешті, "не турбуйтеся про це" , сподіваємось, у вас є IDE, який допоможе вам швидко переходити між фрагментами коду ".
Джон Сондерс

@John, мені не так добре з IDE (іми), я зазвичай витягую Notepad ++ або vi залежно від ОС. Це робить дещо складніше. Решта пунктів корисні, але знову ж таки зводиться до прийняття складних рішень, таких як функції журналу (журнали помилок тощо), більш наближені до логіки програми або управління DAL або кешами або менеджерами перегляду. Помилки мають майже однакову ймовірність виникнення будь-якої з них.
перевірка123

3
Можливо, як тільки ви доберетеся до такого питання, настав час дозволити деяким інструментам зробити якусь роботу за вас. І ведення журналу - це безперечно функціональна проблема, яка використовується всіма частинами програми (якщо ви використовуєте той тип коду, який потребує реєстрації). Ще одна невелика приказка полягає в тому, що "поставте код над кодом, який його використовує", тому журнал повинен знаходитися біля верхньої частини, можливо, в \ утилітах.
Джон Сондерс

@John: Дуже вдячний. Можливо, я повинен почати шукати IDE. Затемнення здається багатообіцяючим.
перевірка123

1
@ check123 "... перегрупування фрагментів три-чотири рази ..." Загальна практика: "Таким чином, питання управління полягає не в тому, щоб будувати пілотну систему та кидати її. Ви зробите це. Питання лише в тому, чи планувати заздалегідь побудувати викид, або пообіцяти доставити замовлення замовнику ". - Фредерік П. Брукс-молодший," Міфічний чоловік-місяць: Нариси програмної інженерії "
шонхкорі

Відповіді:


25

Схема вихідного дерева повинна відображати архітектуру; як наслідок, добре структурована архітектура може призвести до добре структурованої верстки дерева джерела. Я пропоную прочитати на шаблоні шарів POSA1 , спробувати вписати вашу архітектуру в шарувату структуру, а потім назвати кожен із отриманих шарів і використовувати це як основу для ієрархії джерела. Беручи загальну трирівневу архітектуру як базову лінію:

  • презентація / webService (представити інтерфейс веб-сервісу для нашої бізнес-логіки)
  • логіка / * (сюди входять модулі бізнес-логіки)
  • storage / sql (тут API інтерфейсного зберігання - для використання в SQL-інтерфейсі для зберігання в базі даних)
  • util / * (утилітний код - доступний для всіх інших шарів, але це не відноситься за межами util, йде тут)

Зауважте, що шари не містять код безпосередньо, а навпаки, строго використовуються для організації модулів.

У модулі я використовую такий тип компонування:

  • <module> (шлях до модуля безпосередньо; визначає модульний інтерфейс)
  • <module>/impl/<implName> (конкретна реалізація модульного інтерфейсу)
  • <module>/doc (Документація для використання модуля)
  • <module>/tb (код модульного тесту для модуля)

де <module>розташований у сховищі відповідно до шару, до якого він належить.


5
+1: Макет дерева-джерела повинен відображати архітектуру - явна річ, яку я не помічав.
чек123

Як ви керуєте захищеними файлами - файлами, до яких лише авторизовані користувачі можуть отримати доступ до входу після публікації?
перевірка123

@ check123 Я не впевнений, що розумію питання. Я зосередився на організації вихідних модулів, а не на підтримці файлів для проекту, і вихідний код, як правило, призначений для доступу всіх. (Є винятки, і я використовую дистрибутив / каталог, перш за все, код із нестандартними обмеженнями використання / модифікації.)
Aidan Cully,

48

Я не можу дати тобі багато порад щодо веб-проектів, але ось як я структурую своє дерево в проектному програмі (в основному з точки зору C / C ++):

  • /
    • src - вихідні файли, написані власноруч
    • ext - Містить сторонні бібліотеки
      • libname-1.2.8
        • включити - Заголовки
        • lib - Скомпільовані файли lib
        • Donwload.txt - Містить посилання для завантаження використаної версії
    • ide - тут я зберігаю файли проектів
      • vc10 - я упорядковую файли проектів залежно від IDE
    • bin - Складений exe йде сюди
    • build - файли збірки компілятора
    • doc - Документація будь-якого типу
    • ЧИТАЙТЕ
    • ВСТАНОВИТИ
    • КОПІВАННЯ

Кілька приміток:

  1. Якщо я пишу бібліотеку (і використовую C / C ++), я спершу організую свої вихідні файли спочатку в дві папки під назвою "включити" та "src", а потім за модулем. Якщо це додаток, то я збираюсь організувати їх просто за модулем (заголовки та джерела будуть в одній папці).

  2. Файли та каталоги, які я вказав вище курсивом, я не додаватиму до сховища коду.


Яка різниця між ide і build ?
М. Дадлі

3
ideсаме там я зберігаю файли проектів. buildмістить об'єктні файли, згенеровані компілятором. Різні IDE можуть використовувати один і той же компілятор, тому я зберігаю файли проекту IDE відокремлені від об'єктних файлів, побудованих компілятором.
Пол

so build == obj (термін, який використовується багатьма іншими системами)
gbjbaanb

@gbjbaanb Так, я думаю. Це насправді не має значення, оскільки цей каталог не висувається до сховища. :) Я назвав це "build", тому що саме це IDE, яким я користувався att, назвав його (Visual Studio).
Павло

Що робити, якщо вашому exe потрібно трохи dll для запуску? Ви копіюєте всі файли dll в той самий dir, що і exe? Чи використовуєте ви деякі події після складання?
Вакан Танка

14

Хоча стандартний макет каталогів Maven характерний для Java, але він може слугувати хорошою основою для інших типів проектів.

Ось основна структура (ви можете замінити каталоги 'java' на 'php', 'cpp' тощо):

src/main/java       Application/Library sources 
src/main/resources  Application/Library resources  
src/main/filters    Resource filter files 
src/main/assembly   Assembly descriptors 
src/main/config     Configuration files 
src/main/webapp     Web application sources 
src/test/java       Test sources 
src/test/resources  Test resources 
src/test/filters    Test resource filter files 
src/site            Site 
LICENSE.txt         Project's license 
NOTICE.txt          Notices and attributions required by libraries
README.txt          Project's readme

Структура в основному розпадається на 'src / main' та 'src / test', а потім групується за типом.


5

Я дійсно не знаю про конвенції, але всі мої основні проекти виконуються за допомогою Symfony Framework, і я звик до структури дерева на зразок наступного:

корінь /

  • додатки
  • ім'я програми
    • config (конфігураційні файли для програми)
    • lib (спеціальні файли для PHP)
    • модулі (модульний розподіл функціональності)
      • ім'я_модуля
        • шаблони (html)
        • дії (php-код)
  • konfing (файли конфігурації проекту)
  • lib (php-код, який може бути використаний у проекті hole)
  • модель (класи, які представляють інформацію про проект)
    • база
  • форма (файли PHP, які обробляють форми, це може бути досить важко без символу)
    • база (класи базових форм)
  • веб
  • css
    • образи
    • file.css
  • js
  • журнал (файли журналів, які можуть бути створені)
  • дані (конкретна інформація, наприклад, sql-патчі чи що завгодно)
  • пл
  • плагіни (використовувані бібліотеки, які можна об'єднати з будь-яким додатком проекту)

Якщо ви зацікавлені, будь ласка, прочитайте документацію по сімфоні з цього питання для подальшого запиту ( MVC та Code Organization for Symfony ).


Чи папка CSS централізована? Тобто, всі ваші CSS (по всьому проекту) знаходяться в одному каталозі?
чек123

Не обов'язково, ви можете розділити це, але оскільки у більшості моїх проектів є лише 2 програми (фронтенд та бекенд), файлів css (у плагінів завжди є власна веб-папка для абстрагування) не так багато
guiman

5

В ідеалі організація має єдиний сховище, структура якого покликана збільшити взаємодію між інженерією та бізнесом та сприяти повторному використанню.

...\products\
...\products\productName\
...\products\productName\doc\

...\systems\
...\systems\systemName\
...\systems\systemName\doc\
...\systems\systemName\res\
...\systems\systemName\build\
...\systems\systemName\test\

...\library\
...\library\libraryName\
...\library\libraryName\doc\
...\library\libraryName\build\
...\library\libraryName\test\

...\devops\

продукції

Одна папка на продукт; допомагає спілкуватися, як програмне забезпечення підтримує бізнес.

В ідеалі кожен "продукт" - це трохи більше, ніж файл конфігурації, який вказує, до яких систем потрібно викликати і як їх потрібно налаштувати. Підпапка doc може містити короткий \ spec & будь-який рекламний матеріал верхнього рівня тощо ...

Розділяючи продукцію та системи, ми передаємо потенціал повторного використання сторонам, що стоять перед клієнтами, та розбиваємо силоси на кожну продукцію. (Це суперечить підходу "продуктової лінійки" до тієї ж проблеми)

систем

Одна папка в кожній системі; допомагає передавати основні можливості та можливість / цінність вмісту сховища.

  1. Файли "управління конфігурацією", що вказують середовища побудови та розгортання.
  2. Конфігурація тестування на рівні системи (може бути значною кількістю).
  3. Логіка та функціональність вищого рівня; Найбільш важкий підйом здійснюється за допомогою функцій бібліотеки.

бібліотека

Компоненти для багаторазового використання, на які посилаються різні системи. Більшість заходів з розробки розробляються навколо виробництва бібліотек, а не систем, тому повторне використання "приділяється" процесу розробки.

депеш

Побудова, безперервна інтеграція та інші функції автоматизації розвитку.

Висновок

Дерево-джерело є ключовою частиною документації і формує підхід, структуру та психологію взаємовідносин бізнесу з його фірмовою технологією.

Трохи глибше пояснюються драйвери такого підходу в моїй відповіді на це запитання: https://softwareengineering.stackexchange.com/questions/43733/who-organizes-your-matlab-code/59637#59637


Примітка. Можливо, корисно буде називати папки таким чином, що сумісний із типом ієрархій продуктів, про які йдеться у посібнику з інженерії систем INCOSE.
Вільям Пейн

3

Те, що я намагаюся зробити для кожного проекту, схоже на:

  • src - вихідні файли, папка для кожного простору імен / пакету для легкого пошуку файлів (навіть файли заголовків для C / C ++)
  • ext - для зовнішніх / сторонніх бібліотек просто додати зовнішні (наприклад, сховища SVN). Всередині папка для кожної бібліотеки (бінарні файли та файли, що включають файли)
  • bin - для вбудованих бінарних файлів, можна швидко експортувати до випуску
    • inc - для файлів заголовків C / C ++ (скопійовано IDE / makefile / тощо ...)
  • out - для всіх тимчасово генерованих файлів (.class, .obj тощо ...), і їх можна ігнорувати (наприклад, SVN)
  • doc - для будь-якої документації, що зазвичай генерується за допомогою Doxygen
  • res - розміщуючи тут ресурси, можна відокремити текстові вихідні файли та бінарні ресурси, які використовує програма. У мене дійсно немає конкретної ієрархії всередині.
    • config - для деяких файлів конфігурації
    • для малювання - для деяких зображень або значків

Усі файли або файли IDE зберігаються безпосередньо в корені, якщо ви використовуєте лише один з них.


2

Я роблю щось подібне. Добре працює для крос-платформної гри, яку я роблю у вільний час. На жаль, у роботі все набагато менш організовано ...

Output                      <-- Build outputs
Docs
External
   <libname>
      Include
      Lib
Data
<ProjectName>.xcodeproj
<ProjectName>VS2010
Source
Temp                        <-- Intermediate stuff from builds and other tools
Tools

2

Для моїх команд ми намагаємось застосувати стандартну структуру для всіх проектів, щоб легко знаходити речі, коли команда перемикає контекст і уникати необхідності повторного навчання. Не всі проекти потребують усіх систем, тому ми починаємо з мінімального набору.

/ Джерело / Компонент / Мова

/ Джерело / Компонент / Третя сторона /

/ Документація / Вимоги

/ Документація / Дизайн

/ Тести / Автоматизовані / Одиниця

/ Тести / Автоматизоване / Ім'я інструменту

/ Тести / Посібник

Це призводить до певного дублювання, особливо під кодом сторонніх партій та бібліотеками, але принаймні ми ніколи не забуваємо відповідь на щось на кшталт "Що використовує редактор RogueWave?"


1
З великої літери компоненти для мене виглядають справді нерозумно і безглуздо. Чому багато всіх малих літер? Це набагато простіше вводити людям (хоча інструменти не хвилюються, включаючи файли WIMP- файлів), і він читає однаково добре завдяки роздільникам шляхів. Для мене остаточний виграш.
ulidtko

2

Мені подобаються ідеї, представлені на цій сторінці www.javapractices.com/topic/TopicAction.do?Id=205 . В основному, рекомендація полягає в тому, щоб організувати свій проект у функції (або модулі, компоненти). Окрім причин, викладених там:

  1. Менше когнітивного навантаження, коли ви думаєте про сферу дії коду, над яким працюєте, оскільки у вас є гарантія того, що будь-який код у функції, над якою ви працюєте, є "функціонально-приватним".
  2. Існує додаткове почуття безпеки, коли вам гарантується, що ви лише змінюєте код для даної функції. Наприклад, ви не зламаєте нічого, крім функції, над якою працюєте. Знову це через "функцію-приватне".
  3. Менш пізнавальне завантаження просто, тому що менше файлів, які ви можете побачити для даного пакету. Я впевнений, що кожен бачив пакет, який містить понад 15 файлів.

Зауважте, що це зосереджено на пакетах Java (також просторах імен). Для великих проектів я рекомендую з тих же причин ділити проект на декілька проектів (як у кількох проектах Maven), що представляє бізнес-особливість. Для проектів Maven я рекомендую це читання .

Поки що проекти, в яких я був / я брав участь, не відповідають цим. Причин багато, але ось кілька:

  1. Нерозуміння модифікатора доступу Java за замовчуванням (більшість неправильно модифікованих модифікаторів доступу відповідно до цієї книги )
  2. "Argumentum ad populum": переважаюча культура пакетного шару (ймовірно, викликана Причиною №1)

Я думаю, що є упущена можливість запобігти складності, якщо організацію джерела проекту не сприймати серйозно на початку проекту, як сказав архітектор Олександр:

"Як вам скаже будь-який дизайнер, саме перші кроки в процесі проектування розраховують на більшість. Перші кілька штрихів, які створюють форму, несуть у собі долю решти". - Крістофер Олександр

Залежно від розміру та складності проекту, упущена можливість скоротити витрати чи рентабельність інвестицій може бути дуже великою. (Мені цікаво подивитися дослідження, щоб побачити точні цифри для цього)


2

Моя рекомендація - завантажити різні рамки або двигуни і побачити, як величезні команди розробників обробляють макет своїх папок.

Існує так багато способів впорядкувати файли, що краще вибрати один і спробувати дотримуватися його в будь-якому проекті. Дотримуйтесь певної угоди до її завершення чи оновлення, щоб уникнути помилок та втрати зайвого часу.

Ви можете завантажити рамки Laravel, Symphony або Codeigniter для веб-проектів, щоб мати миттєвий макет папок, який працює.

Тому я спробую передати макет папок, спільний для будь-якої розробки:

MVC (Model View Controller) дає хорошу парадигму організації.

Корінним вихідним кодом може бути src (C ++) або додаток (веб-розробка)

Структура файлів, яка не має чіткої мети для класів, які вони групують, безумовно, спричинить заплутаність. Це не тільки впорядкувати код, але він може підтримувати автозавантажувачі, фабрику класів, обробляти локальне сховище, віддалене зберігання та простір імен.

Ця структура папок виведена та спрощена із Laravel Framework . Мою перевагу в цій публікації називають множинним іменем, але я використовую однини слова у своїх проектах.


src / storage (моделі / файлосховище / api / mysql / sql-lite / memcached / redis реалізації)

src / repositories (обгортка «реалізації пам’яті» з деякою логікою зберігання, загальним інтерфейсом та умовою повернення результатів.)

src / послуги | логіка | сутностей (логіка додатку)

src / контролери (використовується в веб-розробці для маршрутизації запитів сервера до ваших послуг)

src / модулі | системи (Модульні системи, що розширюють загальну функціональність вашої основи. Сервіси можуть використовувати модулі, але не навпаки)

src / helpers (Класи помічників або обгортки, наприклад, маніпуляція з струнами. Багато разів це може бути у libs | постачальника, коли третя сторона)

src / type (Названі перерахунки)

громадські | будувати | вихід (веб або c ++)

config (файли налаштування. YAML стає популярним для файлів конфігураційних платформ)

кеш

колоди

lang (en / es / ru / ...)

завантажувальна програма (запускає рамки та додаток)

Документи (Документація написана у форматі розмітки .md)

тести (одиничне тестування)

база даних / міграції (Створення структури бази даних з нуля)

база даних / насіння (заповнює вашу базу даних фіктивними даними для тестування)

губки | постачальник (все програмне забезпечення сторонніх розробників. "libs" на C ++ і "vendor", як правило, на php)

активи | ресурси (зображення / звуки / сценарії / json / будь-які медіа)


1

З об'єктно-орієнтованими мовами ви маєте можливість створювати простори імен. Та логічна розбивка, яка використовується для окремих частин програми, щоб уникнути з'єднання, є основним джерелом розбиття розташування логічного файлу. Використання з’єднання як причини розбиття просторів імен є хорошим місцем для початку http://en.wikipedia.org/wiki/Software_package_metrics .

Інші говорили про налаштування проекту стосовно побудови, але як тільки ви потрапите до самого джерела, це стосується сенсу - просто використовуйте, як ви логічно розбиваєте код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.