gpt4 book ai didi

c# - 使用委托(delegate)而不是接口(interface)来解耦。好主意?

转载 作者:行者123 更新时间:2023-11-30 16:36:23 28 4
gpt4 key购买 nike

在编写 GUI 应用程序时,我使用“控制”或“协调”应用程序的顶级类。顶级类将负责协调诸如初始化网络连接、处理应用程序范围的 UI 操作、加载配置文件等事情。

在 GUI 应用程序的某些阶段,控件被移交给不同的类,例如,一旦用户进行身份验证,主控件就会从登录屏幕切换到数据输入屏幕。不同的类需要使用顶级控件所拥有的对象的功能。过去我只是简单地将对象传递给从属控件或创建一个界面。最近我更改为传递方法委托(delegate)而不是整个对象,主要原因有两个:

  • 在单元测试时模拟方法比模拟类容易得多,
  • 通过在类构造函数中准确记录下属类正在使用的方法,使代码更具可读性。

一些简化的示例代码如下:

delegate bool LoginDelegate(string username, string password);
delegate void UpdateDataDelegate(BizData data);
delegate void PrintDataDelegate(BizData data);

class MainScreen {
private MyNetwork m_network;
private MyPrinter m_printer;

private LoginScreen m_loginScreen;
private DataEntryScreen m_dataEntryScreen;

public MainScreen() {
m_network = new Network();
m_printer = new Printer();

m_loginScreen = new LoginScreen(m_network.Login);
m_dataEntryScreen = new DataEntryScreen(m_network.Update, m_printer.Print);
}
}

class LoginScreen {
LoginDelegate Login_External;

public LoginScreen(LoginDelegate login) {
Login_External = login
}
}

class DataEntryScreen {
UpdateDataDelegate UpdateData_External;
PrintDataDelegate PrintData_External;

public DataEntryScreen(UpdateDataDelegate updateData, PrintDataDelegate printData) {
UpdateData_External = updateData;
PrintData_External = printData;
}
}

我的问题是,虽然我更喜欢这种方法,而且它对我来说很有意义,但下一位出现的开发人员将如何找到它?在示例和开源 C# 代码中,接口(interface)是首选的解耦方法,而这种使用委托(delegate)的方法更倾向于函数式编程。我是否可能让后续开发人员低声发誓,因为这对他们来说是一种违反直觉的方法?

最佳答案

这是一个有趣的方法。您可能需要注意两件事:

  1. 就像 Philip 提到的,当您有很多方法要定义时,您最终会得到一个很大的构造函数。这样就会造成类之间的深度耦合。多一个代表或者少一个代表都会要求大家修改签名。您应该考虑将它们设为公共(public)属性并使用一些 DI 框架。

  2. 有时将实现分解到方法级别可能过于精细。使用类/接口(interface),您可以按域/功能对方法进行分组。如果将它们替换为委托(delegate),它们可能会混淆并变得难以阅读/维护。

似乎代表的数量是这里的一个重要因素。

关于c# - 使用委托(delegate)而不是接口(interface)来解耦。好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880652/

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