Как один класс должен запрашивать информацию у другого? - PullRequest
3 голосов
/ 13 февраля 2009

Я работаю над программой пакетного экспорта PDF в VB.NET для чертежей САПР. Программы работают нормально, но архитектура беспорядок. По сути, одна большая функция берет весь процесс от начала до конца. Я хотел бы сделать отдельный класс или несколько, чтобы сделать работу по экспорту.

Вот проблема:
Иногда файл PDF, который будет создан моей программой, уже существует. В этом случае я хотел бы спросить пользователя, хочет ли он перезаписать существующие PDF-файлы. Я только хочу сделать это, если есть что-то, что будет перезаписано, и я хочу сделать это только один раз. Другими словами, «да» = «да для всех». Кажется неправильным, чтобы форма (которая будет вызывать этот новый класс экспорта PDF) определяла, как будут называться файлы PDF и будут ли какие-либо перезаписи. Фактически, было бы лучше, чтобы имена файлов PDF определялись при обработке отдельных чертежей САПР (поскольку я мог бы использовать информацию, которая станет доступной только после загрузки файлов в программе САПР в фоновом режиме).

Вот вопрос:
Как мне обработать запрос пользователя? Я хотел бы сохранить всю логику GUI (даже такую ​​простую, как диалоговое окно) вне моего класса экспорта PDF. Мне нужно, чтобы класс экспорта в PDF сказал: «Эй, мне нужно знать, должен ли я перезаписать или пропустить этот файл», и класс формы (или любой другой класс), чтобы сказать: «Хм, хорошо, я спросите пользователя и свяжемся с вами. "

Кажется, должен быть какой-то шаблон, чтобы справиться с этой ситуацией. Что это?

прослеживаний:

События: похоже, это хороший путь. О том, как должен выглядеть код в классе экспорта PDF?

    Dim e As New FileExistsEventArgs(PDFFile)
    RaiseEvent FileExists(Me, e)
    If e.Overwrite Then
        'Do stuff here
    End If

Сумасшедшая идея: как насчет передачи функций-делегатов в метод экспорта класса экспорта PDF для обработки случая перезаписи?

Ответы [ 5 ]

4 голосов
/ 13 февраля 2009

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

void form_Load(object sender,EventArgs e)
{
   //We are subscribing to the event here. In VB this is done differently
   pdfExporter.FileExists+=new FileExistsEventHandler(pdfExporter_fileExists)
}

void pdfExporter_fileExists(object sender, FileExistsEventArgs e)
{
   //prompUser takes the file and asks the user
   if (promptUser(e.FileName)) 
   {
   }
}
1 голос
/ 13 февраля 2009

Ваш класс создания PDF должен вызвать событие . Это событие должно иметь объект eventargs, который может иметь логическое свойство «Перезапись», которое GUI устанавливает любым способом, который вы хотите. Когда событие вернется в ваш класс PDF, вы будете иметь решение пользователя и можете перезаписать или нет при необходимости. Gui может обработать событие в любом случае.

Кроме того, я рекомендую вам работать над тем, чтобы эти двое были разделены!

0 голосов
/ 13 февраля 2009

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

Как я это делаю, у меня есть класс Status и класс Progress. Они существуют потому, что Status предназначен для обновления сообщения о состоянии, а индикатор выполнения предназначен для работы с индикатором прогресса.

Оба они работают с объектом, который имеет тип класса IStatusDisplay и IPrograssDisplay с уважением.

Мой графический интерфейс определяет объект, реализующий IStatusDisplay (или IProgressDisplay), и регистрируется как текущий дисплей с DLL, имеющей Status и Progress. В DLL с Status и Progress также есть два синглтона, называемые NullStatus и NullProgress, которые можно использовать, когда не требуется обратная связь с пользовательским интерфейсом.

С помощью этой схемы я могу добавить в свой код столько обновлений Status или Progress, сколько захочу, и меня беспокоит только реализация на уровне GUI. Если я хочу тихий процесс, я могу просто использовать нулевые объекты. Также, если я полностью изменю свой GUI Framework, все, что нужно сделать новому GUI, - это создать новый объект, который реализует IStatusDisplay, IProgressDisplay.

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

EDIT Вы можете создать класс подсказки и IPromptDisplay для обработки ситуации, например, для запроса, хотите ли вы перезаписать файлы.

Например

Dim P as New Prompt(MyPromptDisplay,PromptEnum.YesNo)
'MyPromptDisplay is of IPromptDisplay and was registered by the GUI when the application was initialized

If PromptYesNo.Ask("Do you wish to overwrite files")= PromptReply.Yes Then
    'Do stuff here
End If
0 голосов
/ 13 февраля 2009

Вы можете сделать что-то типа двухфазной фиксации.

Класс имеет два интерфейса, один для подготовки имен файлов и файловой системы, а другой для выполнения реальной работы.

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

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

0 голосов
/ 13 февраля 2009

Поэтому соответствующему методу в вашем классе необходим необязательный параметр

[OverwriteExisting as Boolean = False]

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

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