Repository: CorporationX/god_bless
Pull request #19126: "Выполнить задачу Meta-вселенная"
Author: login: KirillSMv
Created: 2025-04-12T16:03:28Z | Merged: 2025-04-13T08:14:05Z

"Выполнить задачу Meta-вселенная"


Diff:
diff --git a/src/main/java/school/faang/meta/Main.java b/src/main/java/school/faang/meta/Main.java
new file mode 100644
index 00000000000..91da0bdf1cb
--- /dev/null
+++ b/src/main/java/school/faang/meta/Main.java
@@ -0,0 +1,40 @@
+package school.faang.meta;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class Main {
+    public static void main(String[] args) {
+        NotificationManager notificationManager = new NotificationManager();
+        notificationManager.registerHandler(NotificationType.EMAIL, notification ->
+                System.out.println("here we send email to user with a message: " + notification.getMessage()));
+        notificationManager.registerHandler(NotificationType.SMS, notification ->
+                System.out.println("here we send sms to user with a message: " + notification.getMessage()));
+        notificationManager.registerHandler(NotificationType.PUSH, notification ->
+                System.out.println("here we send PUSH notification to user with a message: " +
+                        notification.getMessage()));
+
+        Notification emailNotification = new Notification(NotificationType.EMAIL,
+                "Your notification #1 sent by email");
+        Notification smsNotification = new Notification(NotificationType.SMS,
+                "Your notification #2 sent by sms");
+        Notification pushNotification = new Notification(NotificationType.PUSH,
+                "Your notification #3 sent by PUSH");
+        Notification notValidEmailNotification = new Notification(NotificationType.EMAIL,
+                "Your notification sent by email");
+        Notification emptyEmailNotification = new Notification(NotificationType.EMAIL, "");
+
+        notificationManager.registerFilter(NotificationType.EMAIL, notification ->
+                notification.getMessage().contains("#"));
+        notificationManager.registerFilter(NotificationType.EMAIL, notification ->
+                !notification.getMessage().isBlank());
+
+        notificationManager.sendNotification(emailNotification);
+        notificationManager.sendNotification(smsNotification);
+        notificationManager.sendNotification(pushNotification);
+        notificationManager.sendNotification(notValidEmailNotification);
+        notificationManager.sendNotification(emptyEmailNotification);
+
+        log.debug("Errors list : {}", notificationManager.getErrors());
+    }
+}
diff --git a/src/main/java/school/faang/meta/Notification.java b/src/main/java/school/faang/meta/Notification.java
new file mode 100644
index 00000000000..09bb313c56b
--- /dev/null
+++ b/src/main/java/school/faang/meta/Notification.java
@@ -0,0 +1,11 @@
+package school.faang.meta;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Notification {
+    private NotificationType type;
+    private String message;
+}
diff --git a/src/main/java/school/faang/meta/NotificationManager.java b/src/main/java/school/faang/meta/NotificationManager.java
new file mode 100644
index 00000000000..a932cd3c332
--- /dev/null
+++ b/src/main/java/school/faang/meta/NotificationManager.java
@@ -0,0 +1,48 @@
+package school.faang.meta;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+@Slf4j
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        this.notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        this.filtersMap.computeIfAbsent(type, notificationType -> new ArrayList<>()).add(filter);
+    }
+
+    public void sendNotification(Notification notification) {
+        boolean isValidationPassed = validateNotification(notification);
+        if (isValidationPassed) {
+            this.notificationHandlersMap.get(notification.getType()).accept(notification);
+        }
+    }
+
+    public boolean validateNotification(Notification notification) {
+        List<Predicate<Notification>> filters = this.filtersMap.computeIfAbsent(notification.getType(),
+                notificationType -> new ArrayList<>());
+        return filters.stream().allMatch(filter -> {
+            if (!filter.test(notification)) {
+                errors.add("filtering not passed for notification: " + notification);
+                log.warn("filtering not passed for notification: {}", notification);
+            }
+            return filter.test(notification);
+        });
+    }
+
+    public List<String> getErrors() {
+        return errors;
+    }
+}
diff --git a/src/main/java/school/faang/meta/NotificationType.java b/src/main/java/school/faang/meta/NotificationType.java
new file mode 100644
index 00000000000..0c49593c2b0
--- /dev/null
+++ b/src/main/java/school/faang/meta/NotificationType.java
@@ -0,0 +1,7 @@
+package school.faang.meta;
+
+public enum NotificationType {
+    EMAIL,
+    SMS,
+    PUSH
+}


