آشنایی با Refactoring - قسمت 9
نویسنده: وحید نصیری
تاریخ: ۱۳۹۰/۰۷/۲۵ ۲۲:۴۰:۰۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
if
if
if
if
do something
endif
endif
endif
endif
namespace Refactoring.Day9.RemoveArrowhead.Before
{
public class Role
{
public string RoleName { set; get; }
public string UserName { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
namespace Refactoring.Day9.RemoveArrowhead.Before
{
public class RoleRepository
{
private IList<Role> _rolesList = new List<Role>();
public IEnumerable<Role> Roles { get { return _rolesList; } }
public void AddRole(string username, string roleName)
{
if (!string.IsNullOrWhiteSpace(roleName))
{
if (!string.IsNullOrWhiteSpace(username))
{
if (!IsInRole(username, roleName))
{
_rolesList.Add(new Role
{
UserName=username,
RoleName=roleName
});
}
else
{
throw new InvalidOperationException("User is already in this role.");
}
}
else
{
throw new ArgumentNullException("username");
}
}
else
{
throw new ArgumentNullException("roleName");
}
}
public bool IsInRole(string username, string roleName)
{
return _rolesList.Any(x => x.RoleName == roleName && x.UserName == username);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
namespace Refactoring.Day9.RemoveArrowhead.After
{
public class RoleRepository
{
private IList<Role> _rolesList = new List<Role>();
public IEnumerable<Role> Roles { get { return _rolesList; } }
public void AddRole(string username, string roleName)
{
if (string.IsNullOrWhiteSpace(roleName))
throw new ArgumentNullException("roleName");
if (string.IsNullOrWhiteSpace(username))
throw new ArgumentNullException("username");
if (IsInRole(username, roleName))
throw new InvalidOperationException("User is already in this role.");
_rolesList.Add(new Role
{
UserName = username,
RoleName = roleName
});
}
public bool IsInRole(string username, string roleName)
{
return _rolesList.Any(x => x.RoleName == roleName && x.UserName == username);
}
}
}
یک نکتهی تکمیلی: غنی سازی کامپایلر سیشارپ جهت نمایش اخطارهایی در مورد متدهایی بیش از اندازه پیچیده
پس از فعالسازی یکسری از آنالایزرها، اکنون میتوان بررسی cyclomatic complexity را هم به آنها سپرد. برای اینکار باید مراحل زیر طی شوند:
ابتدا یک سطر زیر را به فایل editorconfig. اضافه کنید:
dotnet_diagnostic.CA1502.severity = warning
سپس فایل جدید CodeMetricsConfig.txt را به ریشهی پروژه اضافه کرده و سطر زیر را به آن اضافه کنید:
CA1502: 20
مقدار پیشفرض آستانهی گزارش خطا در اینجا، 25 است که به روش فوق، قابل بازنویسی است.
البته نیاز است این فایل را به صورت یک فایل اضافی، به فایل csproj. نیز معرفی کرد:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt"/> </ItemGroup>
همچنین میتوان تنظیمات آستانهی ریزتری را هم به متدها، نوعها و غیره اعمال کرد:
CA1505(Method): 5 CA1505(Type): 15
مقادیر مجاز در اینجا، شامل SymbolKind, Assembly, Namespace, Type, Method, Field, Event,Property هستند.
در این فایل میتوان آستانهی گزارش خطای موارد زیر را هم بازنویسی کرد:
CA1501: Avoid excessive inheritance CA1502: Avoid excessive complexity (this one) CA1505: Avoid unmaintainable code CA1506: Avoid excessive class coupling