桌面客户端应用程序的良好架构
Good architecture for desktop client application
我已经 运行 多次研究创建用于某些服务器的桌面客户端应用程序的问题,每次我都以丑陋的代码结束,在几个版本之后变得无法支持.
我强调了以下要点:
所有操作必须是异步的,没有任何虚拟 windows 相对快速的操作(即少于 30 秒)
应用程序必须定期与服务器连接并检查,例如,用户帐户
所有繁重的操作必须是可取消的
但是,最重要的是,所有这些都必须 "naturally" 在代码中,而不会造成不必要的困难(单例、hack 等)...只需要开销最小的代码。
你会如何设计这样的应用程序?你会用什么模式?有什么架构好的开源项目可以推荐一下吗?
这似乎有点太宽泛了,但我不会标记,而是会在我觉得这个问题很有趣时尝试给出答案。我邀请您在想到时添加更多详细信息。
即使您的设计涉及应用程序的设计,也有许多语言、模式和技术可以满足您的要求。
保持笼统,
- 如果您希望您的操作是异步的,您将
需要多个线程。它们的实施和使用可能会有所不同
取决于您使用的语言,但背后的概念
是一样的。因此,每次需要时都生成一个线程
异步任务,并实现一种在任务执行时被注意到的方法
完成(有或没有错误)。这可以通过多种方式完成,
既然你问了模式,我建议你看看
observer.
- 第二个要求我不是很清楚,我假设你
想要定期检查客户的数据是否与
服务器的,并可能执行安全检查(“是会话和
身份验证凭据仍然有效?”)。第一个解决方案是
实际上每隔 n 秒询问一次服务器,再次使用另一个
线。不过,这种轮询可能不是最佳选择:如何
您是否考虑了连接问题的可能性?即使你的
如果没有与服务器的有效连接,客户端将无法运行,它
可能会打扰用户断开连接并丢失他的工作
因为他的 Wi-Fi 路由器重启了。我建议你表演
在 I/O 进行对齐检查,可能区分关键和
非关键的。例如,如果您决定用户的个人资料
有对齐,那么您在查看时会从服务器检索更新的数据。另一方面,如果您的应用提供
使用烹饪食谱列表,你不关心他
在 10 分钟内查看已插入服务器的那个
过去,您可以简单地缓存这些项目并在
每分钟后台线程,甚至没有注意到用户
万一更新失败。最后但同样重要的是,如果你也是
关注数据的并发修改,同样基于你的
您可以决定对正在编辑的数据实施锁定的要求,
对 save 操作执行检查以查看数据是否具有
同时更改,或者只是让用户覆盖
服务器上的数据无论如何。总而言之,希望我解释
你的问题正确,这个要求很重要,必须是
根据您的特定用例进行调整。
- 假设数据最终保存在某种数据库中
服务器,一个答案是 transactions,它允许您
甚至将复杂的操作序列视为 "all or nothing",
原子指令。您可以实施自己的系统以拥有
结果相同,但我真的不明白不使用它的意义
尽可能使用强大的工具。记住一件事:我是
假设 "cancelable" 表示“在某个时间点之前可取消,
而不是之后”(一种 "undo")。如果您正在寻找完整的
任何数据操作的可恢复性,要求变得很远
比较复杂,一般无法保证。
我相信我已经以一种可以帮助您尽可能减少代码 "hacks" 的方式回答了。回顾一下:
- 你将需要线程,观察者模式可以帮助你
保持代码整洁。
- 同样,您可以使用线程,或者重点检查 I/O 操作。在
第二种情况,你可能会考虑一个应用层
专门用于客户端-服务器同步,将其嵌入一个或
more 类,并在那里执行所有检查。看看
proxy pattern.
- 使用事务恢复操作,仅发出
COMMIT
当您确定操作已确认时,ROLLBACK
in
每隔一个案例。将此逻辑封装在您的服务器代码中,以便
客户不知道正在使用的实际交易系统,
你的代码应该很干净。
如果我的回答不令人满意或不清楚,请发表评论。
我已经 运行 多次研究创建用于某些服务器的桌面客户端应用程序的问题,每次我都以丑陋的代码结束,在几个版本之后变得无法支持.
我强调了以下要点:
所有操作必须是异步的,没有任何虚拟 windows 相对快速的操作(即少于 30 秒)
应用程序必须定期与服务器连接并检查,例如,用户帐户
所有繁重的操作必须是可取消的
但是,最重要的是,所有这些都必须 "naturally" 在代码中,而不会造成不必要的困难(单例、hack 等)...只需要开销最小的代码。
你会如何设计这样的应用程序?你会用什么模式?有什么架构好的开源项目可以推荐一下吗?
这似乎有点太宽泛了,但我不会标记,而是会在我觉得这个问题很有趣时尝试给出答案。我邀请您在想到时添加更多详细信息。
即使您的设计涉及应用程序的设计,也有许多语言、模式和技术可以满足您的要求。
保持笼统,
- 如果您希望您的操作是异步的,您将 需要多个线程。它们的实施和使用可能会有所不同 取决于您使用的语言,但背后的概念 是一样的。因此,每次需要时都生成一个线程 异步任务,并实现一种在任务执行时被注意到的方法 完成(有或没有错误)。这可以通过多种方式完成, 既然你问了模式,我建议你看看 observer.
- 第二个要求我不是很清楚,我假设你 想要定期检查客户的数据是否与 服务器的,并可能执行安全检查(“是会话和 身份验证凭据仍然有效?”)。第一个解决方案是 实际上每隔 n 秒询问一次服务器,再次使用另一个 线。不过,这种轮询可能不是最佳选择:如何 您是否考虑了连接问题的可能性?即使你的 如果没有与服务器的有效连接,客户端将无法运行,它 可能会打扰用户断开连接并丢失他的工作 因为他的 Wi-Fi 路由器重启了。我建议你表演 在 I/O 进行对齐检查,可能区分关键和 非关键的。例如,如果您决定用户的个人资料 有对齐,那么您在查看时会从服务器检索更新的数据。另一方面,如果您的应用提供 使用烹饪食谱列表,你不关心他 在 10 分钟内查看已插入服务器的那个 过去,您可以简单地缓存这些项目并在 每分钟后台线程,甚至没有注意到用户 万一更新失败。最后但同样重要的是,如果你也是 关注数据的并发修改,同样基于你的 您可以决定对正在编辑的数据实施锁定的要求, 对 save 操作执行检查以查看数据是否具有 同时更改,或者只是让用户覆盖 服务器上的数据无论如何。总而言之,希望我解释 你的问题正确,这个要求很重要,必须是 根据您的特定用例进行调整。
- 假设数据最终保存在某种数据库中 服务器,一个答案是 transactions,它允许您 甚至将复杂的操作序列视为 "all or nothing", 原子指令。您可以实施自己的系统以拥有 结果相同,但我真的不明白不使用它的意义 尽可能使用强大的工具。记住一件事:我是 假设 "cancelable" 表示“在某个时间点之前可取消, 而不是之后”(一种 "undo")。如果您正在寻找完整的 任何数据操作的可恢复性,要求变得很远 比较复杂,一般无法保证。
我相信我已经以一种可以帮助您尽可能减少代码 "hacks" 的方式回答了。回顾一下:
- 你将需要线程,观察者模式可以帮助你 保持代码整洁。
- 同样,您可以使用线程,或者重点检查 I/O 操作。在 第二种情况,你可能会考虑一个应用层 专门用于客户端-服务器同步,将其嵌入一个或 more 类,并在那里执行所有检查。看看 proxy pattern.
- 使用事务恢复操作,仅发出
COMMIT
当您确定操作已确认时,ROLLBACK
in 每隔一个案例。将此逻辑封装在您的服务器代码中,以便 客户不知道正在使用的实际交易系统, 你的代码应该很干净。
如果我的回答不令人满意或不清楚,请发表评论。