Лучшие практики для установки сторонних библиотек в Ваш размещенный репозиторий Знатока?

Для десятичной цифры вы можете использовать \d+(\.\d+)* регулярное выражение. Если мы поместим это в контекст утверждения, мы получим это:

(\\d+(\\.\\d+)*)+\\)\\((\\d+(\\.\\d+)*)+

Вот пример:

String s = "10.0)(20.0";
String regex = "(\\d+(\\.\\d+)*)+\\)\\((\\d+(\\.\\d+)*)+";
System.out.println(s.matches(regex));
6
задан matt b 5 May 2009 в 13:11
поделиться

5 ответов

Похоже, вы уже знакомы с некоторыми недостатками и преимуществами.

Некоторые другие: a) Делает возможным поддерживать правильную оптимизацию хвостового вызова, даже если базовая реализация не поддерживает ее б) Легче создавать такие вещи, как "трассировка стека" на уровне языка. c) Легче добавлять правильные продолжения, как вы отметили

. Недавно я написал простой интерпретатор "Scheme" на C #, который изначально использовал стек .NET. Затем я переписал его, чтобы использовать явный стек - так что, возможно, вам поможет следующее:

Первая версия использовала неявный стек времени выполнения .NET ...

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

// A "form" is an expression that can be evaluted with
// respect to an environment
// e.g.
// "(* x 3)"
// "x"
// "3"
public interface IForm
{
    object Evaluate(IEnvironment environment);
}

IEnvironment выглядела так, как и следовало ожидать:

/// <summary>
/// Fundamental interface for resolving "symbols" subject to scoping.
/// </summary>
public interface IEnvironment
{
    object Lookup(string name);
    IEnvironment Extend(string name, object value);
}

Для добавления «встроенных функций» к моему интерпретатору схемы у меня изначально был следующий интерфейс:

/// <summary>
/// A function is either a builtin function (i.e. implemented directly in CSharp)
/// or something that's been created by the Lambda form.
/// </summary>
public interface IFunction
{
    object Invoke(object[] args);
}

