Ответ
Решения принимались совместно с командой, но я активно участвовал в обсуждениях и предлагал варианты, которые затем согласовывались.
Примеры моих предложений и их обоснование:
-
JPA вместо "чистого" Hibernate:
- Почему: JPA — это стандарт, который обеспечивает большую переносимость кода между разными реализациями ORM.
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Геттеры и сеттеры }
- Почему: JPA — это стандарт, который обеспечивает большую переносимость кода между разными реализациями ORM.
-
Внедрение Project Lombok:
- Почему: Для сокращения шаблонного кода (boilerplate) — автоматической генерации геттеров, сеттеров, конструкторов. Это повышает читаемость и упрощает поддержку.
@Data // Генерирует геттеры, сеттеры, toString, equals, hashCode @Entity public class Product { @Id private Long id; private String title; }
- Почему: Для сокращения шаблонного кода (boilerplate) — автоматической генерации геттеров, сеттеров, конструкторов. Это повышает читаемость и упрощает поддержку.
Все предложения обсуждались с архитектором и командой для оценки влияния на проект.
Ответ 18+ 🔞
Вот, представляешь, сидим мы, значит, на совещании, как обычно, пиздим про архитектуру. Все такие умные, в ус не дуют. А я, блядь, сижу и думаю: "Ну чё, опять будем изобретать велосипед с квадратными колёсами?". И начал я им мозги ебать своими идеями, ну, в хорошем смысле. Не то чтобы я один всё решал — нет, мы коллективно голову ломали. Но я был этот... как его... катализатор, блядь. Подкидывал варианты, а они уже их обсасывали, как мартышки банан.
Вот, например, приперся я с темой по JPA. Все вокруг на Hibernate молятся, как на икону. А я такой: "Мужики, вы в курсе, что JPA — это, по сути, стандартная обёртка? Это как взять 'Жигули' и назвать их 'Ладой' — та же хрень, но по паспорту приличнее". Суть в том, что если завтра нам взбредёт в голову сменить провайдера ORM, то с JPA мы не обосрёмся полностью. Код останется рабочим, а не превратится в тыкву в полночь. Вот смотри, как это выглядит, просто и элегантно, без лишней магии:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Геттеры и сеттеры
}
Видишь? Никаких SessionFactory, никаких привязок к конкретной либе. Чистая абстракция, мать её. Архитектор сначала покрутил у виска, но потом, когда я ему на пальцах объяснил про вендор-лок и будущие боли в жопе, он такой: "А ведь и правда, ёпта...". Команда тоже вроде как за.
А второй мой конёк — это Lombok. Боже, сколько же я видел этих бесконечных геттеров и сеттеров... Руки просто отваливались это писать. Целые классы, состоящие на 80% из этой однообразной хуйни. Я пришёл и сказал: "Ребят, мы что, в каменном веке? Давайте автоматизируем эту рутину, ебать её в сраку!". Предложил внедрить Project Lombok.
Обоснование было проще пареной репы: меньше кода — меньше ошибок, выше читаемость, и не нужно каждый раз обновлять equals с hashCode, когда поле добавил. Смотри, как красота получается:
@Data // Генерирует геттеры, сеттеры, toString, equals, hashCode
@Entity
public class Product {
@Id
private Long id;
private String title;
}
Одна аннотация @Data — и ты, сука, король! Конечно, были сомнения: "А как это в IDE отобразится?", "А не сломает ли что?". Мы всё это, естественно, с архитектором и командой обсудили, почесали репу, потестировали на песочнице. В итоге пришли к выводу, что профит — овердохуищный, а риски — минимальные. Так что теперь у нас код стал чище, а жизнь — немного прекраснее.