diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index 32244d7..ee4f7d0 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -7,7 +7,7 @@
 #include <sensor.hpp>
 
 static constexpr bool DEBUG = false;
-constexpr size_t MAX_THRESHOLDS = 4;
+static constexpr size_t maxThresholds = 4;
 
 namespace variant_ns = sdbusplus::message::variant_ns;
 namespace thresholds
@@ -50,7 +50,7 @@
     }
 }
 
-bool ParseThresholdsFromConfig(
+bool parseThresholdsFromConfig(
     const SensorData &sensorData,
     std::vector<thresholds::Threshold> &thresholdVector,
     const std::string *matchLabel)
@@ -112,7 +112,7 @@
                       const thresholds::Threshold &threshold,
                       std::shared_ptr<sdbusplus::asio::connection> &conn)
 {
-    for (int ii = 0; ii < MAX_THRESHOLDS; ii++)
+    for (int ii = 0; ii < maxThresholds; ii++)
     {
         std::string thresholdInterface =
             baseInterface + ".Thresholds" + std::to_string(ii);
@@ -155,11 +155,10 @@
                                       << "\n";
                         }
                     },
-                    ENTITY_MANAGER_NAME, path,
-                    "org.freedesktop.DBus.Properties", "Set",
-                    thresholdInterface, "Value", value);
+                    entityManagerName, path, "org.freedesktop.DBus.Properties",
+                    "Set", thresholdInterface, "Value", value);
             },
-            ENTITY_MANAGER_NAME, path, "org.freedesktop.DBus.Properties",
+            entityManagerName, path, "org.freedesktop.DBus.Properties",
             "GetAll", thresholdInterface);
     }
 }
@@ -249,62 +248,78 @@
     interface->set_property(property, assert);
 }
 
-static constexpr std::array<const char *, 4> ATTR_TYPES = {"lcrit", "min",
-                                                           "max", "crit"};
+static constexpr std::array<const char *, 4> attrTypes = {"lcrit", "min", "max",
+                                                          "crit"};
 
-bool ParseThresholdsFromAttr(
-    std::vector<thresholds::Threshold> &threshold_vector,
-    const std::string &input_path, const double &scale_factor)
+bool parseThresholdsFromAttr(
+    std::vector<thresholds::Threshold> &thresholdVector,
+    const std::string &inputPath, const double &scaleFactor)
 {
-    for (auto &type : ATTR_TYPES)
+    for (auto &type : attrTypes)
     {
-        auto attr_path = boost::replace_all_copy(input_path, "input", type);
-        std::ifstream attr_file(attr_path);
-        if (!attr_file.good())
+        auto attrPath = boost::replace_all_copy(inputPath, "input", type);
+        std::ifstream attrFile(attrPath);
+        if (!attrFile.good())
+        {
             continue;
+        }
         std::string attr;
-        std::getline(attr_file, attr);
-        attr_file.close();
+        std::getline(attrFile, attr);
+        attrFile.close();
 
         Level level;
         Direction direction;
-        double val = std::stod(attr) / scale_factor;
+        double val = std::stod(attr) / scaleFactor;
         if (type == "min" || type == "max")
+        {
             level = Level::WARNING;
+        }
         else
+        {
             level = Level::CRITICAL;
+        }
         if (type == "min" || type == "lcrit")
+        {
             direction = Direction::LOW;
+        }
         else
+        {
             direction = Direction::HIGH;
+        }
 
         if (DEBUG)
-            std::cout << "Threshold: " << attr_path << ": " << val << "\n";
+        {
+            std::cout << "Threshold: " << attrPath << ": " << val << "\n";
+        }
 
-        threshold_vector.emplace_back(level, direction, val);
+        thresholdVector.emplace_back(level, direction, val);
     }
     // no thresholds is allowed, not an error so return true always
     return true;
 }
 
-bool HasCriticalInterface(
-    const std::vector<thresholds::Threshold> &threshold_vector)
+bool hasCriticalInterface(
+    const std::vector<thresholds::Threshold> &thresholdVector)
 {
-    for (auto &threshold : threshold_vector)
+    for (auto &threshold : thresholdVector)
     {
         if (threshold.level == Level::CRITICAL)
+        {
             return true;
+        }
     }
     return false;
 }
 
-bool HasWarningInterface(
-    const std::vector<thresholds::Threshold> &threshold_vector)
+bool hasWarningInterface(
+    const std::vector<thresholds::Threshold> &thresholdVector)
 {
-    for (auto &threshold : threshold_vector)
+    for (auto &threshold : thresholdVector)
     {
         if (threshold.level == Level::WARNING)
+        {
             return true;
+        }
     }
     return false;
 }
