3

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

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

方法 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);
}
4

1 回答 1

4

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

这里有些例子:

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;

这种方法职责太多,依赖太多。您绝对应该查看依赖倒置原则,也许还有控制反转框架来帮助您进行依赖注入。这将有助于减少类/方法中的耦合。

口头禅是“依赖于抽象”。

同样,单一职责原则也适用于此。

于 2013-02-14T01:24:32.947 回答