Код Запаха 267 - Объекты Совпадения
2 сентября 2024 г.Отдавайте предпочтение неизменности, чтобы сохранить контроль над своими объектами.
TL;DR: Используйте неизменяемые объекты, чтобы предотвратить неожиданные изменения, вызванные алиасингом.
Проблемы
- Непредвиденныймутации
- Сложное отслеживание ошибок
- Непредсказуемое поведение кода
- Снижение предсказуемости кода
- Увеличенное сцепление
- Нарушена безопасность потока
Решения
- Используйте неизменяемые объекты
- Внедрить защитное копирование
- Отдавайте предпочтение функциональному программированию
Рефакторинг
https://maximilianocontieri.com/refactoring-008-convert-variables-to-constant?embedable=true
Контекст
Псевдонимизация происходит, когда несколько ссылок указывают на один и тот же изменяемый объект. Это может привести к неожиданным изменениям в них, когда одна часть кода изменяет объект, влияя на все ссылки.
Неизменяемые объекты снижают этот риск, гарантируя, что вы не сможете изменить их внутреннее представление после создания объекта.
Коллекция псевдонимовявляется ярким примером этой проблемы.
Образец кода
Неправильный
public class Person {
private String name;
}
public void modifyPerson(Person person) {
person.setName("Cosmo Kramer");
}
public static void main(String[] args) {
Person p1 = new Person("Newman");
Person p2 = p1; // p1 и p2 ссылаются на один и тот же объект
modifyPerson(p1);
System.out.println(p1.name()); // Вывод: Cosmo Kramer
System.out.println(p2.name()); // Вывод: Cosmo Kramer (неожиданный)
}
Верно
public class ImmutablePerson {
private final String name;
public ImmutablePerson(String name) {
this.name = name;
}
}
public ImmutablePerson withName(String newName) {
return new ImmutablePerson(newName);
}
public static void main(String[] args) {
ImmutablePerson p1 = new ImmutablePerson("Newman");
ImmutablePerson p2 = p1; // p1 и p2 ссылаются на один и тот же объект
// Изменение p1 создает новый объект
ImmutablePerson p3 = p1.withName("Cosmo Kramer");
// но это плохая практика
// поскольку только конструкторы должны создавать новые объекты
// Лучший вариант — это
ImmutablePerson p3 = new ImmutablePerson("Cosmo Kramer");
System.out.println(p1.name()); // Вывод: Ньюман
System.out.println(p2.name()); // Вывод: Ньюман
System.out.println(p3.name()); // Вывод: Космо Крамер
}
Обнаружение
- [х]Полуавтоматический
Вы можете обнаружить этот запах, проверив свой код на предмет изменяемых объектов, общих для разных частей вашей программы.
Тег(и)
- Изменчивость
Уровень
- [х]Средний
Генерация ИИ
Генераторы ИИ могут привнести этот запах, если они специально не обучены отдавать приоритет неизменности и избегать проблем с наложением имен.
Обнаружение ИИ
Детекторы ИИ распознают этот запах, анализируя код на предмет изменяемых общих объектов и предлагая неизменяемые альтернативы.
Им нужны конкретные инструкции относительно контекста и важности неизменности в кодовой базе.
Попробуйте!
Помните, что помощники на основе искусственного интеллекта совершают много ошибок
ЧатGPTКлодНедоумениеБлизнецы
Заключение
Использование неизменяемых объектов и отказ от псевдонимов может значительно улучшить предсказуемость кода, уменьшить количество ошибок и повысить безопасность потоков. Это требует изменения мышления, а преимущества неизменяемости значительно перевешивают начальную кривую обучения.
Связанное чтение
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxvi
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxvi
https://hackernoon.com/code-smell-266-collection-aliasing?embedable=true
https://hackernoon.com/is-it-crystal-clear-for-everybody-that-a-date-should-not-mutate-wuoy3z03?embedable=true
Отказ от ответственности: Код Запахи — это моимнение.
Автор фото:Естественные фотографиинаUnsplash
Неизменность меняет все.
Пэт Хелланд
https://hackernoon.com/400- Thought-provoking-software-engineering-quotes?embedable=true
Эта статья является частью серии CodeSmell на HackerNoon:Как найти проблемные части вашего кода
Оригинал