Правильный способ моделирования номера ISBN в приложении J2EE

StackOverflow https://stackoverflow.com/questions/6334579

  •  27-10-2019
  •  | 
  •  

Вопрос

Я пробую веб -приложение, используя сервлеты и JSP, и мне нужно моделировать номер ISBN элемента в моем классе, а также в склонных отображениях. Какой должен быть тип номера ISBN? Long или String? Я столкнулся со многими учебниками, которые используют любой из них. ISBN, предположительно, является 10-значным идентификатором. Иногда вы сталкиваетесь с такими числами, как 0-85131-041-9, которые не могут быть длинными .. Некоторые примеры используют цифры без дефисов ..

Итак, какой должен быть тип? Какие-либо предложения?

Благодарность

отметка

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

Решение

Я бы хранил это в Long свойство и используйте форматер/анализатор (по сути, преобразователь). Когда вы собираетесь отобразить его, преобразователь должен просто преобразовать Long собственность для человеческого представления с дефисами в нужных местах. Когда вы собираетесь проверить/сохранить его, преобразователь должен удалить все дефиса из представленного значения и поместить его в Long имущество.

По сути, это та же идея, что и вы использовали для Date поле, которое вы форматируете/разрабатываете в человеческом представлении с помощью SimpleDateFormat. Анкет Единственное отличие состоит в том, что форматтер/анализатор ISBN не доступен стандартным Java SE API. Вам нужно было бы написать один самостоятельно или принять стороннюю сторону (из которых никто не приходит на ум). Наконец, этот преобразователь можно использовать в качестве тега JSP (например, JSTL <fmt:formatDate>) или отдельный класс Java, который вызывается функцией EL или когда вы используете JSF, @FacesConverter учебный класс.

Из -за комплексатета числа ISBN это действительно чаще всего хранится как String так что разработчику не нужно беспокоиться о допустимых шаблонах. Хорошо это или плохо - это вопрос, который вы должны задать себе и свою команду.

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

ISBN имеет 13 цифр (см. вики) Я бы использовал класс, который проверяет достоверность данного String. Анкет Что-то типа:

class ISBN {
  private String isbn;
  public ISBN(String isbn) throws ISBNFormatException {
    // you might want to filter hyphens first, before the check
    if(ISBN.isValid(isbn)) this.isbn = isbn;
    else throw new ISBNFormatException(isbn);
  }
  public static boolean isValid(String s) {
   // validate number here, see wiki
  }
}

Это, конечно, может быть слишком много. Если ваше приложение действительно простое, вы можете пойти с String просто хорошо.

Редактировать Гифенация делит число на группы (язык, издатель и т. Д.). Однако, что касается уникальности числа, дефисация (или деление с пространствами) не играет никакой роли.

На самом деле ISBN не 10 цифр, а 12 цифр + чек ISBN FAQ Чек может быть x

Метод определения контрольной цифры для ISBN - это модуль 11 с весовыми коэффициентами от 10 до 1. Римская цифра x используется вместо 10, где десять будет происходить в качестве контрольной цифры.

Если вы храните информацию, в которой пользователь набрал пользователь, вы должны включить Check Digit, и поэтому это должна быть строка.

Если вы храните фактический ISBN, то вы можете игнорировать проверку, как вы можете рассчитать. Однако, если использование новых 12 цифр, цифры больше, чем длинные, могут удерживать, если старые 10 цифр, то это может быть проведено долго, но вам придется помнить, что, возможно, добавить ведущие 0 с. Таким образом, в этом случае я буду держать его в строке, удаляющую все не числовые данные, например, дефисы.

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

Пять частей ISBN следующие:
1. Текущий ISBN-13 будет префикс "978"
2. Идентификатор группы или страны, который идентифицирует национальную или географическую группировку издателей;
3. Идентификатор издателя, который идентифицирует конкретного издателя в группе;
4. Идентификатор заголовка, который идентифицирует конкретный заголовок или издание названия;
5. Проверка цифра - это однозначная цифра в конце ISBN, которая проверяет ISBN.

и 5 не нужно сохранять, поскольку его можно рассчитать, но необходимо получить от пользователей для проверки входа.

Этот вопрос на самом деле не имеет ничего общего с J2EE, а просто с помощью данных Data DataS и, возможно, типов данных в вашем двигателе базы данных.

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

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

Короткий ответ: я не вижу никакого преимущества для его хранения в качестве числа. Используйте строку.

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