Классы должны быть разработаны в соответствии с принципом единой ответственности : они должны делать только одно.
У вас есть класс, который выполняет две задачи. Поскольку два метода addEdges
принимают разные параметры (и разное количество параметров) и используют их для создания разных вещей, между двумя «вещами», которые выполняют эти классы, мало общего, помимо того факта, что они оба представляют графики.
Возможно, вы могли бы придумать общий c logi * между двумя разделенными классами; но, честно говоря, это было бы хуже, чем просто дублирование кода.
class Graphs1<T>{
public HashMap<T, LinkedList<T>> g1;
public boolean[] visited;
Graphs1(int size){
g1 = new HashMap<>();
visited = new boolean[size +1];
}
public void addEdges(T u , T v){
g1.computeIfAbsent(u, k -> new LinkedList<>()).add(v);
g1.computeIfAbsent(v, k -> new LinkedList<>()).add(u);
}
}
class Graphs2<T, V>{
public boolean[] visited;
public HashMap<T, LinkedList<Pair<T, V>>> g2;
// Pair declaration omitted.
Graphs2(int size){
g2 = new HashMap<>();
visited = new boolean[size +1];
}
public void addEdges(T u , T v , V w){
g2.computeIfAbsent(u, k -> new LinkedList<>()).add(new Graphs.Pair<>(v, w));
g2.computeIfAbsent(v, k -> new LinkedList<>()).add(new Graphs.Pair<>(u, w));
}
}
Я полагаю, вы могли бы объявить класс примерно так:
class BaseGraph<T, E> {
public HashMap<T, LinkedList<E>> g = new HashMap<>();
public boolean[] visited;
BaseGraph(int size) {
this.visited = new boolean[size + 1];
}
protected void addEdge(T u, E value) {
g.computeIfAbsent(u, k -> new LinkedList<>()).add(value);
}
}
, а затем сделать его членом внутри отдельных классов:
class Graphs1<T> {
BaseGraph<T, T> bg;
Graphs1(int size) { bg = new BaseGraph<>(size); }
public void addEdges(T u, T v) {
bg.addEdge(u, v);
bg.addEdge(v, u);
}
}
class Graphs2<T, V> {
BaseGraph<T, Pair<T, V>> bg;
Graphs2(size) { bg = new BaseGraph<>(size); }
public void addEdges(T u, T v) {
bg.addEdge(u, new Pair<>(v, w));
bg.addEdge(v, new Pair<>(u, w));
}
}
Я все еще не совсем уверен в этом стоит того, чтобы просто дублировать код. Это реально экономит только на addEdge
строках.