如何提取方法的连接代码? 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();
}
您正在做的事情没有什么特别之处,自动化工具应该 可以工作。但是工具坏了,所以如果它不起作用,我会手动完成。
将代码重构为方法的步骤非常简单:
- 声明一个方法。如果它没有明显的 return 类型,现在就使用
void
。还没有参数。
- 将要重构的代码从旧代码剪切粘贴到此方法中
- 任何立即初始化(但未声明)的变量在方法内声明。
- 任何仅使用但显然未通过方法设置up/initialized的变量需要成为参数
- 如果您发现需要 return 值,请添加它。
- 建造!
- 发现您遗漏的内容,根据需要声明或添加参数(遵循上述准则)
- 让包含已删除部分的原始代码改为调用此方法。
显然,随着经验的增加,这会变得更容易。我会 强烈 建议尽可能多地练习这样做,并且在您了解自动重构工具的用途之前不要使用它。工具断裂。人们不会(至少不会以同样的方式)。
我正在将我的应用程序移植到 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();
}
您正在做的事情没有什么特别之处,自动化工具应该 可以工作。但是工具坏了,所以如果它不起作用,我会手动完成。
将代码重构为方法的步骤非常简单:
- 声明一个方法。如果它没有明显的 return 类型,现在就使用
void
。还没有参数。 - 将要重构的代码从旧代码剪切粘贴到此方法中
- 任何立即初始化(但未声明)的变量在方法内声明。
- 任何仅使用但显然未通过方法设置up/initialized的变量需要成为参数
- 如果您发现需要 return 值,请添加它。
- 建造!
- 发现您遗漏的内容,根据需要声明或添加参数(遵循上述准则)
- 让包含已删除部分的原始代码改为调用此方法。
显然,随着经验的增加,这会变得更容易。我会 强烈 建议尽可能多地练习这样做,并且在您了解自动重构工具的用途之前不要使用它。工具断裂。人们不会(至少不会以同样的方式)。