C# 在C中嵌套匿名委托-如何使代码可维护和可读?

C# 在C中嵌套匿名委托-如何使代码可维护和可读?,c#,coding-style,refactoring,C#,Coding Style,Refactoring,我正在制作一个游戏,它可能有模式用户界面窗口,比如popover窗口。 我将所有的fiddling封装到我的类中,我只调用一个方法在屏幕上显示这样的窗口,例如一个显示字符列表的方法: ShowCharactersTable(List<Character>list, Action<Character>didSelectCharacter, Action<bool>didCancel) 这很好。一切都是透明的,易于使用。但一旦我需要嵌套这个,我就会遇到

我正在制作一个游戏,它可能有模式用户界面窗口,比如popover窗口。 我将所有的fiddling封装到我的类中,我只调用一个方法在屏幕上显示这样的窗口,例如一个显示字符列表的方法:

ShowCharactersTable(List<Character>list, 
    Action<Character>didSelectCharacter, Action<bool>didCancel)
这很好。一切都是透明的,易于使用。但一旦我需要嵌套这个,我就会遇到麻烦。例如,在字符列表中,我在每个字符单元格上都有几个按钮,所以我需要为此提供代理。这变得复杂了。我可能还需要在上面显示另一个模式窗口,调用如下:

ShowActivitySelector(List<Activity>activitiesToShow,
     Action<Activity>didSelectActivity,   
     Action<bool>didCancelPickingActivity);
当我选择“活动”时,如果出现问题,我可能需要显示警报,如下所示:

ShowAlert(string alertText, Activity<bool>didAccept,
          Activity<bool>didCancel);
现在,要调用一个简单的字符表,我需要编写一个包含嵌套委托的3页长的方法。听起来不好玩。如何将其模块化并使其更容易/更易于维护

我不想把我的界面和我的模型结合起来,因为我需要用不同的参数显示那些来自我游戏不同部分的列表、选择器和警报。
如何解决这个问题?我该怎么办?

MVVM和wpf应该解决这个问题。不应在一个ViewModel中定义所有代理。每个视图都有自己的ViewModel,只有ViewModel必须相互通信。例如,如果可以从不同的位置调用同一个窗口,则这意味着存在位置的ViewModels,但它们调用相同的ViewModel实例来显示该窗口。您需要深入分析您的程序。重构,使用设计模式。如果需要,可以考虑附加事件。我会使用事件,然后您可以将订阅者附加到它们,或者如果代码可以线程化,您可以处理这些内容,如果需要后续操作,允许继续。我还想考虑一下这里的单一责任原则,通过嵌套所有这些功能,根上的东西不再执行一个任务。。。还是这样?我们不能确定!随着游戏的发展,这会增加游戏的模糊性。MVVM和wpf应该可以做到这一点。不应在一个ViewModel中定义所有代理。每个视图都有自己的ViewModel,只有ViewModel必须相互通信。例如,如果可以从不同的位置调用同一个窗口,则这意味着存在位置的ViewModels,但它们调用相同的ViewModel实例来显示该窗口。您需要深入分析您的程序。重构,使用设计模式。如果需要,可以考虑附加事件。我会使用事件,然后您可以将订阅者附加到它们,或者如果代码可以线程化,您可以处理这些内容,如果需要后续操作,允许继续。我还想考虑一下这里的单一责任原则,通过嵌套所有这些功能,根上的东西不再执行一个任务。。。还是这样?我们不能确定!随着游戏的发展,这会增加游戏的模糊性。MVVM和wpf应该可以做到这一点。不应在一个ViewModel中定义所有代理。每个视图都有自己的ViewModel,只有ViewModel必须相互通信。例如,如果可以从不同的位置调用同一个窗口,则这意味着存在位置的ViewModels,但它们调用相同的ViewModel实例来显示该窗口。您需要深入分析您的程序。重构,使用设计模式。如果需要,可以考虑附加事件。我会使用事件,然后您可以将订阅者附加到它们,或者如果代码可以线程化,您可以处理这些内容,如果需要后续操作,允许继续。我还想考虑一下这里的单一责任原则,通过嵌套所有这些功能,根上的东西不再执行一个任务。。。还是这样?我们不能确定!随着游戏的发展,这将增加模糊性。
ShowAlert(string alertText, Activity<bool>didAccept,
          Activity<bool>didCancel);