Избегайте нарушения принципов SOLID при попытке сделать методы составного класса видимыми для другого класса пакета - PullRequest
0 голосов
/ 26 июня 2019

Я готовлю университетский проект к экзамену по Java, проект состоит из создания сети маршрутизаторов и отправки пакетов друг другу до тех пор, пока пакет не прибудет к месту назначения по кратчайшему пути.

Проект требует соблюдения принципов SOLID, и я на самом деле нахожусь в тупиковой ситуации, возможно, потому что я впервые с Java.

Я создал класс NODE, представляющий общий сетевой узел, который несет единственную ответственность за хранение имени, связанного с IP, и ничего больше, затем я создаю класс ROUTING, его ответственность состоит в том, чтобы хранить все известные сетевые маршруты в HashMap (целое число представляет нагрузку на трафик и она случайна), включая отображение и добавление записей на карту методами.

Класс NODE включает класс ROUTING в качестве защищенного объекта внутреннего класса.

Теперь эти классы хранятся в пакете ROUTER. Для создания сети я создал еще один пакет с именем NETWORKSTARTER и класс в нем с именем STARTER. Цель этого класса - создать сеть и подключиться (добавить узлы в таблицу маршрутизатора). ) другие объекты сети друг к другу.

Поскольку я кодировал метод подключения, я наткнулся на тот факт, что я не могу вызывать внутренние методы NODE.ROUTING, даже если это защищенный класс в классе NODE.

Пытаясь решить эту проблему, я пытался создать в классе NODE три метода, которые «оборачивают» методы класса ROUTING, в основном вызывая их с другим именем, таким образом методы STARTER могут вызывать методы ROUTING через NODE. методы для добавления узлов в HashMap.

Вопрос заключается в следующем: : нарушает ли этот проект принципы SOLID? В частности, проект класса NODE нарушает принцип единой ответственности?

public class NODE{
private String nodeName;
private int nodeIP;
protected ROUTING nodeRoutingModule;

public NODE(String x,int y){
this.nodeName=x;
this.nodeIP=y;
this.nodeRoutingModule = new ROUTING();
}

// setter and getters for name and IP

public void addRoute(NODE node){
    this.nodeRoutingModule.addToMap(node);
}

public void showTable(){
    this.nodeRoutingMdoule.showMap();
}

}
public class ROUTING{
private HashMap<NODE,Integer> routeTable;

public ROUTING(){
    this.routeTable = new HashMap<>();
}

public void addToMap(Node node){
    int load = ThreadLocalRandom.current().nextInt(0,11);
    routeTable.put(node,load);
}

public void showMap(){
    routeTAble.forEach.((t,u) -> {
        system.out.println(t.getIp+" "+t.getName);
    });
}

}

public class STARTER{
private LinkedList<NODE> nodeCollection;

public STARTER(){
    this.nodeCollection = new LinkedList<>();
}

// here i popluate the list with NODES

public void connectNodes(){
    // logic with a forEach cyle calling for each node
    // the method to add the node to his routin table with
    // another inner forEach cyle using the NODE class
    // wrapping the ROUTING methods
}

1 Ответ

1 голос
/ 29 июня 2019

Это будет зависеть от ваших обязанностей:)

Давайте начнем с другого места.Давайте начнем с вашей модели.

Я немного растерялся, когда вы говорите NODE, но вы имеете в виду ROUTER.Я знаю, что это действительно терминология, используемая в сети, но все же вы создаете модель.

Я знаю, что это кажется немного глупым, но подумайте об этом на секунду и сконцентрируйтесь на язык , который вы используете

  • Какова ответственность ROUTER?

VS

  • Чтоэто ответственность NODE?

Какова ответственность NODE?Ну, NODE - это общий термин, используемый для элемента, который является частью графа, дерева, сети или чего-либо еще.

Теперь ROUTER - это совсем другое.ROUTER действительно является NODE в NETWORK, и , а также направляет / отправляет пакетов другим ROUTERS в сети.

Он также связывается (отправляя сообщения, это ключ) с другими узлами в сети для вычисления ROUTING TABLE.Для вычисления ROUTING TABLE, NODES используйте PROTOCOL ( Состояние связи , Удаленный вектор и т. Д.)

Если вы делаете реалистичную модельсеть, вы должны принять во внимание эти вещи.

Теперь к NetworkStarter.Вы запускаете сеть или вы подключаете / собираете сеть?Также, почему сеть начала содержать список узлов?Мне кажется, что это ответственность за подключение / сборку сети.

После этого ответственность за сборку ROUTING TABLE лежит на узлах.

Теперь о концепцииROUTE.

Что такое ROUTE?Ну, это путь между двумя или более NODES.Давайте добавим еще одну концепцию в: CONNECTION (EDGE на графике) между соседями в сети.

Давайте запишем все концепции до этого момента

  • Router- Обязанности: отправка пакетов, создание таблицы маршрутизации
  • RoutingTable - используется Router, Обязанности: хранение маршрутов (или путей)
  • Connection - подключение от одного маршрутизатора к другому
  • ConnectionsTable - используется Router Обязанности: хранит соседей
  • Path - путь между двумя или более узлами
  • Node - a RouterNode
  • NetworkAssembler - Обязанности: собрать сеть, подключить маршрутизаторы (узлы)
  • Routing Protocol - используется маршрутизаторами для связи и расчета RoutingTable

Теперь к SOLID:

Одиночная ответственность: это сложно!

Иногда компонент (может быть объектом) имеет более одной ответственности.Внутри он может состоять из других вещей или компонентов , которые могут иметь только одну ответственность.

Возьмите Router в вашем случае.Что такое одиночная ответственность?В реальном мире все работает не так, как в программном обеспечении.Вы не можете просто взять на себя ответственность сети за создание таблиц маршрутизации в реальном мире.Сеть не существует как физическая вещь, подобная маршрутизатору, она состоит из , состоящих из компонентов.

Мы уже анализируем обязанности и назначаем их различным понятиям.

Открыто-Закрыто:

Что означает расширение нашей системы?

  • Добавить узлы режима?Да, это может быть сделано, и в этом вся идея создания сетей:)

  • Изменить протокол?Добавить возможность к маршрутизаторам расширяться (и настраивать, какой протокол использовать) с помощью нового protocols: подсказка использовать STRATEGY PATTERN для реализации

  • Переупорядочить сеть?Вы делаете NetworkAssembler расширяемым (с помощью STRATEGY PATTERN или чего-то еще).В реальном мире вы отправляете системных администраторов на курсы, чтобы узнать больше.Это похоже на внедрение нового шаблона стратегии:)

Принцип подстановки Лискова: если вы используете шаблон стратегии, убедитесь, что вы не пропускаете абстракцию слишком много

Разделение интерфейсов: используйте небольшие интерфейсы для своих концепций (Router, RoutingProtocol и т. Д.)

Инверсия зависимостей: используйте интерфейсы и делайте их маленькими:)

Я не буду приводить примеры кода, так как люди учатся программировать, программируя, так как это ваше задание :) Используйте вещи из этого ответа, чтобы получить ваши концепции, захватить их в коде и сделать хорошую реализацию.

Удачи и веселья Кодирование:)

...