Reviews:
user: login: iBerbasov
state: CHANGES_REQUESTED
author_association: NONE
submitted_at: 2025-04-12T16:43:46Z
user: login: KirillSMv
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-12T17:30:36Z
user: login: KirillSMv
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-12T17:55:40Z
user: login: iBerbasov
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-13T08:12:41Z

Review comments:
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: iBerbasov
body: При обращении к полям инстанса хорошей практикой считается this
`this.notificationHandlersMap...`
Аналогично для всех остальных обращений к другим полям
created_at: 2025-04-12T16:30:50Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
+    }
+
+    public void sendNotification(Notification notification) {
+        boolean isValidationPassed = validateNotification(notification);
+        if (isValidationPassed) {
+            notificationHandlersMap.get(notification.getType()).accept(notification);
+        }
+    }
+
+    public boolean validateNotification(Notification notification) {
+        boolean isValidationPassed = true;
+        List<Predicate<Notification>> filters = filtersMap.get(notification.getType());
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: iBerbasov
body: Интересное решение! 
Но интерфейс Predicate обычно используется в связке со Stream API

Сейчас этот метод содержит большую вложенность - два if, между ними еще цикл.. Логика выполняется достаточно простая, а вот код прочитать сложновато

Попробуй переписать этот метод в стиле stream api - код станет значительно красивее и читабельнее
created_at: 2025-04-12T16:36:47Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: iBerbasov
body: Этот метод тоже можно переписать более лаконично, попробуй применить другие методы интерфейса Map. Они предоставляют большие возможности
Например [computeIfAbsent](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-)
created_at: 2025-04-12T16:39:31Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
+    }
+
+    public void sendNotification(Notification notification) {
+        boolean isValidationPassed = validateNotification(notification);
+        if (isValidationPassed) {
+            notificationHandlersMap.get(notification.getType()).accept(notification);
+        }
+    }
+
+    public boolean validateNotification(Notification notification) {
+        boolean isValidationPassed = true;
+        List<Predicate<Notification>> filters = filtersMap.get(notification.getType());
+        if (filters != null) {
+            for (Predicate<Notification> filter : filters) {
+                if (!filter.test(notification)) {
+                    errors.add("filtering not passed for notification: " + notification);
+                    isValidationPassed = false;
+                }
+            }
+        }
+        return isValidationPassed;
+    }
+
+    public List<String> getErrors() {
+        return errors;
+    }
+
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: iBerbasov
body: Лишняя пустая строка
created_at: 2025-04-12T16:41:19Z
author_association: NONE
diff_hunk: @@ -0,0 +1,37 @@
+package school.faang.meta;
+
+public class Main {
+    public static void main(String[] args) {
+        NotificationManager notificationManager = new NotificationManager();
+        notificationManager.registerHandler(NotificationType.EMAIL, notification ->
+                System.out.println("here we send email to user with a message: " + notification.getMessage()));
+        notificationManager.registerHandler(NotificationType.SMS, notification ->
+                System.out.println("here we send sms to user with a message: " + notification.getMessage()));
+        notificationManager.registerHandler(NotificationType.PUSH, notification ->
+                System.out.println("here we send PUSH notification to user with a message: " +
+                        notification.getMessage()));
+
+        Notification emailNotification = new Notification(NotificationType.EMAIL,
+                "Your notification #1 sent by email");
+        Notification smsNotification = new Notification(NotificationType.SMS,
+                "Your notification #2 sent by sms");
+        Notification pushNotification = new Notification(NotificationType.PUSH,
+                "Your notification #3 sent by PUSH");
+        Notification notValidEmailNotification = new Notification(NotificationType.EMAIL,
+                "Your notification sent by email");
+        Notification emptyEmailNotification = new Notification(NotificationType.EMAIL, "");
+
+        notificationManager.registerFilter(NotificationType.EMAIL, notification ->
+                notification.getMessage().contains("#"));
+        notificationManager.registerFilter(NotificationType.EMAIL, notification ->
+                !notification.getMessage().isBlank());
+
+        notificationManager.sendNotification(emailNotification);
+        notificationManager.sendNotification(smsNotification);
+        notificationManager.sendNotification(pushNotification);
+        notificationManager.sendNotification(notValidEmailNotification);
+        notificationManager.sendNotification(emptyEmailNotification);
+
+        System.out.println("Errors list : " + notificationManager.getErrors());
path: src/main/java/school/faang/meta/Main.java
user: login: iBerbasov
body: В проекте подключен Lombok. Он предоставляет @Slf4j - логгер с широкими возможностями. Замени sout-ы на логгеры. Это так же позволит избавится от конкатенаций и сделает код более читабельным
created_at: 2025-04-12T16:43:36Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: KirillSMv
body: я потыкался с merge, но для этих параметров не получилось его сконфигурировать, про computeIfAbsent забыл:) спасибо!
created_at: 2025-04-12T17:30:36Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
+    }
+
+    public void sendNotification(Notification notification) {
+        boolean isValidationPassed = validateNotification(notification);
+        if (isValidationPassed) {
+            notificationHandlersMap.get(notification.getType()).accept(notification);
+        }
+    }
+
+    public boolean validateNotification(Notification notification) {
+        boolean isValidationPassed = true;
+        List<Predicate<Notification>> filters = filtersMap.get(notification.getType());
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: KirillSMv
body: ну вот такой вариант) один if все равно есть, потому что я хочу имитировать добавление ошибок валидации в отдельный список.
created_at: 2025-04-12T17:55:39Z
author_association: NONE
diff_hunk: @@ -0,0 +1,50 @@
+package school.faang.meta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class NotificationManager {
+    private final Map<NotificationType, Consumer<Notification>> notificationHandlersMap = new HashMap<>();
+    private final Map<NotificationType, List<Predicate<Notification>>> filtersMap = new HashMap<>();
+    private final List<String> errors = new ArrayList<>();
+
+    public void registerHandler(NotificationType type, Consumer<Notification> handler) {
+        notificationHandlersMap.put(type, handler);
+    }
+
+    public void registerFilter(NotificationType type, Predicate<Notification> filter) {
+        List<Predicate<Notification>> filtersList = filtersMap.getOrDefault(type, new ArrayList<>());
+        filtersList.add(filter);
+        filtersMap.put(type, filtersList);
+    }
+
+    public void sendNotification(Notification notification) {
+        boolean isValidationPassed = validateNotification(notification);
+        if (isValidationPassed) {
+            notificationHandlersMap.get(notification.getType()).accept(notification);
+        }
+    }
+
+    public boolean validateNotification(Notification notification) {
+        boolean isValidationPassed = true;
+        List<Predicate<Notification>> filters = filtersMap.get(notification.getType());
path: src/main/java/school/faang/meta/NotificationManager.java
user: login: iBerbasov
body: Да, хороший вариант! Единственное, что я бы еще в нём доработал - лучше по-возможности создавать позитивные проверки. На этот счёт описано много разных аргументов - это проще вспринимается при чтении - элементарно меньше разных "НЕ" надо запоминать, чтобы не терять суть логики, сам знак '!' ухудшает читабельность кода
```
if (filter.test(notification)) {
    return true;
} else {
    errors.add("filtering not passed for notification: " + notification);
    log.warn("filtering not passed for notification: {}", notification);
    return false;
}
```
Но этот момент достаточно субъективный и больше холиварный
created_at: 2025-04-13T08:12:41Z
author_association: NONE

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-12T16:04:11Z
body: ⚠️ **ОШЫБКА**: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-12T16:06:33Z
body: ⚠️ **ОШЫБКА**: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-12T17:57:45Z
body: ⚠️ **ОШЫБКА**: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.
author_association: NONE