java — Лучший способ структурировать класс парсера
спросил
Изменено 9 лет, 4 месяца назад
Просмотрено 2к раз
Я работаю над проектом, в котором мне нужно проанализировать текстовый файл и использовать эту информацию для некоторых операций с данными.
У меня есть класс парсера, в котором я использую массив для хранения данных из текстового файла. Затем у меня есть отдельный класс, который использует эти данные. Моя текущая настройка выглядит примерно так (очевидно, псевдокод):
class Parser{ частный: массив проанализированных данных; публичный: встроенный массив getParsedData () { вернуть проанализированные данные; } }; алгоритмы класса{ //функции, использующие данные из массива parsedData; };
Я чувствую, что довольно неэффективно просто иметь частный массив, а затем просто иметь публичную функцию, которая просто возвращает массив, который я могу разбрасывать.
- java
- c++
- oop
- design-patterns
Вы правы, потому что здесь довольно много проблем:
- Будет ли ваш парсер повторно использоваться ред?
- Должен ли он быть потокобезопасным?
- Вы анализируете массивный текстовый файл, и в этом случае буферизация проанализированных данных будет менее эффективной, чем их «потоковая передача».
Если у вас относительно небольшой текстовый файл и вы хотите использовать синтаксический анализатор только один раз в одном потоке, вам нужно может :
- Инициализировать массив до нуля
- Убедитесь, что поле массива является закрытым и не имеет сеттеров
- Иметь метод
разбора
, который будет читать текстовый файл и устанавливать значение поля массива - Иметь
синтаксический анализ
генерировать исключение, если поле массива не равно нулю.
ОДНАКО, это сложно. Другой подход для небольших текстовых файлов, но вам нужно анализировать несколько раз:
- Парсер будет иметь только один статический метод с именем
parse
, который принимает текстовый файл и возвращает проанализированный массив токенов.
Преимущество однометодного подхода заключается в том, что вам не нужно усложнять управление массивом токенов как вещью с отслеживанием состояния. И у вас есть меньший интерфейс, что приятно.
Наконец, если у вас есть большой текстовый файл, пусть ваш метод синтаксического анализа создает токены в виде потока.
В Java, по крайней мере, «return parsedData» вернет ссылку на ваш «частный массив».
Затем вызывающая программа может делать с parsedData все, что ей угодно;
Таким образом, это очень эффективно, поскольку передается только адрес, но если вы намеревались сохранить частную неизменяемую копию в своем классе, вам нужно будет вернуть копию parsedData, что было бы менее эффективно.
В c++ вам нужно будет явно вернуть ссылку или копию, но в Java ссылка — это все, что вы можете вернуть.
2Класс парсера (System.CommandLine.Parsing) | Microsoft Узнайте
Редактировать Твиттер LinkedIn Фейсбук Электронная почта- Артикул
Определение
- Пространство имен:
- System.CommandLine.Parsing
- Сборка:
- System.CommandLine.dll
Важный
Некоторая информация относится к предварительной версии продукта, который может быть существенно изменен до его выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.
Анализирует ввод командной строки.
парсер открытого класса
парсер открытого класса
тип парсера = класс
парсер открытого класса
- наследование
Объект
Парсер
Конструкторы
Парсер() | Инициализирует новый экземпляр класса Parser, используя значение по умолчанию . |
Анализатор(команда) | |
Парсер (CommandLineConfiguration) |
Характеристики
Конфигурация | Конфигурация, на которой основаны грамматика и поведение парсера. |
Методы
Равно(Объект) | Определяет, равен ли указанный объект текущему объекту. (Унаследовано от объекта) |
ПолучитьHashCode() | Служит хеш-функцией по умолчанию. (Унаследовано от объекта) |
ПолучитьТип() | Получает тип текущего экземпляра. (Унаследовано от объекта) |
MemberwiseClone() | Создает поверхностную копию текущего объекта. (Унаследовано от объекта) |
Анализ (IReadOnlyList | Анализирует список аргументов. |