Feature Envy: I Wanna Hold Your Hand
Feature Envy Example
In the
Customer
class below, the member function getMobilePhoneNumber()
provides a North American-formatted mobile Phone
number:
class Phone:
def __init__(self, unformattedNumber):
self._unformattedNumber = unformattedNumber def getAreaCode(self):
return self._unformattedNumber[0:3] def getPrefix(self):
return self._unformattedNumber[3:6] def getNumber(self):
return self._unformattedNumber[6:10]
class Customer:
def __init__(self, mobilePhoneNumber):
self._mobilePhone = Phone(mobilePhoneNumber) def getMobilePhoneNumber(self):
return "(" +
self._mobilePhone.getAreaCode() + ") " +
self._mobilePhone.getPrefix() + "-" +
self._mobilePhone.getNumber()
See how
Customer
reaches into Phone
’s data to format the number?
Feature Envy often shows up as a misplaced responsibility.
class Phone:
def __init__(self, unformattedNumber):
self._unformattedNumber = unformattedNumber def _getAreaCode(self):
return self._unformattedNumber[0:3] def _getPrefix(self):
return self._unformattedNumber[3:6] def _getNumber(self):
return self._unformattedNumber[6:10] def toFormattedString(self):
return "(" + self.getAreaCode() + ") " + self.getPrefix() + "-" + self.getNumber()
class Customer:
def __init__(self, mobilePhoneNumber):
self._mobilePhone = Phone(mobilePhoneNumber) def getMobilePhoneNumber(self):
return self._mobilePhone.toFormattedString()
Now
Customer
relies on Phone
to do the formatting.
(Reading...)
Formatting Hints:
To format... | use this markup: |
---|---|
source code | {source:lang=java|lineNumbers=false}...{source} (Supported languages: java, cpp, csharp, c, python.) |
bold text | __some text__ |
italicized text | ~~some text~~ |
underlined text | @@some text@@ |
a method or class name | ``myMethod(...)`` |