Class: Reek::Smells::FeatureEnvy
- Inherits:
-
SmellDetector
- Object
- SmellDetector
- Reek::Smells::FeatureEnvy
- Defined in:
- lib/reek/smells/feature_envy.rb
Overview
Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.
A simple example would be the following method, which “belongs” on the Item class and not on the Cart class:
class Cart
def price
@item.price + @item.tax
end
end
Feature Envy reduces the code’s ability to communicate intent: code that “belongs” on one class but which is located in another can be hard to find, and may upset the “System of Names” in the host class.
Feature Envy also affects the design’s flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application’s domain, and creates a loss of cohesion in the unwilling host class.
Currently FeatureEnvy
reports any method that refers to self less often than it refers to (ie. send messages to) some other object.
Constant Summary
Constants inherited from SmellDetector
SmellDetector::DEFAULT_EXCLUDE_SET, SmellDetector::EXCLUDE_KEY
Class Method Summary collapse
Instance Method Summary collapse
-
#examine_context(context) ⇒ Object
Checks whether the given
context
includes any code fragment that might “belong” on another class. -
#initialize(config = FeatureEnvy.default_config) ⇒ FeatureEnvy
constructor
A new instance of FeatureEnvy.
Methods inherited from SmellDetector
class_name, #configure, #configure_with, contexts, #copy, create, #enabled?, #examine, #exception?, #found, #has_smell?, listen, #listen_to, #num_smells, #report_on, #smell_name, #smelly?, #supersede_with, #value
Constructor Details
#initialize(config = FeatureEnvy.default_config) ⇒ FeatureEnvy
Returns a new instance of FeatureEnvy.
41 42 43 |
# File 'lib/reek/smells/feature_envy.rb', line 41 def initialize(config = FeatureEnvy.default_config) super end |
Class Method Details
.default_config ⇒ Object
37 38 39 |
# File 'lib/reek/smells/feature_envy.rb', line 37 def self.default_config super.adopt(EXCLUDE_KEY => ['initialize']) end |
Instance Method Details
#examine_context(context) ⇒ Object
Checks whether the given context
includes any code fragment that might “belong” on another class. Remembers any smells found.
50 51 52 53 54 |
# File 'lib/reek/smells/feature_envy.rb', line 50 def examine_context(context) context.envious_receivers.each do |ref| found(context, "refers to #{SexpFormatter.format(ref)} more than self") end end |