View Source Credo.Check.Design.DuplicatedCode (Credo v1.7.10)
Basics
This check is disabled by default.
Learn how to enable it via
.credo.exs
.
This check is tagged
:controversial
This means that this check is more opinionated than others and not for everyone's taste.
This check has a base priority of higher
and works with any version of Elixir.
Explanation
Code should not be copy-pasted in a codebase when there is room to abstract the copied functionality in a meaningful way.
That said, you should by no means "ABSTRACT ALL THE THINGS!".
Sometimes it can serve a purpose to have code be explicit in two places, even
if it means the snippets are nearly identical. A good example for this are
Database Adapters in a project like Ecto, where you might have nearly
identical functions for things like order_by
or limit
in both the
Postgres and MySQL adapters.
In this case, introducing an AbstractAdapter
just to avoid code duplication
might cause more trouble down the line than having a bit of duplicated code.
Like all Software Design
issues, this is just advice and might not be
applicable to your project/situation.
Check-Specific Parameters
Use the following parameters to configure this check:
:mass_threshold
The minimum mass which a part of code has to have to qualify for this check.
This parameter defaults to 40
.
:nodes_threshold
The number of nodes that need to be found to raise an issue.
This parameter defaults to 2
.
:excluded_macros
List of macros to be excluded for this check.
This parameter defaults to []
.
General Parameters
Like with all checks, general params can be applied.
Parameters can be configured via the .credo.exs
config file.
Summary
Functions
Calculates hash values for all sub nodes in a given +ast+.
Returns the mass (count of instructions) for an AST.
Takes a map of hashes to nodes and prunes those nodes that are just subnodes of others in the same set.
Returns a hash-value for a given +ast+.
Functions
calculate_hashes(ast, existing_hashes \\ %{}, filename \\ "foo.ex", mass_threshold \\ param_defaults()[:mass_threshold])
View SourceCalculates hash values for all sub nodes in a given +ast+.
Returns a map with the hashes as keys and the nodes as values.
Returns the mass (count of instructions) for an AST.
prune_hashes(given_hashes, mass_threshold \\ param_defaults()[:mass_threshold])
View SourceTakes a map of hashes to nodes and prunes those nodes that are just subnodes of others in the same set.
Returns the resulting map.
Returns a hash-value for a given +ast+.