From ad48dbcebf279b437f0b3f5882dfec6098b25ff0 Mon Sep 17 00:00:00 2001
From: Youssouf <ali-moussa.YOUSSOUF@etu.univ-amu.fr>
Date: Thu, 23 Nov 2023 15:25:51 +0100
Subject: [PATCH] Modification du code en la factorisant pour qu'il respecte le
 principe SOLID

---
 src/main/java/controller/Controller.java  |  18 ++--
 src/main/java/model/Fire.java             |   6 --
 src/main/java/model/FireFighter.java      |   6 --
 src/main/java/model/FireFighters.java     | 102 +++++++++++++++++++
 src/main/java/model/FirefighterBoard.java | 116 +++++-----------------
 src/main/java/model/Fires.java            |  78 +++++++++++++++
 src/main/java/model/ICLOUD.java           |   5 +
 src/main/java/model/ModelElement.java     |   8 +-
 8 files changed, 227 insertions(+), 112 deletions(-)
 delete mode 100644 src/main/java/model/Fire.java
 delete mode 100644 src/main/java/model/FireFighter.java
 create mode 100644 src/main/java/model/FireFighters.java
 create mode 100644 src/main/java/model/Fires.java
 create mode 100644 src/main/java/model/ICLOUD.java

diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 2698f72..bdd73b4 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -12,9 +12,7 @@ import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
 import javafx.util.Duration;
 import javafx.util.Pair;
-import model.Board;
-import model.ModelElement;
-import model.FirefighterBoard;
+import model.*;
 import util.Position;
 import view.*;
 
@@ -80,13 +78,17 @@ public class Controller {
     updateGenerationLabel(board.stepNumber());
   }
 
+
   private ViewElement getViewElement(List<ModelElement> squareState) {
-    if(squareState.contains(ModelElement.FIREFIGHTER)){
-      return new FIREFIGHTER();
-    }
-    if (squareState.contains(ModelElement.FIRE)){
-      return new FIRE();
+    for (ModelElement model: squareState){
+      if(model instanceof FireFighters){
+        return new FIREFIGHTER();
+      }
+      if (model instanceof Fires){
+        return new FIRE();
+      }
     }
+
     return new EMPTY();
   }
 
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
deleted file mode 100644
index b3f769c..0000000
--- a/src/main/java/model/Fire.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package model;
-
-public class Fire {
-
-
-}
diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java
deleted file mode 100644
index a8991f4..0000000
--- a/src/main/java/model/FireFighter.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package model;
-
-public class FireFighter {
-
-
-}
diff --git a/src/main/java/model/FireFighters.java b/src/main/java/model/FireFighters.java
new file mode 100644
index 0000000..6812738
--- /dev/null
+++ b/src/main/java/model/FireFighters.java
@@ -0,0 +1,102 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+public class FireFighters implements ModelElement {
+
+    private List<Position> fireFightersPositions;
+    private int rowCount;
+    private int columnCount;
+
+    private final Random randomGenerator = new Random();
+
+    public FireFighters() {
+    }
+
+
+    public void add(Position position){
+        fireFightersPositions.add(position);
+    }
+
+    public List<Position> getFireFightersPositions() {
+        return fireFightersPositions;
+    }
+
+
+   /* public void initializeElements(int initialCount, int rowCount, int columnCount) {
+        this.rowCount=rowCount;
+        this.columnCount=columnCount;
+        initializeElements(initialCount);
+    }*/
+
+    public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) {
+        this.rowCount=rowCount;
+        this.columnCount=columnCount;
+        fireFightersPositions = new ArrayList<>();
+        for (int index = 0; index < initialFirefighterCount; index++)
+            fireFightersPositions.add(randomPosition());
+    }
+
+    @Override
+    public Position randomPosition() {
+        if (rowCount <= 0 || columnCount <= 0) {
+            throw new IllegalArgumentException("Les limites doivent ĂȘtre positives");
+        }
+        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+
+    }
+    private List<Position> neighbors(Position position) {
+        List<Position> list = new ArrayList<>();
+        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
+        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
+        if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
+        if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
+        return list;
+    }
+    public List<Position> updateFirefighters(Set<Position> firePositions) {
+        List<Position> result = new ArrayList<>();
+        List<Position> firefighterNewPositions = new ArrayList<>();
+        for (Position firefighterPosition : fireFightersPositions) {
+            Position newFirefighterPosition = neighborClosestToFire(firefighterPosition,firePositions);
+            firefighterNewPositions.add(newFirefighterPosition);
+            extinguish(newFirefighterPosition, firePositions);
+            result.add(firefighterPosition);
+            result.add(newFirefighterPosition);
+            List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
+                    .filter(firePositions::contains).toList();
+            for(Position firePosition : neighborFirePositions)
+                extinguish(firePosition,firePositions);
+            result.addAll(neighborFirePositions);
+        }
+        fireFightersPositions = firefighterNewPositions;
+        return result;
+    }
+
+    private void extinguish(Position position,Set<Position> firePositions ) {
+        firePositions.remove(position);
+    }
+
+    private Position neighborClosestToFire(Position position, Set<Position> firePositions) {
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>(neighbors(position));
+        for (Position initialMove : toVisit)
+            firstMove.put(initialMove, initialMove);
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            if (firePositions.contains(current))
+                return firstMove.get(current);
+            for (Position adjacent : neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
+        return position;
+    }
+
+
+}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 97abb90..bbab296 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -10,10 +10,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int rowCount;
   private final int initialFireCount;
   private final int initialFirefighterCount;
-  private List<Position> firefighterPositions;
-  private Set<Position> firePositions;
+
+  private Fires fires;
+  private FireFighters fireFighters;
+
   private int step = 0;
-  private final Random randomGenerator = new Random();
 
   public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
     this.columnCount = columnCount;
@@ -24,26 +25,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   }
 
   public void initializeElements() {
-    firefighterPositions = new ArrayList<>();
-    firePositions = new HashSet<>();
-    for (int index = 0; index < initialFireCount; index++)
-      firePositions.add(randomPosition());
-    for (int index = 0; index < initialFirefighterCount; index++)
-      firefighterPositions.add(randomPosition());
-  }
+    this.fires = new Fires();
+    this.fireFighters = new FireFighters();
+    fires.initializeElements(initialFireCount,rowCount,columnCount);
+    fireFighters.initializeElements(initialFirefighterCount,rowCount,columnCount);
 
