From 2c241b508ba54dc3177596b836892a46898cd338 Mon Sep 17 00:00:00 2001 From: Sufyan Date: Tue, 25 Feb 2025 01:20:36 +0530 Subject: [PATCH 1/2] SUF-11 Good Engineer1: Finding the breakage of Liskov Principle --- api/RuleEngine.java | 10 ++-------- api/RuleSet.java | 18 +++++++----------- boards/TicTacToeBoard.java | 4 ++-- game/Board.java | 3 ++- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/api/RuleEngine.java b/api/RuleEngine.java index 1e8797d..33b8565 100644 --- a/api/RuleEngine.java +++ b/api/RuleEngine.java @@ -4,15 +4,10 @@ import game.Board; import game.GameState; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Function; - public class RuleEngine { - Map> ruleMap = new HashMap<>(); + Map ruleMap = new HashMap<>(); public RuleEngine(){ ruleMap.put(TicTacToeBoard.class.getName(),TicTacToeBoard.getRules()); @@ -20,8 +15,7 @@ public RuleEngine(){ public GameState getState(Board board){ if(board instanceof TicTacToeBoard board1) { - RuleSet rules = (RuleSet) ruleMap.get(TicTacToeBoard.class.getName()); - for(Rule rule: rules){ + for(Rule rule: ruleMap.get(TicTacToeBoard.class.getName())){ GameState gameState = rule.condition.apply(board1); if(gameState.isOver()){ return gameState; diff --git a/api/RuleSet.java b/api/RuleSet.java index 4ae7b8e..37a7cba 100644 --- a/api/RuleSet.java +++ b/api/RuleSet.java @@ -1,24 +1,20 @@ package api; -import game.Board; +import java.util.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class RuleSet implements Iterable>{ - List> rules = new ArrayList<>(); +public class RuleSet implements Iterable{ + Set ruleList = new HashSet<>(); /** * Returns an iterator over elements of type {@code T}. * * @return an Iterator. */ @Override - public Iterator> iterator() { - return rules.iterator(); + public Iterator iterator() { + return ruleList.iterator(); } - public void add (Rule rule){ - rules.add(rule); + public void add (Rule rule){ + ruleList.add(rule); } } diff --git a/boards/TicTacToeBoard.java b/boards/TicTacToeBoard.java index 5805bb8..8edd321 100644 --- a/boards/TicTacToeBoard.java +++ b/boards/TicTacToeBoard.java @@ -34,8 +34,8 @@ public void setCell(Cell cell, String symbol) { } } - public static RuleSet getRules(){ - RuleSet rules = new RuleSet<>(); + public static RuleSet getRules(){ + RuleSet rules = new RuleSet(); rules.add(new Rule<>((board)->outerTraversal(board::getSymbol))); rules.add(new Rule<> ((board)->outerTraversal((i,j)-> board.getSymbol(j,i)))); rules.add(new Rule<> ((board)->traverse((i)-> board.getSymbol(i,i)))); diff --git a/game/Board.java b/game/Board.java index 4b3416a..bed8f91 100644 --- a/game/Board.java +++ b/game/Board.java @@ -1,6 +1,7 @@ package game; public interface Board { - public abstract void move(Move move); + void move(Move move); // public abstract Board copy(); + String getSymbol(int i, int j); // Breaking LisKov Substitution Principle (Subclass like chess cannot have getSymbol) } From 119c36e6914faadfbe49e5ad8e1081b659168e7b Mon Sep 17 00:00:00 2001 From: Sufyan Date: Tue, 25 Feb 2025 01:26:00 +0530 Subject: [PATCH 2/2] SUF-11 Good Engineer1: Making Rules Extensible with respect to changing games --- boards/TicTacToeBoard.java | 8 ++++---- game/Board.java | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/boards/TicTacToeBoard.java b/boards/TicTacToeBoard.java index 8edd321..ac20e3d 100644 --- a/boards/TicTacToeBoard.java +++ b/boards/TicTacToeBoard.java @@ -36,10 +36,10 @@ public void setCell(Cell cell, String symbol) { public static RuleSet getRules(){ RuleSet rules = new RuleSet(); - rules.add(new Rule<>((board)->outerTraversal(board::getSymbol))); - rules.add(new Rule<> ((board)->outerTraversal((i,j)-> board.getSymbol(j,i)))); - rules.add(new Rule<> ((board)->traverse((i)-> board.getSymbol(i,i)))); - rules.add(new Rule<> ((board)->traverse((i)-> board.getSymbol(i,2-i)))); + rules.add(new Rule((board)->outerTraversal(board::getSymbol))); + rules.add(new Rule ((board)->outerTraversal((i,j)-> board.getSymbol(j,i)))); + rules.add(new Rule ((board)->traverse((i)-> board.getSymbol(i,i)))); + rules.add(new Rule ((board)->traverse((i)-> board.getSymbol(i,2-i)))); rules.add(new Rule<> (TicTacToeBoard::countMoves)); return rules; } diff --git a/game/Board.java b/game/Board.java index bed8f91..1f232df 100644 --- a/game/Board.java +++ b/game/Board.java @@ -2,6 +2,4 @@ public interface Board { void move(Move move); -// public abstract Board copy(); - String getSymbol(int i, int j); // Breaking LisKov Substitution Principle (Subclass like chess cannot have getSymbol) }