这是我的初始方法
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+,否则我无法提交。
我还可以做些什么来改进代码指标。
此外,我正在考虑如此小的事情,创建单独的方法/类不是开销
答案 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容器注入这些东西。