Список объектов - лучшая практика - PullRequest
1 голос
/ 25 января 2012

Итак, есть новый парень, который начал там, где я работаю.Я сам начинающий программист, но я занимаюсь разработкой немного дольше, поэтому я использую свое "внутреннее чувство", чтобы помочь нам в разработке проекта.Слепой ведет слепого.

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

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

List<Integer> fileId = new List<Integer>;
List<String> title = new List<String>;

И затем вы создадите метод, который будет запрашивать эти списки в поисках идентификатора.

Я представлял, что будет создан метод для запроса файла из файла XML без сохранения / установки чего-либо, например, так:

public Form getFile(Integer id) {
  Form ret = new Form();
  //Query XML, set to ret...
  return ret;
}

Я хотел использовать объекты-значения, так какЯ привык работать.Так что в конце предложили и согласились:

List<Form> forms = new List<Form>;

Итак, теперь у нас есть 2 метода: 1 для заполнения переменной 'формы', а затем 1 для запроса и возврата формы ... все ещемне кажется очень странным.

Кроме того, вместо:

Form tempForm = new Form();
tempForm.id = 1;
tempForm.title = "Foo";

Он предпочитает делать:

Form tempForm = new Form(id, title);

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

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

Ответы [ 3 ]

2 голосов
/ 25 января 2012

На ваш второй вопрос стиля:

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

public class Form {
  private final String id;
  private final String title;
  public Form(String id, String title) {
    this.id = id; this.title = title;
  }
  public String getTitle() { return title; }
  public String getId() { return id; }
}

Это помогает избежать проблем параллелизма.

1 голос
/ 25 января 2012

Интересный вопрос!Есть, однако, несколько вопросов в одном.Позвольте мне ответить на каждый из них в отдельности.

Позвольте мне сначала изложить определение типа значения , найденное на domaindrivendesign.org

Определение: Объект-значение - это объект, который описывает некоторую характеристику или атрибут, но не имеет понятия идентичности.

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

Теперь вернемся к актуальному вопросу, я настоятельно рекомендую ваш способ кодирования - создание класса для данных, которые принадлежат друг другу.В первом примере id и title связаны индексом только в двух отдельных списках.

Лучше использовать эту форму

Form tempForm = new Form(id, title);

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

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

Здесь я хотел бына самом деле создайте новый класс, содержащий только эти два метода вместо того, чтобы они говорили в статическом классе.Я бы назвал это FormCollection.Вы, ребята, можете придумать более умное имя, так как у вас больше контекста.Потратьте не более пяти минут на то, чтобы найти осмысленное имя.

Вы также можете провести дальнейший рефакторинг своего кода, например, чтобы указать путь к файлу или потоку xml в качестве аргумента конструктора, а затем использовать один метод для запроса его в id,Вот так:

class FormCollection
{
    public FormCollection(String xmlFilePath) { ... }
    public Form getById(int id) { ... }
}

Это, вероятно, хороший интерфейс для остальной части вашего приложения, поскольку он прост и понятен.Также это легко проверить.

1 голос
/ 25 января 2012

Я не уверен, что правильно понял ваш вопрос, но по сути это звучит как вопрос производительности.То есть: стоит ли читать весь XML-файл и реструктурировать его так, чтобы его было проще и быстрее запрашивать, или лучше каждый раз сканировать XML-файл и выполнять запросы к нему.Это вопрос, на который может ответить только ты.Как обычно, нужно оценить компромисс между скоростью и пространством.

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

При этом существует несколько разных библиотек, которые можно использовать для ускорения обработки различными способами.Вы можете посмотреть на использование XQuery и / или XPath (см. Как читать XML с использованием XPath в Java ), JAXB, SAX и т. Д. Каждая технология имеет свои преимущества и недостатки.

Надеемся,это даст вам немного больше информации, которую вы можете обсудить друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...