我收到以下代码分析警告消息,但不知道是否可以解决该问题。请指教。


  CA1506避免过度的类耦合
  “ RetailerController.RetailerFormSummary(string)”与来自13个不同名称空间的33种不同类型结合在一起。重写或重构该方法以减少其类耦合,或考虑将方法移至与其紧密耦合的其他类型之一。大于40的等级耦合表示可维护性差,介于40和30之间的等级耦合表示中等维护性,小于30的等级耦合表示良好维护性。 564个OnePlaceWebApp.Web RetailerController.cs


方法RetailerFormSummary(string)看起来像:

 public ViewResult RetailerFormSummary(string retailerId)
 {
            AlertService alertService = new AlertService();
            PageInfo winnersPageInfo = new PageInfo();
            RetailerFormModelSummary model = new RetailerFormModelSummary();

            winnersPageInfo.ItemsPerPage = _configurationUtility.SummaryWinnersCount;
            winnersPageInfo.PageIndex = 0;

            model.CurrencyFormat = _configurationUtility.CurrencyFormat;
            model.DateFormat = _configurationUtility.DateFormat;
            model.DatePickerFormat = _configurationUtility.DatePickerFormat;
            model.Reps = _userService.GetReps(_userService.GetCurrentWebAppUserId());
            model.UsesDistricts = _configurationService.GetUsesDistricts();
            RetailerDto retailer = _retailerService.SelectRetailer(retailerId);

            if (retailer != null)
            {
                RetailerJurisdictionDto retailerJurisdiction = _retailerSummaryService.SelectRetailerJurisdiction(retailer.Id);
                JurisdictionDto territory = null;
                JurisdictionDto district = null;
                JurisdictionDto region = null;
                DateTime? lastVisit = _retailerSummaryService.SelectLastVisitUtcDate(retailer.Id);

                if (retailerJurisdiction != null)
                {
                    territory = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.Territory);
                    district = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.District);
                    region = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.Region);
                }
                model.Address1 = retailer.Street1;
                if (retailer.Street2 != null)
                {
                    model.Address2 = retailer.Street2;
                }
                if (retailer.CorporateAccount != null)
                {
                    model.CorporateAccount = FormatService.GetTwoPartName(retailer.CorporateAccount.Number, retailer.CorporateAccount.Name, " - ");
                }
                model.CorporateAccountName = _termsService.SelectSingularTermValue(TermTypes.CorporateAccount);
                model.City = retailer.City;
                if (district != null)
                {
                    model.District = FormatService.GetTwoPartName(district.Number, district.Name, " - ");
                }
                if (lastVisit.HasValue)
                {
                    model.LastVisit = lastVisit.Value.DayOfWeek.ToString() + " " + lastVisit.Value.ToLocalTime().ToString(model.DateFormat, CultureInfo.CurrentCulture);
                }
                model.Note = _retailerSummaryService.SelectRetailerComment(retailer.Id);
                model.Phone = FormatService.FormatPhoneNumber(retailer.Phone);
                if (region != null)
                {
                    model.Region = FormatService.GetTwoPartName(region.Number, region.Name, " - ");
                }
                model.RegionTerm = _termsService.SelectSingularTermValue(TermTypes.Region);
                model.RetailerId = retailer.Id.ToString(CultureInfo.CurrentCulture);
                model.RetailerName = retailer.BusinessName;
                ViewBag.Title = retailer.BusinessName;
                model.RetailerNumber = retailer.DisplayNumber;
                model.RetailerAlerts = alertService.GetRetailerAlertsStringArray(retailer.RetailerAlerts);
                model.Route = _routeManagerService.GetRouteStringForRetailer(retailerId);
                model.Tasks = _retailerSummaryService.SelectRetailerTasks(retailer.Id);
                if (territory != null)
                {
                    model.Territory = FormatService.GetTwoPartName(territory.Number, territory.Name, " - ");
                }
                model.TerritoryTerm = _termsService.SelectSingularTermValue(TermTypes.Territory);
                model.WeeklySales = _retailerSummaryService.SelectWeeklySales(retailerId);
                model.Winners = _retailerWinnersService.SelectWinners(retailerId, WinnersSortTypes.Date, winnersPageInfo);
                model.ZipCode = retailer.ZipCode;
            }

            return View("RetailerFormSummary/RetailerFormSummary", model);
}

最佳答案

此警告告诉您在方法中实例化依赖的具体对象可能会导致可维护性问题。

这里有些例子:

AlertService alertService = new AlertService();
PageInfo winnersPageInfo = new PageInfo();
RetailerFormModelSummary model = new RetailerFormModelSummary();
RetailerJurisdictionDto retailerJurisdiction = _retailerSummaryService.SelectRetailerJurisdiction(retailer.Id);
JurisdictionDto territory = null;
JurisdictionDto district = null;
JurisdictionDto region = null;


此方法职责过多,拥有太多依赖项。您绝对应该查找Dependency Inversion Principle甚至是Inversion of Control Framework来帮助您进行依赖注入。这将有助于减少类/方法之间的耦合。

口头禅是“依赖抽象”。

同样,Single Reponsibility Principle在这里也适用。

关于c# - 方法中的类耦合警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14866275/

10-10 13:58