-  private Position randomPosition() {
-    return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
   }
 
   @Override
   public List<ModelElement> getState(Position position) {
     List<ModelElement> result = new ArrayList<>();
-    for(Position firefighterPosition : firefighterPositions)
+    for(Position firefighterPosition : fireFighters.getFireFightersPositions())
       if (firefighterPosition.equals(position))
-        result.add(ModelElement.FIREFIGHTER);
-    if(firePositions.contains(position))
-      result.add(ModelElement.FIRE);
+        result.add(new FireFighters());
+    if(fires.getFirePositions().contains(position))
+      result.add(new Fires());
     return result;
   }
 
@@ -58,24 +54,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   }
 
   public List<Position> updateToNextGeneration() {
-    List<Position> modifiedPositions = updateFirefighters();
-    modifiedPositions.addAll(updateFires());
-    step++;
-    return modifiedPositions;
-  }
-
-  private List<Position> updateFires() {
-    List<Position> modifiedPositions = new ArrayList<>();
-    if (step % 2 == 0) {
-      List<Position> newFirePositions = new ArrayList<>();
-      for (Position fire : firePositions) {
-        newFirePositions.addAll(neighbors(fire));
-      }
-      firePositions.addAll(newFirePositions);
-      modifiedPositions.addAll(newFirePositions);
-    }
-    return modifiedPositions;
-
+    List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions());
+    result.addAll(fires.updateFires());
+    //step ++;
+    fires.incrementStep();
+    return result;
   }
 
   @Override
@@ -83,24 +66,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return step;
   }
 
-  private List<Position> updateFirefighters() {
-    List<Position> modifiedPosition = new ArrayList<>();
-    List<Position> firefighterNewPositions = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions) {
-      Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
-      firefighterNewPositions.add(newFirefighterPosition);
-      extinguish(newFirefighterPosition);
-      modifiedPosition.add(firefighterPosition);
-      modifiedPosition.add(newFirefighterPosition);
-      List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
-              .filter(firePositions::contains).toList();
-      for(Position firePosition : neighborFirePositions)
-        extinguish(firePosition);
-      modifiedPosition.addAll(neighborFirePositions);
-    }
-    firefighterPositions = firefighterNewPositions;
-    return modifiedPosition;
-  }
 
   @Override
   public void reset() {
@@ -108,50 +73,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     initializeElements();
   }
 
