I am reading the Clean Code book and trying refactoring my source code according to the principles single level of abstraction/separation of concerns.How would you refactor the following code? I am interested in the details like:How would you separate the abstraction levels?How many classes would you create?How would you name the new classes?How would maybe rename the existing class?Other things...?TConditionsUtils = class(TObject)public  function GetPolungType(const APolung: String): TPolung;  function GetPolungTypeName(const APolungType: TPolung): String;  function GetPolungTypeOfCondition(const AConditionName: String; const AConditions: IGenericList<ICondition>): TPolung;  function GetPolungTypeNameOfCondition(const AConditionName: String; const AConditions: IGenericList<ICondition>): String;  function GetBoardType(const ABoardType: String): TBoardType;  function GetBoardTypeName(const ABoardType: TBoardType): String;  function GetBoardTypeOfCondition(const AConditionName: String; const AConditions: IGenericList<ICondition>): TBoardType;  function GetBoardTypeNameOfCondition(const AConditionName: String; const AConditions: IGenericList<ICondition>): String;end;For more understanding what the functions do you can check the following code:literals beginning with c_ are text constantsTBoardType and TPolung are enumerated typesThe defined functions are doing nothing else determining from a text a datatype and vice versaThe function GetPolungTypeNameOfCondition and GetBoardTypeOfCondition search for a conditionname in the list and return either a name of the type or an enumarated typeTBoardType = (bt_Unknown = 0, bt_D = 1, bt_K = 2, bt_L = 3, bt_HP = 4);TPolung = (pUnknown = 0, pCommon_N = 1, pCommon_P = 2);function TConditionsUtils.GetPolungType(const APolung: String): TPolung;begin  if SameText(APolung, c_Polung_commonN) then    Result := pCommon_N  else if SameText(APolung, c_Polung_commonP) then    Result := pCommon_P  else    Result := pUnknown;end;function TConditionsUtils.GetPolungTypeName(const APolungType: TPolung): String;begin  case APolungType of    pCommon_N: Result := c_Polung_commonN;    pCommon_P: Result := c_Polung_commonP;  else    Result := c_Unknown;  end;end;    function TConditionsUtils.GetBoardType(const ABoardType: String): TBoardType;begin  if SameText(ABoardType, c_BoardType_D) then    Result := bt_D  else if SameText(ABoardType, c_BoardType_K) then    Result := bt_K  else if SameText(ABoardType, c_BoardType_L) then    Result := bt_L  else if SameText(ABoardType, c_BoardType_HP) then    Result := bt_HP  else    Result := bt_Unknown;end;    function TConditionsUtils.GetBoardTypeName(const ABoardType: TBoardType): String;begin  case ABoardType of    bt_D: Result := c_BoardType_D;    bt_K: Result := c_BoardType_K;    bt_L: Result := c_BoardType_L;    bt_HP: Result := c_BoardType_HP;  else    Result := '';  end;end;
Single level of abstraction
delphi;object pascal