Это было тогда, когда он использовал неявный стек времени выполнения .NET. Кода определенно было меньше, но было невозможно добавить такие вещи, как правильная хвостовая рекурсия, и, что наиболее важно, моему интерпретатору было неудобно обеспечивать «языковой уровень» скопирован в WEB-INF / lib в веб-приложении), ваш файл jar будет читать « gdata-analytics-1.0 ». Обычно это не проблема. Однако, если имя артефакта очень распространено, например «util», вы можете включить информацию о группе в artifactId, например, используя groupId из « com.google » и artifactId из « com.google.gdata-analytics ". Да, повторение раздражает, но дает максимальную ясность в файловой системе и при поиске. На самом деле у меня была проблема, когда два разных groupId имели банку « core-1.0 », и один перезаписывал другой при копировании в каталог lib во время сборки.

  • Я повторяю предложение MattK. согласования вашего Maven versionId с той версией, которой обычно известен артефакт.

  • Если вы последуете совету Доминика о префиксе groupId с названием вашей компании (например, acme), это может упростить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

  • -121) --- 4350900-

    Похоже, вам нужен тип угла.

    // Non mutable Angle class with a normalized, integer angle-value
    public struct Angle
    {
      public Angle(int value)
      {
        Value = value;
      } 
    
      private angle;
      public Value 
      { 
        get { return angle; } 
        private set { angle = Normalize(value); } 
      }
    
      public static int Normalize(int value)
      {
         if (value < 0) return 360 - (value % 360);
         return value % 360;
      }
    }
    
    public class SomeClass
    {
      public Angle EyeOrientation { get; set; }
    }
    

    Если у вас есть определенная ценность, например, углы, деньги, вес или что-то еще, всегда полезно сделать его собственным типом, даже если само значение хранится в виде int, decimal и т. д. Этот тип делает ваши интерфейсы более понятными и безопасными. Это не то же самое, если вы ожидаете угловое или целочисленное значение в качестве аргумента некоторого метода.

    Совет по добавлению к groupId префикса названия вашей компании (например, acme) может облегчить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

    -121) --- 4350900-

    Похоже, вам нужен тип угла.

    // Non mutable Angle class with a normalized, integer angle-value
    public struct Angle
    {
      public Angle(int value)
      {
        Value = value;
      } 
    
      private angle;
      public Value 
      { 
        get { return angle; } 
        private set { angle = Normalize(value); } 
      }
    
      public static int Normalize(int value)
      {
         if (value < 0) return 360 - (value % 360);
         return value % 360;
      }
    }
    
    public class SomeClass
    {
      public Angle EyeOrientation { get; set; }
    }
    

    Если у вас есть определенная ценность, например, углы, деньги, вес или что-то еще, всегда полезно сделать его собственным типом, даже если само значение хранится в виде int, decimal и т. д. Этот тип делает ваши интерфейсы более понятными и безопасными. Это не то же самое, если вы ожидаете угловое или целочисленное значение в качестве аргумента некоторого метода.

    Совет по добавлению к groupId префикса названия вашей компании (например, acme) может облегчить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

    -121) --- 4350900-

    Похоже, вам нужен тип угла.

    // Non mutable Angle class with a normalized, integer angle-value
    public struct Angle
    {
      public Angle(int value)
      {
        Value = value;
      } 
    
      private angle;
      public Value 
      { 
        get { return angle; } 
        private set { angle = Normalize(value); } 
      }
    
      public static int Normalize(int value)
      {
         if (value < 0) return 360 - (value % 360);
         return value % 360;
      }
    }
    
    public class SomeClass
    {
      public Angle EyeOrientation { get; set; }
    }
    

    Если у вас есть определенная ценность, например, углы, деньги, вес или что-то еще, всегда полезно сделать его собственным типом, даже если само значение хранится в виде int, decimal и т. д. Этот тип делает ваши интерфейсы более понятными и безопасными. Это не то же самое, если вы ожидаете угловое или целочисленное значение в качестве аргумента некоторого метода.

    3
    ответ дан 16 December 2019 в 21:45
    поделиться

    У меня есть тенденция добавлять префикс groupId к своему собственному обычному groupId. Это делает абсолютно ясным, что это то, что я загрузил, на тот случай, если оно просочится в мир в целом.

    2
    ответ дан 16 December 2019 в 21:45
    поделиться

    Многие sourceforge проекты используют имя проекта в groupid, например:

    GroupId net.sf.json-lib ArtifactId json-lib

    Это может быть уместно в примере Google, так как в нем много артефактов Google.

    Помните, что вы можете использовать тег classifer для различения двух jar-файлов. в той же версии, но построены для разных целей, например, для разных JVM.

    0
    ответ дан 16 December 2019 в 21:45
    поделиться

    Я использую Maven около года и никогда не сталкивался с " стандартное "соглашение об именах".

    3
    ответ дан 16 December 2019 в 21:45
    поделиться

    Вам может повезти: у Google есть собственное репозиторий Maven для своих проектов. См. Эту страницу: Инструкции

    У меня было несколько проприетарных Jar-файлов, поэтому мне пришлось загрузить их на каждую рабочую станцию ​​(у нас пока нет общего репозитория компании). Я поместил их в дерево исходного кода в каталог / lib (не всегда хорошая идея) и добавил небольшой файл .BAT (или сценарий .sh), который содержал команды mvn install-file для загрузки репозитория моей локальной машины первым. время строю. Если мне когда-нибудь придется обновить эти jar-файлы, я также обновлю файл load.bat и просто перезапущу его. В моих обстоятельствах я не ожидаю, что это будет происходить чаще, чем раз в год, а может и реже.

    0
    ответ дан 16 December 2019 в 21:45
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: