«Это третий день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
Вы должны часто видеть класс контроллера с двумя или тремя тысячами строк.Причина, по которой класс стал таким большим, заключается в следующих причинах:
- слишком много длинных функций
- В классе много полей и функций
Количественные изменения вызывают качественные изменения, каждая функция может быть очень короткой, но количество слишком велико.
1 Модульность программы
Задумывались ли вы о том, почему вы не записываете весь код в файл? Потому что ваше подсознание понимает:
- Одни и те же функциональные модули нельзя использовать повторно
- Сложность далеко за пределами личного понимания
То, что человек может понять, ограничено.В домашней среде интернет-гибкой разработки никто не может быть знаком со всеми деталями кода.
Самое эффективное решение проблемы сложности — «разделяй и властвуй». Поэтому различные языки программирования имеют свое модульное деление (modularity)план:
- Разделить по файлу от оригинала
- Позже используйте OO для разделения по классам
Разработчики больше не сталкиваются с деталями, но модуль, количество модулей явно меньше, чем количество деталей, понимание значительно снижает стоимость, повышает эффективность разработки, больше не имеет 996, может и сестра бумаги в разговоре несколько слов каждый день .
модульность, суть проблемы в том, чтобы сломать, причина в том, что ограниченное личное понимание.
Я так много понимаю, так как же разбить основные категории на более мелкие?
Как появились 2 категории?
2.1 Обязанности не являются единственными
Наиболее вероятная причина больших категорий.
CR кусок кода:
Типичная особенность таких категорий холдингов, в том числе полей готовить: эти поля являются незаменимыми?
- userId, имя, псевдоним и т. д. должны быть основной информацией о пользователе.
- Электронная почта и номер телефона также связаны с пользователем
Многие приложения предоставляют способы входа в систему с использованием электронной почты или номеров мобильных телефонов, поэтому понятно, что эта информация размещена здесь.
- authorType, тип автора, указывает, является ли автор автором по контракту или обычным автором.Автор по контракту может установить информацию об оплате произведения, но обычный автор не имеет этого разрешения
- authorReviewStatus, статус рецензирования автора. Когда автор становится автором контракта, должен быть процесс подачи заявки на рецензирование. Поле статуса — это статус рецензирования.
- editorType, тип редактирования, редактор может быть главным редактором или редактором, с разными правами
Это еще не все для класса User. Но вы можете увидеть проблему, просто взглянув на них:
- Обычные пользователи не являются ни авторами, ни редакторами
Автор и редактор этих связанных полей не имеют значения для обычных пользователей.
- Для пользователей, которые становятся авторами, редакционная информация не имеет большого значения.
Потому что авторы не могут быть редакторами. Редакторы не станут авторами, а информация об авторе не имеет смысла для пользователей, которые станут редакторами.
Всегда есть информация, бессмысленная для одних, но необходимая для других. Суть проблемы в том, что существует только «один» пользовательский класс.
Обычные пользователи, авторы, редакторы, три разные роли, из разных сторон бизнеса, заботятся о разном контенте. Просто потому, что все они являются пользователями одной и той же системы, поместите их всех в один класс пользователей, что вызовет изменения в потребностях любой стороны бизнеса, и класс будет неоднократно модифицироваться.Серьезное нарушение принципа единой ответственности. Так что ключом к решению проблемы является разделение обязанностей.
Хотя это класс, он раздувается из-за объединения вещей, которые волнуют разных персонажей.
Просто разделите разную информацию:
public class User {
private long userId;
private String name;
private String nickname;
private String email;
private String phoneNumber;
...
}
public class Author {
private long userId;
private AuthorType authorType;
private ReviewStatus authorReviewStatus;
...
}
public class Editor {
private long userId;
private EditorType editorType;
...
}
Удалите классы Author и Editor и переместите поля, связанные с автором и редактором, в эти два класса соответственно. Каждый из этих двух классов имеет поле userId, которое используется для связывания роли с конкретным пользователем.
2.2 Поля не группируются
Иногда кажется, что некоторые поля действительно принадлежат к какому-то классу, в результате чего этот класс по-прежнему очень велик.
Новый класс User из предыдущего сплита:
public class User {
private long userId;
private String name;
private String nickname;
private String email;
private String phoneNumber;
...
}
Все эти поля должны учитываться как часть информации о пользователе. Но это все же не малый класс, потому что поля в этом классе не относятся к одному и тому же типу информации. Например, userId, имя и псевдоним — это основная информация о пользователе, а электронная почта и номер телефона — его контактная информация.
С точки зрения спроса, основная информация — это тип контента, который обычно остается неизменным после его определения, а контактная информация будет корректироваться в соответствии с реальной ситуацией, например, для привязки различных учетных записей в социальных сетях. Помещение всей этой информации в класс сделает класс менее стабильным.
Соответственно, поля класса User можно сгруппировать:
public class User {
private long userId;
private String name;
private String nickname;
private Contact contact;
...
}
public class Contact {
private String email;
private String phoneNumber;
...
}
Введите класс Contact (контактная информация), поместите в него адрес электронной почты и phoneNumber, а затем в этот класс можно будет поместить любые корректировки контактной информации. В этой корректировке различная информация рекомбинируется, но каждый класс меньше исходного.
В чем разница между двумя сплитами до и после?
- Фронт - разделить различные объекты в соответствии с их обязанностями
- После этого поля группируются, а разная информация инкапсулируется по классам.
Разбивка больших категорий на подкатегории — это, по сути, проектная работа, основанная на принципе единой ответственности.
Если основные категории разделить на более мелкие, количество категорий увеличится, а значит, увеличится и стоимость понимания людей?Это также повод для многих людей не разделяться на категории.
В различных языках программирования существуют такие механизмы, как пакеты и пространства имен, для группировки различных классов. Когда вам не нужно расширять детали, вы имеете дело с набором классов. Идя дальше, существуют различные библиотеки для дальнейшей упаковки этих упакованных вещей, так что нам нужно только столкнуться с простым интерфейсом, не заботясь о различных деталях.
Программное обеспечение построено в таком многоуровневом пакете.