gpt4 book ai didi

winforms - Windows 窗体应用程序中的 OOP 与 case 语句

转载 作者:行者123 更新时间:2023-12-01 13:08:48 26 4
gpt4 key购买 nike

我有一个软件设计问题。假设我有一个包含一些元素的 Windows 窗体,并且我有一个客户对象。例如,客户可以是企业、私有(private)或公司。

现在,所有关于表单中将要发生的事情的决定都将取决于客户类型。例如,某些元素会被隐藏,某些标签文本会有所不同,等等……事件会有不同的响应。

显然,编写此代码的一种方法是在每次需要做出决定时使用 CASE 语句。另一种方法是让 Customer 类和其他 3 个类(例如 BusinessCustomer、PrivateCustomer 和 CorporateCustomer)继承自基类。在后者中,会出现一个问题:您将如何将窗口从中合并到其中....

已编辑

我有一个想法:我可以在表单中嵌入表单吗?我的要求不要求同时显示两个窗口,所以我不必使用 MDI。但是为了根据此处一些人的评论简化我的设计,我想维护 3 种不同的客户表单,并动态嵌入到主表单中。这样三个 GUI 就分开了,我就不必处理每个控件的可见性。

我假设我可以将一个表单添加到另一个表单,例如:

Form child_form = new Form();
parent_form.Controls.Add(child_form);

最佳答案

这些决定真的不应该在 GUI 中做出。您应该在 GUI 后面有一个 ViewModel 来做出这些决定,并为其编写单元测试。 (或者 Presenter 或 Controller —— 不同的名称都表示大致相同的意思:将决定从 GUI 类中取出并放入可以进行单元测试的内容中。)

然后您的 ViewModel 将具有例如GUI 将禁用的每个元素的 bool 属性,以及您可以采取的每个操作的方法(CloseCustomerAccount() 或其他)。

只要表单是为特定类型的客户创建的,并且该客户在表单的生命周期内不会更改为不同类型的客户,您就可以传递您的客户对象(存储所有实际客户数据)到 ViewModel 的构造函数,然后将 ViewModel 传递给 Form 的构造函数。窗体可以在调用 InitializeComponent() 后立即设置其所有 Enabled 属性。另一方面,如果客户类型可能发生变化,那么您的 ViewModel 需要公开一些事件以供表单 Hook ,以便表单知道何时重新运行其启用逻辑。

然后您的问题从表单移出并移入 ViewModel。您是否有一个带有一堆 case 语句的 ViewModel 类,或三个使用多态性的 ViewModel 类(可能有第四个是基类),以及某个地方的工厂方法,该方法根据特定客户决定要实例化哪个 ViewModel 类?

我会让您的代码成为那里的指南。从最简单的方法开始,这可能是 case 语句。为您关心的每个行为编写单元测试。如果 case 语句开始变得太笨拙,则为每种客户类型添加一个 ViewModel 后代,并开始将 case 语句提取到虚拟方法中。如果您在重构过程中犯了错误,您的测试会捕获您。

关于winforms - Windows 窗体应用程序中的 OOP 与 case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com