package jdepend.knowledge.architectpattern.identifyer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import jdepend.framework.exception.JDependException; import jdepend.knowledge.architectpattern.AbstractArchitectPatternIdentifyer; import jdepend.knowledge.architectpattern.domain.IdealComponent; import jdepend.model.Component; import jdepend.model.MetricsMgr; import jdepend.model.result.AnalysisResult; import jdepend.model.util.JDependUnitByMetricsComparator; public final class CommonalityLayerIdentifyer extends AbstractArchitectPatternIdentifyer { @Override public void identify(AnalysisResult result) throws JDependException { List<Component> components = new ArrayList<Component>(); for(Component component : result.getComponents()){ components.add(new IdealComponent(component)); } Collections.sort(components, new JDependUnitByMetricsComparator(MetricsMgr.Ca)); // 计算传入差值 List<Integer> diffs = new ArrayList<Integer>(); for (int index = 0; index < components.size() - 1; index++) { diffs.add(components.get(index + 1).getAfferents().size() - components.get(index).getAfferents().size()); } // 计算传入差值均值 float averageDiff; Integer countDiff = 0; for (Integer diff : diffs) { countDiff += diff; } averageDiff = countDiff * 1F / diffs.size(); // 计算大于均值的索引 int index = 0; List<Integer> indexes = new ArrayList<Integer>(); for (Integer diff : diffs) { index++; if (diff > averageDiff) { indexes.add(index); } } indexes.add(components.size()); // 对组件进行分组 int start = 0; int layerIndex = 0; Map<String, Collection<Component>> layers = new LinkedHashMap<String, Collection<Component>>(); List<Component> layerComponents; for (Integer i : indexes) { layerComponents = new ArrayList<Component>(); for (int j = start; j < i; j++) { layerComponents.add(components.get(j)); } layers.put(String.valueOf(layerIndex), layerComponents); layerIndex++; start += layerComponents.size(); } // 设置结果 this.getWorker().setLayers(layers); } }