如何提取方法的连接代码? WPF

How to extract connection code to a method? WPF

我正在将我的应用程序移植到 MVVM 模式,并开始将代码从我视图后面的代码移动到它自己的 model class.

我采取的第一步是将设备的网络代码 https://www.thalmic.com/en/myo/ 移动到 MyoDevice class。

原始代码将所有网络代码托管在后面的代码中,有人告诉我这是不好的做法。

我尝试在 Visual Studio 中使用 "Extract to Method" 工具,但我一直收到错误消息:"The selected text is not inside a method"

有谁知道如何将这个连接和断开代码提取到两个单独的方法中?

最初 class 在将设备连接代码移动到它自己的模型之前看起来像这样:

http://hastebin.com/gepudayele.cs

这是放入 MyoDevice 模型后的代码:

http://hastebin.com/ocogoseziy.cs

连接和断开的代码示例,在connects/looses连接时监听设备:

// create a hub that will manage Myo devices for us
        channel = Channel.Create(ChannelDriver.Create(ChannelBridge.Create()));
        hub = Hub.Create(channel);
        {

            // listen for when the Myo connects
            hub.MyoConnected += (sender, e) =>
            {

                this.Dispatcher.Invoke((Action)(() =>
                {
                    statusTbx.Text = "Myo has connected! " + e.Myo.Handle;
                    e.Myo.Vibrate(VibrationType.Short);

                    // unlock the Myo so that it doesn't keep locking between our poses
                    e.Myo.Unlock(UnlockType.Hold);

                    e.Myo.PoseChanged += Myo_PoseChanged;

                    e.Myo.OrientationDataAcquired += Myo_OrientationDataAcquired;



                }));
            };

            // listen for when the Myo disconnects
            hub.MyoDisconnected += (sender, e) =>
            {
                this.Dispatcher.Invoke((Action)(() =>
                {
                    statusTbx.Text = "Myo has disconnected!";
                    e.Myo.Vibrate(VibrationType.Medium);
                    e.Myo.OrientationDataAcquired -= Myo_OrientationDataAcquired;
                    e.Myo.PoseChanged -= Myo_PoseChanged;


                }));
            };

            // start listening for Myo data
            channel.StartListening();
        }

您正在做的事情没有什么特别之处,自动化工具应该 可以工作。但是工具坏了,所以如果它不起作用,我会手动完成。

将代码重构为方法的步骤非常简单:

  1. 声明一个方法。如果它没有明显的 return 类型,现在就使用 void。还没有参数。
  2. 将要重构的代码从旧代码剪切粘贴到此方法中
  3. 任何立即初始化(但未声明)的变量在方法内声明。
  4. 任何仅使用但显然未通过方法设置up/initialized的变量需要成为参数
  5. 如果您发现需要 return 值,请添加它。
  6. 建造!
  7. 发现您遗漏的内容,根据需要声明或添加参数(遵循上述准则)
  8. 让包含已删除部分的原始代码改为调用此方法。

显然,随着经验的增加,这会变得更容易。我会 强烈 建议尽可能多地练习这样做,并且在您了解自动重构工具的用途之前不要使用它。工具断裂。人们不会(至少不会以同样的方式)。