That made so much sense.
So, looking carefully at which methods called which, I started mapping them out with used draw.
io, and ended up with this:Each box contains a method or input.
I decided to color them by class, so I could more easily intuit which methods were causing problems.
The green ones are from my CLI class; the orange ones are from my Scraper class and the yellow ones are from my Mission class.
The chart took a few hours to make because as I built it and saw the connections between the methods, I’d notice areas for improvement and make changes accordingly.
By the time I finished the chart, my flow was still broken, but I could easily see why: I was using the same method, #display_missions, to give the user the results of a new search and a refined search.
It’s a best practice to write code in an abstract way so it can be re-used.
But my method was not entirely abstract.
In addition to displaying search results ( that part *was* abstract), it included specific instructions for next steps for the user: namely, pick a mission number or refine your search.
I wanted to give users both options for new searches only, and just the pick-a-number option for refined searches.
The chart quickly showed me what days of testing could not make plain: all first-time searches results started with the method that’s now called #new_search on the chart (it used to be called #list_missions).
All refined searches started with #search_results.
All I had to do was remove the user prompts from the #display_missions method.
Then I used the newly-named #new_search method to call #display_missions, and then offer the options of picking a mission from that list, or doing a refined search.
Finally, I used the #select_missions method to call #display_missions and then offer only the option of picking a mission number.
After I did that, I tested again and … my CLI flow was finally fixed!I still have a project with more features than are necessary.
Luckily, if that’s a bad thing, I can easily use Github to revert back to the version that existed before I started adding features.