繁体   English   中英

如何以更多的方式设计这些代码?

[英]how to design these codes in a more oop way?

我正在使用agsXMPP库开发基于XMPP的Microsoft WPF即时消息应用程序。 agsXMPP中有很多事件,如OnXmppConnectionStateChanged,OnLogin,OnPresence等,另一方面,由于WPF线程模式,我必须通过UI的Dispatcher.Invoke()方法处理事件,它看起来像这样:

    void handleRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
    {
        STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate
        {
            RosterItemControl rosterItem = new RosterItemControl();
            rosterItem.RosterItemName = item.Jid.User;
            rosterItem.Margin = new Thickness(0);
            STP_FriendsHolder.Children.Add(rosterItem);
        }));
    }

我几乎在每个BeginInvoke / Invoke方法中都使用匿名方法,因为我不想在任何地方创建太多的命名方法(因为我认为这不是那么“干净”)。 但是,恐怕不是以OOP方式,而且这些匿名方法很难维护。 那么,在这种情况下,如何更好地编码? 我为我的英语不好对不起,我已尽力将其弄清楚^ _ ^谢谢!

因为我不想到处创建太多命名方法

因此,您不想重复使用任何BeginInvoke / Invoke代码吗? 很好

尽管我反对“干净”的评论。

哪个更清洁? 您更容易理解哪个? 这个...

    STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate
    {
        RosterItemControl rosterItem = new RosterItemControl();
        rosterItem.RosterItemName = item.Jid.User;
        rosterItem.Margin = new Thickness(0);
        STP_FriendsHolder.Children.Add(rosterItem);
    }));

... 或这个?

    STP_FriendsHolder.Dispatcher.BeginInvoke(AddRosterItem);


    void AddRosterItem()
    {
        RosterItemControl rosterItem = new RosterItemControl();
        rosterItem.RosterItemName = item.Jid.User;
        rosterItem.Margin = new Thickness(0);
        STP_FriendsHolder.Children.Add(rosterItem);
    }
  1. 我不会在您的代码隐藏类中处理XMPP事件。 创建一个仅负责处理事件的类。
  2. 创建一个此类将使用的接口,使用干净的方法来转换XMPP事件,例如NewRosterItem(RosterItem item)
  3. 通过在调度程序上调用来调用这些方法(即,将BeginInvoke封装到处理事件的类中)。
  4. 让您的视图实现该接口并向事件处理类注册,然后他们可以创建和更新所需的任何控件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM