在Visual Studio中,有或没有扩展名,有没有办法根据用法的使用顺序(它们在调用堆栈中的位置)自动对类中的私有方法进行排序?
例如,请考虑以下类:
public class MyClass
{
public void MyMethod()
{
TestC();
}
private void TestA()
{
TestB();
}
private void TestB()
{
Console.WriteLine("Hello");
}
private void TestC()
{
TestA();
}
}
此课程中的公共方法为MyMethod
,调用TestC
,调用调用TestA
的{{1}}。我想(自动)按此顺序对这些方法进行排序,以便类看起来像这样:
TestB
我需要能够选择一个类,请求这样的方法排序,并让方法自动排序。即,我不想手动对这些方法进行排序。
我知道有一些细微差别。例如,可能存在从两个方法调用的私有方法,这两个方法在调用堆栈中处于两个不同的级别。我想在这种情况下考虑与公共方法的最小(调用堆栈)距离是有意义的。
更新
这种以这种方式对方法进行分类的想法来自Robert C. Martin的清洁代码书。在第3章中,定义了Stepdown规则,该规则讨论了在低级函数之前出现更高级别的函数。
在google上快速搜索stepdown规则,我在http://plugins.netbeans.org/plugin/58863/stepdownruleplugin找到了一个netbeans插件
我猜它会像我需要的那样做,但对于netbeans。
答案 0 :(得分:11)
ReSharper插件" Greenkeeper"做的工作:
https://bitbucket.org/denniskniep/greenkeeper
该插件可以对" newspapermode"中的方法进行排序:首先是重要代码,在底部是详细信息。报纸模式与" Stepdown规则"。
具有相同的行为https://bitbucket.org/denniskniep/greenkeeper/wiki/SortingDeclarations
答案 1 :(得分:9)
我不知道是否可以在Visual Studio中本地执行此操作。但是,我认为最好的方法是使用ReSharper(Visual Studio扩展)来执行此操作。
它提供了至少两个可以想到的选项:
1)将File and Type Layout首选项与模式一起使用,
2)使用“文件结构”窗口(如果要重新排序的类没有太多方法,这可能是最快的方法)。你可以check it out here.
希望有所帮助。
答案 2 :(得分:9)
以下是没有人参考的其他产品可以通过友好的请求添加功能:
自己写这个并不难。 VS2015设置中提供了新的Visual Studio VSIX Project 模板,如果您无法在(文件>新建>项目... Visual C#和可扩展性)下找到它们,只需修改安装(cmd> ; appwiz.cpl> VS2015更改/修改)。
好消息是CodeMaid项目是开源的,包含大部分代码和代码。逻辑,您将需要重新排序代码块。
你需要的另一件事是调用堆栈,我们的一位有帮助的Stackoverflowr在这里提供了代码:How to get stack trace of a running process from within a Visual Studio add-in?
鉴于这是一个赏金,你可能期待一个完整的解决方案,抱歉,我没有时间为你编写代码,但如果你遇到任何问题我很乐意帮助你。请在评论中告诉我。
为了快速启动并运行,我个人只需复制此Visual Studio扩展中的代码,并将其替换为通过调用堆栈重新排序:Debug Single Thread。
答案 3 :(得分:2)
如果您想手动触发该逻辑并使用vs 2015,则可以创建一个将使用Roslyn的Visual Studio CodeFix。 见:Build CodeFix ex
您应该采取的步骤是:
答案 4 :(得分:1)
简短的回答是否定的 看原因很简单,因为大多数开发人员都试图编写易于阅读的代码。如果我需要对TestB进行更新并查看代码,我希望在TestA之后和TestC之前定义TestB。然后,您还要考虑类的已定义字段以及使用get / set方法设置和获取已定义字段的值。
下面的代码显示了2个类。如果另一位开发人员需要更新他们不会浪费时间搜索代码的代码,那么第一类是我个人用于可读性的布局。第二类遵循您希望重新安排它们的方式。
public class MyClass
{
private string _HelloWorld;
public string HelloWorld
{
get {return _HelloWorld;}
set {_HelloWorld = value;}
}
public void MyMethod
{
TestC();
}
public void TestA()
{
TestB();
}
public void TestB()
{
Console.WriteLine(HelloWorld);
}
public void TestC()
{
TestA();
}
}
public class MyClass2
{
private string _HelloWorld;
public void MyMethod
{
TestC();
}
public void TestC()
{
TestA();
}
public void TestA()
{
TestB();
}
public void TestB()
{
Console.WriteLine(HelloWorld);
}
public string HelloWorld
{
get {return _HelloWorld;}
set {_HelloWorld = value;}
}
}