Вопрос

После многих лет программирования у всех нас есть набор небольших функций, используемых в качестве вспомогательных утилит, и мы хотели бы, чтобы он был встроен, чтобы мы могли использовать его в любом проекте и чтобы о нем позаботилось больше людей (протестировало и оптимизировало).

У меня есть целая коллекция таких функций.Интересно, как вы, ребята, их организуете?У вас есть какие-нибудь советы?

Вот как я это делаю.Я поместил это в отдельный проект (проект eclipse), пусть говорят "MyUtils", и на него ссылаются другие проекты.Это работает, но поскольку коллекция утилит становится все больше и больше, немного странно, что утилиты больше, чем код проекта (для небольших проектов).И чтобы отправить его в Jar, вы должны выбрать их все вручную (или включить их все).Есть ли способ получше?

Кроме того, поскольку Java требует, чтобы все функции были в классе, поэтому у меня есть тонна статических функций (тех, которые не вписываются в ООП), например, функция считывает текстовый файл из имени файла.Вот так:

 package nawaman.myutil;

public class UText {

    static public String ReadTextFile(String pFileName) {
        ...
    }
    static public String[] ReadLines_fromFile(String pFileName) {
        ...
    }
    static public String ReadLine_fromFile(String pFileName, int pLineNumber) {
        ...
    }
    ...
}

Поэтому, когда мне нужно включить все функции, это происходит, хотя они и не используются.

Есть ли лучший способ сделать это?

Я все равно использую eclipse в Linux, если для этого есть специальная техника, но могу поделиться, если у вас есть методы с другими инструментами.

Это было полезно?

Решение

Я отношусь к таким служебным классам так же, как к другим компонентам, внешним по отношению к программному обеспечению, которое я разрабатываю:

  • Для каждого компонента я создаю проект Eclipse и собираю его в jar.
  • Классы логически сгруппированы в пакеты, например[домен].util.net, [домен].util.text и т.д.
  • В проект я включаю нужные мне зависимости.Maven может помочь вам здесь.

Вы пишете, что служебные классы имеют множество статических методов.Это то, чем я нечасто пользуюсь.Например, текстовые функции, которые вы показываете, могут быть реорганизованы в класс или набор классов, которые расширяют или реализуют классы и интерфейсы из платформы collections framework.Это упрощает интеграцию моего кода с другими библиотеками.

Другие советы

  

Это работает, но поскольку коллекция утилит становится все больше и больше, странно, что утилиты больше, чем код проекта (для небольших проектов). И чтобы отправить его в Jar, вы должны выбрать их все вручную (или включить все). Есть ли лучший способ?

Для своих проектов я использую javac , чтобы выбрать все классы из моих библиотек утилит. Для этого я собираю все классы из моего проекта в пустой выходной каталог. javac автоматически разрешает зависимости к утилитным библиотекам, потому что я добавил паттерны библиотеки утилит в качестве исходных патчей. Теперь я могу создать jar-файл, содержащий все классы моего проекта и только необходимые классы библиотек утилит.

  

Кроме того, поскольку Java требует, чтобы все функции были в классе, у меня есть тонна статических функций (тех, которые не вписываются в ООП), например, функция чтения текстового файла из имени файла.

Я делаю это так же. Но я стараюсь иметь множество маленьких утилитарных классов вместо нескольких больших, чтобы мне не приходилось включать тонны ненужных методов в мои банки.

Мои " утилиты " имеют свое собственное пространство имен пакетов и репозиторий SVN. По сути, они являются моими собственными библиотеками: отдельные проекты, которые можно извлекать, совместно использовать, маркировать, обновлять и т. д.

Организация, используемая в каждой из этих "библиотек" зависит от объема и функции, о которой идет речь.

Потому что я не согласен со структурой, являющейся подчиненной некоторому потенциальному выходу класса / JAR: Если вас беспокоит «метод раздувания» в классах и / или JAR, пожалуйста, используйте автоматизированный инструмент для борьбы с этим. ProGuards - это всего лишь один пример , и, хотя он может запутывать, он может одинаково хорошо работать только с "мертвым кодом" устранение & Quot;.

Разделите ваш модуль утилит на более мелкие подпроекты. Используйте Maven или другую систему сборки для отслеживания версий всех ваших утилитных модулей. Они имеют решающее значение для ваших систем, потому что я думаю, что они используются почти во всех ваших проектах. Используйте такие инструменты, как Findbugs или PMD для проверки качества вашего кода.

Каждый проект должен знать, какая версия модуля utils используется. На мой взгляд, недопустимо добавлять в двоичные файлы / источники одного из ваших проектов «nonutils» некоторые слабо связанные классы утилит.

Пожалуйста, внесите изменения в свои классы с помощью других проектов общего достояния, таких как Apache Commons . Я предполагаю, что большая часть вашего служебного кода похожа. Подумайте лучше о переписывании ваших статических методов , поскольку они мешают тестированию (Я уверен, что Findbugs тоже будут жаловаться).

Подводя итог: создание библиотеки утилит - сложная задача и много ответственности. Так что требования в области качества кода очень высоки. Я надеюсь, что мой совет поможет.

Вы должны быть очень осторожны с удалением классов после компиляции - вы можете оказаться в ситуации, когда класс не найден во время выполнения. Если вы никогда не используете отражение или Class.forName (), вы должны быть в безопасности, но они вводят зависимости времени выполнения, с которыми компилятор не может вам помочь (как это может быть с " new ").

Помните - те классы, которые не используются, не используют память в работающей программе, а только используют байты на диске.

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

Я не использую Eclipse, но в Visual Studio вы можете добавить ссылку на файл без его физического перемещения или копирования. Это позволяет вам определить файл в корне вашего исходного контроля, на который могут ссылаться все ваши проекты, без включения его в каждый проект или необходимости решения проблемы копирования. С помощью такого решения вы можете разумно разделить ваши утилитарные методы на разные файлы и выборочно включать их в зависимости от потребностей отдельных проектов. Также вы можете избавиться от лишнего .jar.

Тем не менее, я понятия не имею, поддерживает ли Eclipse этот тип ссылок на файлы, но, возможно, стоит посмотреть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top