| Conditions | 27 | 
| Total Lines | 111 | 
| Code Lines | 68 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like action.guessDeps often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | package action | ||
| 76 | func guessDeps(base string, skipImport bool) *cfg.Config { | ||
| 77 | buildContext, err := util.GetBuildContext() | ||
| 78 | 	if err != nil { | ||
| 79 | 		msg.Die("Failed to build an import context: %s", err) | ||
| 80 | } | ||
| 81 | name := buildContext.PackageName(base) | ||
| 82 | |||
| 83 | 	msg.Info("Generating a YAML configuration file and guessing the dependencies") | ||
| 84 | |||
| 85 | config := new(cfg.Config) | ||
| 86 | |||
| 87 | // Get the name of the top level package | ||
| 88 | config.Name = name | ||
| 89 | |||
| 90 | // Import by looking at other package managers and looking over the | ||
| 91 | // entire directory structure. | ||
| 92 | |||
| 93 | // Attempt to import from other package managers. | ||
| 94 | 	if !skipImport { | ||
| 95 | guessImportDeps(base, config) | ||
| 96 | } | ||
| 97 | |||
| 98 | importLen := len(config.Imports) | ||
| 99 | 	if importLen == 0 { | ||
| 100 | 		msg.Info("Scanning code to look for dependencies") | ||
| 101 | 	} else { | ||
| 102 | 		msg.Info("Scanning code to look for dependencies not found in import") | ||
| 103 | } | ||
| 104 | |||
| 105 | // Resolve dependencies by looking at the tree. | ||
| 106 | r, err := dependency.NewResolver(base) | ||
| 107 | 	if err != nil { | ||
| 108 | 		msg.Die("Error creating a dependency resolver: %s", err) | ||
| 109 | } | ||
| 110 | |||
| 111 | // When creating resolve the test dependencies as well as the application ones. | ||
| 112 | r.ResolveTest = true | ||
| 113 | |||
| 114 | 	h := &dependency.DefaultMissingPackageHandler{Missing: []string{}, Gopath: []string{}} | ||
| 115 | r.Handler = h | ||
| 116 | |||
| 117 | sortable, testSortable, err := r.ResolveLocal(false) | ||
| 118 | 	if err != nil { | ||
| 119 | 		msg.Die("Error resolving local dependencies: %s", err) | ||
| 120 | } | ||
| 121 | |||
| 122 | sort.Strings(sortable) | ||
| 123 | sort.Strings(testSortable) | ||
| 124 | |||
| 125 | vpath := r.VendorDir | ||
| 126 | 	if !strings.HasSuffix(vpath, "/") { | ||
| 127 | vpath = vpath + string(os.PathSeparator) | ||
| 128 | } | ||
| 129 | |||
| 130 | 	for _, pa := range sortable { | ||
| 131 | n := strings.TrimPrefix(pa, vpath) | ||
| 132 | root, subpkg := util.NormalizeName(n) | ||
| 133 | |||
| 134 | 		if !config.Imports.Has(root) && root != config.Name { | ||
| 135 | 			msg.Info("--> Found reference to %s\n", n) | ||
| 136 | 			d := &cfg.Dependency{ | ||
| 137 | Name: root, | ||
| 138 | } | ||
| 139 | 			if len(subpkg) > 0 { | ||
| 140 | 				d.Subpackages = []string{subpkg} | ||
| 141 | } | ||
| 142 | config.Imports = append(config.Imports, d) | ||
| 143 | 		} else if config.Imports.Has(root) { | ||
| 144 | 			if len(subpkg) > 0 { | ||
| 145 | subpkg = strings.TrimPrefix(subpkg, "/") | ||
| 146 | d := config.Imports.Get(root) | ||
| 147 | 				if !d.HasSubpackage(subpkg) { | ||
| 148 | 					msg.Info("--> Adding sub-package %s to %s\n", subpkg, root) | ||
| 149 | d.Subpackages = append(d.Subpackages, subpkg) | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | } | ||
| 154 | |||
| 155 | 	for _, pa := range testSortable { | ||
| 156 | n := strings.TrimPrefix(pa, vpath) | ||
| 157 | root, subpkg := util.NormalizeName(n) | ||
| 158 | |||
| 159 | 		if config.Imports.Has(root) && root != config.Name { | ||
| 160 | 			msg.Debug("--> Found test reference to %s already listed as an import", n) | ||
| 161 | 		} else if !config.DevImports.Has(root) && root != config.Name { | ||
| 162 | 			msg.Info("--> Found test reference to %s", n) | ||
| 163 | 			d := &cfg.Dependency{ | ||
| 164 | Name: root, | ||
| 165 | } | ||
| 166 | 			if len(subpkg) > 0 { | ||
| 167 | 				d.Subpackages = []string{subpkg} | ||
| 168 | } | ||
| 169 | config.DevImports = append(config.DevImports, d) | ||
| 170 | 		} else if config.DevImports.Has(root) { | ||
| 171 | 			if len(subpkg) > 0 { | ||
| 172 | subpkg = strings.TrimPrefix(subpkg, "/") | ||
| 173 | d := config.DevImports.Get(root) | ||
| 174 | 				if !d.HasSubpackage(subpkg) { | ||
| 175 | 					msg.Info("--> Adding test sub-package %s to %s\n", subpkg, root) | ||
| 176 | d.Subpackages = append(d.Subpackages, subpkg) | ||
| 177 | } | ||
| 178 | } | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 182 | 	if len(config.Imports) == importLen && importLen != 0 { | ||
| 183 | 		msg.Info("--> Code scanning found no additional imports") | ||
| 184 | } | ||
| 185 | |||
| 186 | return config | ||
| 187 | } | ||
| 246 |