Абстракция характеристик - это не что иное, как содержащее в себе характеристики объектов определенного класса.
Допустим, у нас есть простой класс,
И давайте перейдем в нашу воображаемую страну, где все Личности являются либо мужчинами, либо женщинами. И если возраст мужчины и женщины старше 20 и 18 лет соответственно, он считается майором.
Давайте подойдем к этой проблеме с помощью традиционных петель,
Немного лучше с обычными потоками Java 8,
Однако после извлечения Predicate
это может выглядеть еще лучше.
Теперь мы сделали все, что можем, с Streams. Но у этого подхода есть одна оговорка. Это место, где мы определили isMajor()
метод. Это определение характеристики Person
объектов и в идеале должно присутствовать в Person
классе. Итак, наш обновленный класс Person
будет выглядеть так
Возможно, это небольшое изменение. Но это приводит к поразительному снижению сложности кода и сокращению обслуживания кода. Предположим, что теперь вы хотите изменить возраст совершеннолетия лица женского пола с 18 на 20. Для этого просто потребуется изменить класс Person и больше нигде в вашей кодовой базе.
Кроме того, наш код выглядит намного аккуратнее.
Кроме того, это поможет в целом с наследованием. У нас будет класс Engineer extends Person
. Теперь, если вы хотите изменить isMajor()
только для инженеров, все, что нам нужно сделать, это переопределить метод isMajor()
в классе Person
.
Итак, впредь, если вы видите какую-либо характеристику, общую для всех объектов определенного класса, пожалуйста, начните размещать ее внутри класса.
Кроме того, трижды подумайте, прежде чем создавать служебные классы, PersonUtility.java
, чтобы сделать это. Создание служебных классов вместо характерной абстракции - неправильная тенденция / шаблон.
Разве это не выглядит неуклюжим / неестественно для чтения? Возможно, вы захотите проверить, что isMajor
делает в PersonUtility
, потому что это отдельный класс и может делать все, что угодно! Кроме того, это будет совсем другая история, которую сложно объяснить, если нескольким унаследованным классам нужно переопределить поведение isMajor()
, а наш PersonUtility
просто испорчен на всю жизнь. 😂
Итак, не более того. Не меньше. Просто абстрагируйте это правильно! 😊