У меня есть приложение, которое состоит из двух процессов: одного клиентского процесса с (на основе SWT) графического интерфейса пользователя и одного серверного процесса.Клиентский процесс очень легкий, что означает, что многие операции с графическим интерфейсом пользователя должны будут запрашивать серверный процесс или запрашивать его к чему-либо, например, в ответ на нажатие пользователем кнопки или выбор пункта меню.Это означает, что будет много обработчиков событий, которые выглядят так:
// Method invoked e.g. in response to the user choosing a menu item
void execute(Event event) {
// This code is executed on the client, and now we need some info off the server:
server.execute(new RemoteRequest() {
public void run() {
// This code is executed on the server, and we need to update the client
// GUI with current progress
final Result result = doSomeProcessing();
client.execute(new RemoteRequest() {
public void run() {
// This code is again executed on the client
updateUi(result);
}
}
}
});
}
Однако, поскольку server.execute
подразумевает сериализацию (выполняется на удаленном компьютере), этот шаблон невозможенне делая сериализуемый весь класс (поскольку внутренние классы RemoteRequest
не являются статическими (просто для ясности: не требуется, чтобы реализация Request
могла обращаться к родительскому экземпляру, ради приложения они могли бы быть статическими).).
Конечно, одним из решений является создание отдельных (возможно, статических внутренних) классов для Запроса и Ответа, но это ухудшает читабельность и затрудняет понимание потока выполнения.
IЯ пытался найти какой-либо стандартный шаблон для решения этой проблемы, но я не нашел ничего, что отвечало бы моему беспокойству о читаемости.
Чтобы было ясно, этих операций будет много, и операции часто бывают довольнокоротко. Обратите внимание, что Future
объекты здесь не совсем полезны, так как во многих случаяходин запрос к серверу должен будет выполнить несколько действий на клиенте (часто меняющихся), и это также не всегда является возвращаемым результатом.
В идеале я хотел бы иметь возможность написать код, подобный этому:(очевидный псевдокод сейчас, пожалуйста, не обращайте внимания на очевидные ошибки в деталях)
String personName = nameField.getText();
async exec on server {
String personAddress = database.find(personName);
async exec on client {
addressField.setText(personAddress);
}
Order[] orders = database.searchOrderHistory(personName);
async exec on client {
orderListViewer.setInput(orders);
}
}
Теперь я хочу пояснить, что базовая архитектура работает и работает хорошо, причина этого решения в том,Конечно, не приведенный выше пример.Единственное, что я ищу, - это способ написания кода, подобного приведенному выше, без необходимости определять статические классы для каждого перехода процесса.Я надеюсь, что я не просто усложнил ситуацию, приведя этот пример ...