Table-driven Programming

You can use if statements to run a function when the state of your application matches specific criteria. However, if statements don't scale as they are hard to understand and maintain: ```python if state_x and state_y and state_z: do_xyz() if state_x and state_z: do_xz() if state_x and state_y and not state_z: do_xy_not_z() ``` Table-driven programming is an alternative that sometimes is easier to maintain: ```python rules = ( # x, y, z, function (True, True, True, do_xyz), (True, True, False, do_xy_not_z), (True, False, True, do_xz), (True, True, True, do_xz), ) for rule in rules: rule_x = rule[0] rule_y = rule[1] rule_z = rule[2] doit = rule[3] if rule_x == state_x and rule_y == state_y and rule_z == state_z: doit() else: print("Skipping") ``` Or, more succinctly: ```python def matching_rules(rules, params): for criterion, func in rules: if all(params[ix] == criteria for ix, criteria in enumerate(criterion)): yield func # The table of rules rules = ( # x, y, z, function ((True, True, True), do_xyz), ((True, True, False), do_xy_not_z), ((True, False, True), do_xz), (True, True, True, do_xz), ) params = (state_x, state_y, state_z) for func in matching_rules(rules, params): func() ``` In summary, a function is run only when the criteria match. Pattern matching is also an alternative: https://www.python.org/dev/peps/pep-0635/ However, the first-to-match rule requires the order to be correct and prevents multiple function calls. State machines and Prolog are also options...