-  private void extinguish(Position position) {
-    firePositions.remove(position);
-  }
-
-  private List<Position> neighbors(Position position) {
-    List<Position> list = new ArrayList<>();
-    if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-    if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-    if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
-    if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
-    return list;
-  }
-
-  private Position neighborClosestToFire(Position position) {
-    Set<Position> seen = new HashSet<>();
-    HashMap<Position, Position> firstMove = new HashMap<>();
-    Queue<Position> toVisit = new LinkedList<>(neighbors(position));
-    for (Position initialMove : toVisit)
-      firstMove.put(initialMove, initialMove);
-    while (!toVisit.isEmpty()) {
-      Position current = toVisit.poll();
-      if (firePositions.contains(current))
-        return firstMove.get(current);
-      for (Position adjacent : neighbors(current)) {
-        if (seen.contains(adjacent)) continue;
-        toVisit.add(adjacent);
-        seen.add(adjacent);
-        firstMove.put(adjacent, firstMove.get(current));
-      }
-    }
-    return position;
-  }
-
   @Override
   public void setState(List<ModelElement> state, Position position) {
-    firePositions.remove(position);
+    fires.extinguish(position);
     for (;;) {
-      if (!firefighterPositions.remove(position)) break;
+      if (!fireFighters.getFireFightersPositions().remove(position)) break;
     }
+
     for(ModelElement element : state){
-      switch (element){
-        case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
+      if (element instanceof Fires){
+        fires.add(position);
+      }
+      if (element instanceof FireFighters){
+        fireFighters.add(position);
       }
     }
+
   }
 }
\ No newline at end of file
diff --git a/src/main/java/model/Fires.java b/src/main/java/model/Fires.java
new file mode 100644
index 0000000..c7cee37
--- /dev/null
+++ b/src/main/java/model/Fires.java
@@ -0,0 +1,78 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+public class Fires implements ModelElement {
+
+    private Set<Position> firePositions;
+
+    private int step;
+    private int rowCount;
+    private int columnCount;
+
+    private final Random randomGenerator = new Random();
+
+    public Fires() {
+    }
+
+    public void add(Position newPositions){
+        firePositions.add(newPositions);
+    }
+
+    public Set<Position> getFirePositions() {
+        return firePositions;
+    }
+
+    public List<Position> updateFires() {
+        List<Position> result = new ArrayList<>();
+        if (step % 2 == 0) {
+            List<Position> newFirePositions = new ArrayList<>();
+            for (Position fire : firePositions) {
+                newFirePositions.addAll(neighbors(fire, fire.row(), fire.column()));
+            }
+            firePositions.addAll(newFirePositions);
+            result.addAll(newFirePositions);
+        }
+        return result;
+
+    }
+
+    public void incrementStep(){
+        this.step ++;
+    }
+
+    public void initializeElements(int initialFireCount, int rowCount, int columnCount) {
+        //this.step=step;
+        this.columnCount = columnCount;
+        this.rowCount = rowCount;
+        firePositions = new HashSet<>();
+        for (int index = 0; index < initialFireCount; index++)
+            firePositions.add(randomPosition());
+    }
+
+    @Override
+    public Position randomPosition() {
+        if (rowCount <= 0 || columnCount <= 0) {
+            throw new IllegalArgumentException("Les limites doivent ĂȘtre positives");
+        }
+
+        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+
+    }
+
+    public void extinguish(Position position) {
+        firePositions.remove(position);
+    }
+
+    private List<Position> neighbors(Position position, int rowCount, int columnCount) {
+        List<Position> list = new ArrayList<>();
+        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
+        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
+        if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
+        if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
+        return list;
+    }
+}
+
diff --git a/src/main/java/model/ICLOUD.java b/src/main/java/model/ICLOUD.java
new file mode 100644
index 0000000..cb38b62
--- /dev/null
+++ b/src/main/java/model/ICLOUD.java
@@ -0,0 +1,5 @@
+package model;
+
+public class ICLOUD {
+
+}
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 759eee5..1023ca9 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -1,5 +1,9 @@
 package model;
 
-public enum ModelElement {
-  FIREFIGHTER, FIRE
+import util.Position;
+
+import java.util.List;
+
+public interface ModelElement {
+    Position randomPosition();
 }
-- 
GitLab