【问题标题】:Making legacy straightforward win.forms application code more clear使传统的简单 win.forms 应用程序代码更清晰
【发布时间】:2017-08-31 11:33:23
【问题描述】:

我有旧版 win.forms 应用程序,它以非常简单的方式编写,表单在 UI 事件上与 DAL 进行通信。例如,有文本框:登录名/密码、按钮 - “登录”和实现业务逻辑的单击处理程序(要求 DAL 通过 id/密码获取用户,如果不为空 - 则显示下一个屏幕,如果为空 - 显示“重试屏幕”)。

我无法从头开始重写它(在 MVP 或视图/文档模式中),我只想将业务逻辑与处理程序分开:获取与 DAL 通信的现有处理程序代码并将其分组到 UI 处理程序之外的某个位置。

数十个表单由数十个用户控件组成,通常不清楚谁负责业务逻辑。有时它是 UI 控件。但有时它是一个表单,它正在监听自定义 UI 控件事件,然后实现业务逻辑。

如果我分离业务逻辑,谁应该负责调用业务逻辑控制器?表单、用户控件,还是表单和用户控件同时使用?

提前谢谢你!

【问题讨论】:

    标签: winforms language-agnostic architecture refactoring


    【解决方案1】:

    与大多数重构一样,采取小步骤。

    首先将代码提取到新方法中。 因此,除了 btnLogin_Click 事件中的所有登录代码,您只需有一个名为 LogUserIn() 的方法或类似的东西。

    为部分(或全部)事件处理程序完成此操作后,您可能会开始看到一些常见趋势。也许有一个比较相似的注销。现在你有两个新类的方法。

    然后您可以开始在事件处理程序中使用该类。像 UserData.Login(name, pw) 和 UserData.Logout(name)

    不要试图一次做所有事情。进行更改,验证它是否有效,再进行更改,验证它是否有效。

    请记住,您不必一开始就进行完美的重构,即使是增量更改听起来也会是一个巨大的改进。

    【讨论】:

    • 谢谢,这就是我目前要做的事情。但我问的是更进一步的步骤。我什么时候将所有业务逻辑与应该负责调用它的 UI 处理程序放在单独的类中?有时是用户控件:btnLogin_Click 调用 UserData.Login()。但可能是应该是一种形式?登录控件有 OnLogin 事件表单监听,它是一个调用 UserData.Login() 的表单。我想要一些统一的方法。或者混合代码就可以了?
    • 混合方法也可以。但是,我可能会站在调用业务代码的事件处理程序一边。原因是,如果您想更改您的 GUI,您的新 GUI 可以调用该代码,但可能很难让您的业务代码监听不同的事件。除非我不清楚你在问什么。
    • 想象一下,我有“登录”用户控件,带有 2 个文本框和“登录”按钮。谁负责调用 UserData.Login?至少有2个地方。我可以处理 btnLogMeIn_Click 事件并在那里调用 UserData.Logic。将自定义事件添加到登录控件的另一个选项: OnLoginEvent 并在表单中处理它。现在表单负责调用 UserData.Login。你个人更喜欢什么?
    • 就我个人而言,我有这个表格。 1)我没有很多用户控件 2)如果它只是引发了一个事件,你可以重用你的 UserControl。这样,如果另一个项目需要您的 UserControl,您就不必编写一个调用不同业务逻辑的新项目。相反,托管表单将简单地捕获事件。
    • 感谢您的耐心等待 - 您和 @Stefan 给出了相同的建议,但我会将 Stefan 的回复标记为答案,因为他的声誉较低)
    【解决方案2】:

    我的主观意见是尽可能多地解耦。将所有业务对象代码粘贴到它自己的库或类中,将与业务对象相关的所有行为放入该类中。然后让您的 UI 代码调用。如果您需要在通信之间等待(例如在巨大的数据库中搜索登录凭据),请暂停 UI,直到它听到来自您的业务对象的响应。这种方法的优点是理论上您可以在将来分发它。让服务器运行后端代码,而 UI 只需发送请求并等待响应。虽然也许我误解了你的问题?

    【讨论】:

    • 嗯,谢谢,但这看起来正是我现在要做的:将业务对象代码放在一个地方(停止 ui 处理程序和业务逻辑混合)。因此,可以通过方法从 UI 访问此代码。我想知道谁来称呼这些新方法:表单或控件。想象一下,我有用户控制“登录”:2 个文本框 + 1 个按钮。 “登录”应该在按钮单击时调用业务逻辑方法,还是应该“登录”有“OnLogin”事件并将业务逻辑调用委托给表单?现在的代码有混合的方法:有时是控件,但有时表单包含业务逻辑
    • 啊,我明白你现在所说的表单与控件是什么意思了。我会说用最小的公分母去。如果您打算重用具有不同控件的表单类,则将这些调用方法放在表单本身上并让控件触发事件可能是一个更安全的选择。回到您的登录示例..如果您想要某种形式的验证,假设凭据错误,您需要显示一条消息..在我看来,如果表单处理这种行为会更好,因为控件应该用于大部分人彼此不知道。
    • 但是,如果您要遵循 Windows 标准,最好将所有行为放在表单中,因为我认为这与 afx 消息映射类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多