From 55ad66f85c0b59154242d251249c6eeba7e09cae Mon Sep 17 00:00:00 2001
From: Kai Renz <kai.renz@h-da.de>
Date: Fri, 3 Nov 2023 09:53:28 +0100
Subject: [PATCH] Feature: Solution

One possible solution to the
refactoring challenge.
Renamed and removed variables.
Extracted functions.
Try to have one purpose for each function.
---
 CMakeLists.txt      |  4 +--
 RefactoringDemo.cpp | 75 ++++++++++++++++++++++++++++++---------------
 main.cpp            |  3 ++
 3 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2341c0f..0507f6d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.16)
-project(OOAD_Refactoring_Demo)
+project(02-ifm1-refactoring)
 
 set(CMAKE_CXX_STANDARD 14)
 
-add_executable(OOAD_Refactoring_Demo main.cpp)
+add_executable(02-ifm1-refactoring main.cpp)
diff --git a/RefactoringDemo.cpp b/RefactoringDemo.cpp
index 88352fb..f433309 100644
--- a/RefactoringDemo.cpp
+++ b/RefactoringDemo.cpp
@@ -7,29 +7,56 @@ using namespace std;
 #include "DummyCode.cpp"
 /* End of code to be ignored */
 
-void pruefeRezepte(VorhandeneZutaten VZ){
-    int i, j, k;
-    bool da;
-    for (i=0; i<getAnzahlRezepte(); i++){
-        Rezept* r = getRezept(i);
-        cout << i << ". " << r->getRezeptName() << ": ";
-        da=true;
-        for (j = 0; j < r->getAnzahlRezeptZutaten(); j++) {
-            string z = r->getZutat(j);
-            bool OK= false;
-            for (k=0; k<VZ.getAnzahlZutaten();k++){
-                if (z==VZ.getVorhandeneZutat(k)){
-                    OK= true;
-                    break;
-                }
-            }
-            if (OK== false) {
-                da = false;
-                break;
-            }
+bool istZutatVorhanden(VorhandeneZutaten &vorhandeneZutaten, const string &zutat);
+bool sindAlleZutatenVorhanden(VorhandeneZutaten &vorhandeneZutaten, Rezept *rezept);
+
+void ausgabeRezept(int rezeptNummer, std::string name);
+void ausgabeResultat(std::string result);
+
+void pruefeRezept(VorhandeneZutaten &vorhandeneZutaten, int i);
+
+// This is the original function that has been refactored:
+void pruefeRezepte(VorhandeneZutaten vorhandeneZutaten){
+    for (int i=0; i<getAnzahlRezepte(); i++){
+        pruefeRezept(vorhandeneZutaten, i);
+    }
+}
+
+void pruefeRezept(VorhandeneZutaten &vorhandeneZutaten, int i) {
+    Rezept* rezept = getRezept(i);
+
+    ausgabeRezept(i,rezept->getRezeptName());
+
+    if (sindAlleZutatenVorhanden(vorhandeneZutaten, rezept)) {
+        ausgabeResultat(" mischbar!");
+    }
+    else {
+        ausgabeResultat(" nicht mischbar!");
+    }
+}
+
+
+void ausgabeRezept(int rezeptNummer, std::string name) {
+    cout << rezeptNummer << ". " << name << ": ";
+}
+void ausgabeResultat(std::string result) {
+    cout << result << endl;
+}
+bool sindAlleZutatenVorhanden(VorhandeneZutaten &vorhandeneZutaten, Rezept *rezept) {
+    for (int j = 0; j < rezept->getAnzahlRezeptZutaten(); j++) {
+        string zutat = rezept->getZutat(j);
+        if (!istZutatVorhanden(vorhandeneZutaten, zutat)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool istZutatVorhanden(VorhandeneZutaten &vorhandeneZutaten, const string &zutat) {
+    for (int k=0; k < vorhandeneZutaten.getAnzahlZutaten(); k++){
+        if (zutat == vorhandeneZutaten.getVorhandeneZutat(k)){
+            return true;
         }
-        if (da == true) {
-            cout << " mischbar\n"; }
-        else {	cout << " nicht mischbar!\n"; }
     }
-}
\ No newline at end of file
+    return false;
+}
diff --git a/main.cpp b/main.cpp
index 6b29d17..9620d1d 100644
--- a/main.cpp
+++ b/main.cpp
@@ -5,5 +5,8 @@
 int main() {
     std::cout << "This is the Refactoring Demo!" << std::endl;
 
+    VorhandeneZutaten vorhandeneZutaten;
+    pruefeRezepte(vorhandeneZutaten);
+
     return 0;
 }
-- 
GitLab