I have a set of `if`/`else` statements that trigger certain actions. As a first step, I was thinking about moving the logic in each `if` statement to be its own function, but are there any recommendations on what design patterns can help clean this code up? I guess I am trying to see if there is a cleaner way to determine what the next action/command should be based on a set of criteria. I see people recommend the Command pattern, but how does one abstract the logic in the `if`-statement to begin with? function WaterRetriever(largeBucketSize, smallBucketSize, waterSize) { var buckets = {}; if (waterSize > largeBucketSize) { throw new Error("The buckets are not large enough."); } buckets.firstContainer = new Bucket(largeBucketSize); buckets.secondContainer = new Bucket(smallBucketSize); this.getWaterFromLake = function () { var maxSteps = 25, step = 1; buckets.firstContainer.fill(); while (step <= maxSteps && buckets.firstContainer.getCurrentAmount() !== waterSize) { if (buckets.firstContainer.isFull() && buckets.secondContainer.isEmpty()) { buckets.firstContainer.transferTo(buckets.secondContainer); } else if (buckets.secondContainer.isFull() && buckets.firstContainer.hasCapacityAvailable()) { buckets.secondContainer.empty(); buckets.firstContainer.transferTo(buckets.secondContainer); } else if (buckets.firstContainer.isEmpty() && buckets.secondContainer.hasCapacityAvailable()) { buckets.firstContainer.fill(); } else if (buckets.firstContainer.isFull() && buckets.secondContainer.hasCapacityAvailable()) { buckets.firstContainer.transferTo(buckets.secondContainer); } console.log(buckets.firstContainer.getCurrentAmount() + ", " + buckets.secondContainer.getCurrentAmount()); step = step + 1; } if (step > maxSteps) { console.log("could not find a solution within the steps limit..."); } }; }