Какие проблемы легко обнаружить в графе зависимостей?

StackOverflow https://stackoverflow.com/questions/418210

  •  03-07-2019
  •  | 
  •  

Вопрос

Что я должен искать при создании графа зависимостей?

Или, другими словами, каковы характеристики хорошего графа и плохого?

Редактировать: контекст здесь - мой первый взгляд на мои сборки в NDepend.

Это было полезно?

Решение

Самая большая проблема, которую вы можете заметить, это определенно циклы зависимостей. Инструмент NDepend предлагает интерактивную матрицу зависимостей и График зависимостей , который поможет определить циклы зависимости . Отказ от ответственности: я один из разработчиков инструмента

введите описание изображения здесь

Обратите внимание, что матрица зависимостей гораздо более адаптирована, чем график для определения циклов. Потому что цикл избегает, чтобы матрица была треугольной.

Другие проблемы связаны со структурой вашего приложения. Например, нормально ли, что пользовательский интерфейс использует непосредственно БД? или гораздо хуже, БД зависит от пользовательского интерфейса?

Вы можете написать правила кода для запросов LINQ (CQLinq) , чтобы проверить наличие запрещенных зависимостей. Следующее правило кода проверяет, что типы пользовательского интерфейса не должны напрямую использовать типы БД:

// <Name>UI layer shouldn't use directly DB types</Name>
warnif count > 0

// UI layer is made of types in namespaces using a UI framework
let uiTypes = Application.Namespaces.UsingAny(Assemblies.WithNameIn("PresentationFramework", "System.Windows", "System.Windows.Forms", "System.Web")).ChildTypes()

// You can easily customize this line to define what are DB types.
let dbTypes = ThirdParty.Assemblies.WithNameIn("System.Data", "EntityFramework", "NHibernate").ChildTypes()
              // Ideally even DataSet and associated, usage should be forbidden from UI layer: 
              // http://stackoverflow.com/questions/1708690/is-list-better-than-dataset-for-ui-layer-in-asp-net
              .Except(ThirdParty.Types.WithNameIn("DataSet", "DataTable", "DataRow"))

from uiType in uiTypes.UsingAny(dbTypes)
let dbTypesUsed = dbTypes.Intersect(uiType.TypesUsed)
select new { uiType, dbTypesUsed }

Другие советы

график зависимости чего? классы? хранимые процедуры?

циклы плохие ...

Если изменение одной зависимости означает, что вам нужно изменить множество других, это плохо.
Но да, некоторый контекст может помочь.

Я не знаю, что показывает NDepend, но артефакты, которые имеют тенденцию попадать во многие разделы (особенно несвязанные разделы) кода, будут иметь тенденцию быть плохими (IMHO). Я думал об этом как "Рак код".

Докладчик на конференции NFJS показал нам несколько графиков зависимостей ... Один запах, на который он указал, - это поиск вещей, связанных с различными функциональными частями вашей кодовой базы. Это может нарушить инкапсуляцию.

Также я хотел бы взглянуть на общую сложность каждого раздела. Подразумевается, что строки со строками являются подозрительными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top