banillie / analysis_engine

Place for all code used to compile the quarterly PfM Report, manage GMPP data, as well as other useful data searching/analysis functions.
MIT License
2 stars 2 forks source link

avoiding lengthy if/elif/else loops #16

Closed banillie closed 3 years ago

banillie commented 3 years ago

@yulqen how are you? Hope you have a good break.

I'm running into some very long and tedious if/elif/else loops as a means with layering in all the different options available to the user via the command line for analysis_engine. This is because some of the analysis needs multiple different optional arguments. For example this is what a command for milestones analysis could look like analysis milestones --stage "FBC" --quarters "Q3 20/21" --dates "1/1/2021" "1/1/2022" --type "Delivery" --chart "show" --title "FBC schedule 2021/22".

The if/elif/else loop for this currently looks like this:

        if args["baselines"] and args["stage"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, group=args["stage"], baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["baselines"] and args["group"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, group=args["group"], baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["baselines"] and args["stage"] and args["dates"]:
            ms = MilestoneData(m, group=args["stage"], baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["baselines"] and args["group"] and args["dates"]:
            ms = MilestoneData(m, group=args["group"], baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["baselines"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["baselines"] and args["group"] and args["type"]:
            ms = MilestoneData(m, group=args["group"], baseline=args["baselines"])
            ms.filter_chart_info(type=args["type"])

        elif args["baselines"] and args["stage"] and args["type"]:
            ms = MilestoneData(m, group=args["stage"], baseline=args["baselines"])
            ms.filter_chart_info(type=args["type"])

        elif args["baselines"] and args["dates"]:
            ms = MilestoneData(m, baseline=args["baselines"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["baselines"] and args["type"]:
            ms = MilestoneData(m, baseline=args["baselines"])
            ms.filter_chart_info(type=args["type"])

        elif args["baselines"] and args["group"]:
            ms = MilestoneData(m, group=args["group"], baseline=args["baselines"])

        elif args["baselines"] and args["stage"]:
            ms = MilestoneData(m, group=args["stage"], baseline=args["baselines"])

        elif args["baselines"]:
            ms = MilestoneData(m, baseline=args["baselines"])

        # quarters
        elif args["quarters"] and args["stage"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, group=args["stage"], quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["quarters"] and args["group"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, group=args["group"], quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["quarters"] and args["stage"] and args["dates"]:
            ms = MilestoneData(m, group=args["stage"], quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["quarters"] and args["stage"] and args["type"]:
            ms = MilestoneData(m, group=args["stage"], quarter=args["quarters"])
            ms.filter_chart_info(type=args["type"])

        elif args["quarters"] and args["group"] and args["dates"]:
            ms = MilestoneData(m, group=args["group"], quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["quarters"] and args["group"] and args["type"]:
            ms = MilestoneData(m, group=args["group"], quarter=args["quarters"])
            ms.filter_chart_info(type=args["type"])

        elif args["quarters"] and args["dates"] and args["type"]:
            ms = MilestoneData(m, quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"], type=args["type"])

        elif args["quarters"] and args["type"]:
            ms = MilestoneData(m, quarter=args["quarters"])
            ms.filter_chart_info(dates=args["type"])

        elif args["quarters"] and args["dates"]:
            ms = MilestoneData(m, quarter=args["quarters"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["quarters"] and args["group"]:
            ms = MilestoneData(m, group=args["group"], quarter=args["quarters"])

        elif args["quarters"] and args["stage"]:
            ms = MilestoneData(m, group=args["stage"], quarter=args["quarters"])

        elif args["quarters"]:
            ms = MilestoneData(m, quarter=args["quarters"])

        # dates
        elif args["dates"] and args["group"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["group"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["dates"] and args["stage"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["stage"])
            ms.filter_chart_info(dates=args["dates"])

        elif args["type"] and args["stage"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["stage"])
            ms.filter_chart_info(type=args["type"])

        elif args["type"] and args["group"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["group"])
            ms.filter_chart_info(type=args["type"])

        elif args["type"]:
            ms = MilestoneData(m, quarter=["standard"])
            ms.filter_chart_info(dates=args["type"])
        elif args["dates"]:
            ms = MilestoneData(m, quarter=["standard"])
            ms.filter_chart_info(dates=args["dates"])
        elif args["group"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["group"])
        elif args["stage"]:
            ms = MilestoneData(m, quarter=["standard"], group=args["stage"])

        else:
            ms = MilestoneData(m, quarter=["standard"])

Grateful for your advice on how this code could be refactored. Cheers, Will.

yulqen commented 3 years ago

Common problem! To be honest, on first look I doesn't look that bad, but I see why it's painful. You could look at adding another or more subcommands, maybe. You probably just need a handler function of some kind that dispatches based on a single param. Few ways to do it dude. Will get in touch this week Will - on study leave this week.

banillie commented 3 years ago

Cheers dude. Hope the study leave isn't too hard!

banillie commented 3 years ago

Managed to resolve this via packaging all arguments into a dictionary op_args and then unpacking that dictionary as kwargs into each class / function via **op_args. This enabled me to delete many many many lines of code.