«Внешний» в данном контексте означает «наблюдаемый пользователями». Пользователи могут быть людьми в случае приложения или других программ в случае общедоступного API.
Таким образом, если вы переместите метод M из класса A в класс B, и оба класса находятся глубоко внутри приложения, и ни один пользователь не сможет наблюдать каких-либо изменений в поведении приложения из-за этого изменения, то вы можете по праву назвать его рефакторингом.
Если OTOH, какая-то другая подсистема / компонент более высокого уровня изменяет свое поведение или выходит из строя из-за изменения, это действительно (обычно) можно наблюдать пользователям (или, по крайней мере, системным администраторам, проверяющим журналы). Или, если ваши классы были частью общедоступного API, может существовать сторонний код, который зависит от того, является ли M частью класса A, а не B. Так что ни один из этих случаев не является рефакторингом в строгом смысле.
существует тенденция называть любую переработку кода рефакторингом, что, я думаю, неверно.
Действительно, это печальное, но ожидаемое следствие того, что рефакторинг становится модным. Разработчики целую вечность занимались доработкой кода, и, конечно, легче выучить новое модное слово, чем анализировать и изменять укоренившиеся привычки.
Так что же является правильным словом для переделок, которые изменяют внешнее поведение?
Я бы назвал это редизайном .
Обновить
Много интересных ответов об интерфейсе, но разве метод рефакторинга не изменит интерфейс?
Которого? Конкретные классы, да. Но являются ли эти классы непосредственно видимыми для внешнего мира? Если нет - потому что они находятся внутри вашей программы, а не являются частью внешнего интерфейса (API / GUI) программы - никакие сделанные изменения не наблюдаются внешними сторонами (если, конечно, изменение не нарушает что-то, конечно).
Я чувствую, что за этим стоит более глубокий вопрос: существует ли конкретный класс как самостоятельная сущность? В большинстве случаев ответ отрицательный : класс существует только как часть более крупного компонента, экосистемы классов и объектов, без которой он не может быть создан и / или непригоден для использования. Эта экосистема включает не только свои (прямые / косвенные) зависимости, но и другие классы / объекты, которые зависят от нее. Это потому, что без этих классов более высокого уровня ответственность, связанная с нашим классом, может быть бессмысленной / бесполезной для пользователей системы.
Например, в нашем проекте, который занимается прокатом автомобилей, есть Charge
учебный класс. Этот класс сам по себе бесполезен для пользователей системы, потому что агенты и клиенты пунктов проката не могут ничего сделать с индивидуальной платой: они имеют дело с договорами аренды в целом (которые включают в себя кучу разных видов сборов) , Пользователей больше всего интересует общая сумма этих сборов, которую они должны заплатить в конце концов; агент интересуется различными вариантами контракта, длительностью аренды, выбранной группой транспортных средств, страховым пакетом, дополнительными предметами и т. д., которые (с помощью сложных бизнес-правил) определяют, какие сборы присутствуют и как рассчитывается окончательный платеж. из них. А представители стран / бизнес-аналитики заботятся о конкретных бизнес-правилах, их синергии и влиянии (на доходы компании и т. Д.).
Недавно я провел рефакторинг этого класса, переименовав большинство его полей и методов (чтобы следовать стандартному соглашению об именах Java, которое полностью игнорировалось нашими предшественниками). Я также планирую дальнейший рефакторинг для замены String
и char
полей на более подходящие enum
и boolean
типы. Все это, безусловно, изменит интерфейс класса, но (если я правильно сделаю свою работу), ничего из этого не будет видно пользователям нашего приложения. Никто из них не заботится о том, как представлены отдельные обвинения, хотя они наверняка знают понятие обвинения, Я мог бы выбрать в качестве примера сто других классов, не представляющих какой-либо концепции предметной области, так что я был бы даже концептуально невидимым для конечных пользователей, но я подумал, что было бы более интересно выбрать пример, в котором есть хотя бы некоторая видимость на уровне концепта. Это хорошо показывает, что интерфейсы классов являются только представлениями концепций предметной области (в лучшем случае), а не реальными вещами *. Представление может быть изменено, не затрагивая концепцию. И пользователи имеют и понимают только концепцию; Нашей задачей является сопоставление понятия и представления.
* И можно легко добавить, что модель предметной области, которую представляет наш класс, сама по себе является лишь приблизительным представлением некоторой «реальной вещи» ...