On scratch paper, answer the following questions: a. When we study inheritance, it seems like a potentially magical and far-reaching solution. But as we learn more about it and study other approaches, it becomes clear that interfaces are far more important and prevalent in programming. Explain why that is the case, citing at least three major reasons. b. Why are unit tests so important as a part of our deliverables as programmers? What are the key things that unit tests must report to us? What foundation for writing programmatic annotations and methods provide the foundation for writing programmatic tests using JUnit? Is having passing unit tests guarantee that software is bug free? Why or why not (give at least two reasons)? c. Define the terms "Tree, " "Binary Tree, " and "Binary Search Tree". What advantages does a BST provide, when it comes to adding node or searching for that is present or absent (be as technical as possible with your answer)? d. A friend of yours has taken an introductory programming class. She tells you she's heard event-driven programming, but doesn't know what it means or how it works. Define for her and the term for her and tell her how it is different from what she's done in the past. e. Define the term "Design Pattern". Why is it important that we study Design Patterns (give at least two reasons)? What three patterns did we discuss this quarter, either in detail or at a high level? f. List and describe the major components in the MVC approach. What is the major difference between the pure MVC model and the one we used in our Fractal project? g. Define the terms "Stack" and "Queue." What are the mnemonic acronyms associated with each. Say what each letter stands for. h. Fill in the table with the Big O Notation for time and space each of algorithms we've covered or complexity of the sorting reviewed