如何更新此类/方法以改进代码度量标准

时间:2016-12-20 07:50:22

标签: c# asp.net performance visual-studio code-metrics

这是我的初始方法

def my_gen(arg):
    yield arg * 10
    for i in xrange(5):
            if i / 2 == 0:
                 yield i

for x in my_gen(3):
     print(x) 

Visual Studio显示以下代码度量标准: -

  

成员:GetAllDocuments(string,int):string
  可维护性指数:67
  Cyclomatic Complexity:2
  类耦合:7
  代码行:7

所以为了改进它,我修改了我的方法如下: -

not data

但它仍然将代码指标显示为

  

成员:GetAllDocuments(string,int):string
  可维护性指数:72
  Cyclomatic Complexity:1
  类耦合:5
  代码行:5

除非可维护性指数为90+,否则我无法提交。

我还可以做些什么来改进代码指标。

此外,我正在考虑如此小的事情,创建单独的方法/类不是开销

3 个答案:

答案 0 :(得分:2)

您应该经常在工厂界面中封装任何对象的创建,这个实例将您传递给想要使用它的类的构造函数。

因此,你的类将有一个构造函数和字段,如下所示:

public MyClass(IReportHandlerFactory reportHandlerFactory)
{
     if (reportHandlerFactory == null)
         throw new ArgumentNullException(nameof(reportHandlerFactory));

     _reportHandlerFactory = reportHandlerFactory;
}

private readonly IReportHandlerFactory _reportHandlerFactory;

这称为依赖注入,特别是构造函数注入。

为了有效地执行此操作,您可能还需要为ReportHandler类创建一个界面。然后工厂界面将是这样的:

public interface IReportHandlerFactory
{
    IReportHandler Create();
}

您的报告处理程序界面如下:

public interface IReportHandler
{
    IEnumerable<Document> FetchDocumentsList(Guid clientID, int pager);
}

......等等。希望你明白了。

您还应该拆分您的方法,可能是这样的:

public String GetAllDocuments(string url,int pager =0)
{
    if (SessionInfo.IsAdmin)
    {
        return documentsData(_reportHandlerFactory, SessionInfo.ClientID, page);
    }
    else
    {
        return "Sorry!! You are not authorized to perform this action";
    }
}

private static String documentsData(
    IReportHandlerFactory reportHandlerFactory, 
    Guid clientID,
    int pager)
{
    IReportHandler dal = reportHandlerFactory.Create();

    var documents = dal.FetchDocumentsList(clientID, pager);
    string documentsDataJSON = JsonConvert.SerializeObject(documents);

    return documentsDataJSON;
}

注意:说实话,这个问题真的更适合https://codereview.stackexchange.com/

我强烈推荐以下有关此主题的书籍:

  

清洁代码:敏捷软件工艺手册(Robert C. Martin)

  

.NET中的依赖注入(Mark Seemann)

或Mark Seemann的博客。

答案 1 :(得分:2)

将可维护性指数作为工具,而不是目标。

如果您没有意识到为什么您的代码首先无法维护,那么提高可维护性指数毫无意义。您只需继续移动代码即可满足索引,而无需了解您正在做什么。

你的问题不应该是

  

如何更新此类/方法以改进代码度量标准?

  

如何提高这门课程的可维护性?

我现在看到很多问题:

  • 依赖性是隐含的,即您直接在方法内部new提升事物。这使得代码不够灵活,可组合和可读。

    将ReportHandler依赖项传递给GetAllDocuments()或类构造函数会更好。

  • 测试不佳。如果ReportHandler是一个接口(或一个抽象类),您可以在GetAllDocuments()的测试中用假报告处理程序替换它,以提高性能和测试。请注意,不必使用工厂来执行此操作,具有一个实际实现和测试实现的简单接口就足够了。

  • 未使用参数url

  • SessionInfo.IsAdmin是一种神奇的速记,容易出现与上述相同的问题。如果您在控制器中,这没什么大不了的,但如果您应该在业务层,这将妨碍可测试性和可维护性。

答案 2 :(得分:0)

如果您对仅使维护性指数更感兴趣,请阅读如何计算:http://www.projectcodemeter.com/cost_estimation/help/GL_maintainability.htm

您可以看到它主要取决于代码行数。

如果想要好的设计,请停止使用具体实现,请使用SOLID原则之一 - 依赖性反转。例如,而不是使用:

ReportHandler dal = new ReportHandler();

你应该使用类似的东西:

IReportHandler dal = reportHandlerFactory.GetReportHandler();
// where reportHandlerFactory is IReportHandlerFactory which is also 
// make dependency on interface but not on concrete class 

甚至更好的是使用DI容器注入这些东西。