Credo v1.4.0 Credo.Check.Design.DuplicatedCode View Source

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.

Configuration 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.

    Defaults to 40

  • nodes_threshold: The number of nodes that need to be found to raise an issue.

    Defaults to 2

  • excluded_macros: List of macros to be excluded for this check.

    Defaults to []

Parameters can be configured via the .credo.exs config file.

Link to this section Summary

Functions

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+.

Link to this section Functions

Link to this function

add_masses(found_hashes)

View Source
Link to this function

calculate_hashes(ast, existing_hashes \\ %{}, filename \\ "foo.ex", mass_threshold \\ param_defaults()[:mass_threshold])

View Source

Calculates hash values for all sub nodes in a given +ast+.

Returns a map with the hashes as keys and the nodes as values.

Link to this function

create_issue?(arg1, excluded_macros)

View Source

Returns the mass (count of instructions) for an AST.

Link to this function

prune_hashes(given_hashes, mass_threshold \\ param_defaults()[:mass_threshold])

View Source

Takes 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+.