Замена кодирования типа классом.
В классе есть поле, содержащее кодирование типа. Значения этого типа не используются в условных операторах и не влияют на поведение программы.
Создайте новый класс и применяйте его объекты вместо значений закодированного типа.
##Example


##Why Refactor
Одной из самых частых причин появления кодирования типа является работа с базой данных, в полях которой какая-то сложная концепция кодируется каким-то числом или строкой.
Например, у вас есть класс Пользователь с полем роль_пользователя, в которой содержится информация о доступе каждого пользователя, будь то администратор, редактор или обычный пользователь. Причём эта информация кодируется в поле как символы A, E, и U соответственно.
Недостатками этого подхода является то, что в сеттерах поля зачастую нет никаких проверок на то, какое значение туда приходит, что может привести к большим проблемам, если кто-то отправит в эти поля какие-то другие значения.
Проблема также усугубляется тем, что для таких полей невозможно сделать проверку типов. В них можно отправить любое число или строку, что, безусловно, останется без внимания проверки типов вашей IDE и даже даст возможность программе запуститься.
##Benefits
-
Мы хотим превратить наборы значений примитивных типов, коими являются закодированные типы, в стройные классы, которые бы обладали всеми мощными свойствами ООП.
-
Заменив кодирование типа классами, мы обеспечим возможность контроля и проверки типов значений (type hinting), передаваемых в методы и поля на уровне языка программирования.
Например, если раньше, при передаче значения в метод компилятор не видел разницы между вашей числовой константой и каким-то произвольным числом, то теперь при передаче данных, отличающихся чем-то от указанного класса типа, вы получите сообщения об ошибке ещё внутри вашей IDE.
-
Таким образом, мы сделаем возможным перенос кода в сами классы типа. Если вам нужно было проводить какие-то сложные манипуляции со значениями типа по всей программе, теперь этот код сможет «жить» внутри одного или нескольких классов типа.
##How to Refactor
-
Создайте новый класс и дайте ему понятное название, соответствующее предназначению закодированного типа. Мы будем называть его класс типа.
-
В класс типа скопируйте поле, содержащее кодирование типа, и сделайте его приватным. Кроме того, создайте для этого поля геттер. Устанавливаться значение в это поле будет только из конструктора.
-
Для каждого значения закодированного типа, создайте статический метод в классе типа. Он будет создавать новый объект класса типа, соответствующий этому значению закодированного типа.
-
В исходном классе, замените тип закодированного поля на класс типа. Создавайте новый объект этого типа в конструкторе, а также в сеттере поля. Измените геттер поля так, чтобы он вызывал геттер класса типа.
-
Замените любые упоминания значений закодированного типа вызовами соответствующих статических методов класса типа.
-
Удалите константы закодированного типа из исходного класса.