1. A method for generating a refactored code comprising: acquiring a code; identifying, using processing circuitry and based on a Markov decision process model, a refactoring sequence, wherein the refactoring sequence includes a plurality of refactoring steps to be applied to the code; wherein the Markov decision process model includes: identifying a plurality of states, each state representing a potential state of the code; identifying a plurality of actions, wherein each action corresponds to a refactoring step; determining transition probabilities using enumeration techniques wherein each transition probability represents the probability that the code transition from a current state to a subsequent state by taking an action from the plurality of actions that cause the transition to the subsequent state; determining a set of rewards, wherein each reward is associated with each of the transition probabilities, wherein determining each reward includes applying: r ⁡ ( s k , a k , s k + 1 ) = ∑ i = 1 L ⁢ ⁢ w i · v i where r is the reward for transitioning from state s k , to state s k+1 by taking action a k , w i is the weight of each utility function, wherein the utility function is based on software metrics and bad smell attributes; determining a refactoring policy that maximize a sum of rewards as a function of the plurality of states, the plurality of actions, the transition probabilities, and the set of rewards, wherein determining the refactoring policy includes applying: π * = arg ⁢ max π ⁢ E ⁡ [ ∑ k = 0 K ⁢ ⁢ r ⁡ ( s k , a k , s k + 1 ) | π ] where π is the refactoring policy, r is the reward for transitioning from state s k to state s k+1 by taking action a k , is the expected sum of rewards, and K is a predetermined number; and applying, using the processing circuitry, the plurality of refactoring steps according to the refactoring sequence to generate a refactored code.