This is the summary of what we discussed during our last lecture.
There are three main questions that we have to answer with regard to OOP. Why OOP is needed? What are other options we have? And what is the importance of learning OOP?
Software is inherently complex. There are many reasons for software to be increasingly complex.
1. Complex and unique problem domain
Software is developed to cater the needs of different kinds of fields. Most of the times there systems are one of a kind. When developing such systems software engineers first have to understand the detailed nature of the problem domain. These problem domains are very complex and rapidly changing. So understanding them is not an easy task at all. Most of the times when a software engineer moves from one project to another, they have to learn about that new problem domain. Given the capacity of human learning this is a very challenging thing.
Other Issue with this kind of complex problem domains is that you can’t understand what the problem is until you find the solution. So until then you can’t identify the issues with it.
2. Contradictory requirements
It is very difficult to extract the correct requirements of the system from the users. Most of the times users also don’t know what exactly they need.
Flexibility is a great feature of software systems and also a feature that makes it more complex. Because of the flexibility while the project is going on users ask many new features, do changes to existing requirements, drop features, etc… In this kind of scenario change management is very important, otherwise we may not know what exactly the software is doing. And also if the system is not designed properly, when we try to add or change features it will introduce new bugs.
As software engineers our job is to hide this complexity from the users and give them an illusion of simplicity.
4. Intangible nature of the final product
Software products are intangible. When we do a software product we can’t see the progress of it as with other engineering disciplines like civil, mechanical, etc…
By using good Object Oriented Analysis, Design and Programming principles we can reduce the impact of above problems and develop better maintainable and extendable software.
Attributes of Complex Systems
Complex systems are made out of hierarchical collection of components. These components are linked together through inter and intra component linkages. In order to understand the system properly we have to understand these hierarchical subsystems first.
There are only few types of basic subsystems available in any complex system. We reuse those basic components to build complex systems.
This hierarchical nature can be of two types “Is-a” or “Part-of”.
Another main feature of complex system is that they do not develop overnight, rather they evolve over time.
This hierarchical nature of complex systems allows us to modularize the development process. So we can employ divide and conquer strategy to develop the project. Another advantage of modularization is that it allows us to understand the system better. In large complex systems no one person can fully understand it. But when we divide that in to small modules one person can have better understanding of that part.
Few Key Words
1. Object Oriented Analysis
2. Object Oriented Design
OOD is about developing an object oriented model of a software system to implement the identified requirements.
We reduce the information and create a generalized model by only keeping the information relevant to particular purpose. For example we can consider things like animal, furniture, food, book, vehicle as abstractions. Abstraction is a concept, we can’t initialize them. Our levels of abstraction vary depending on the purpose. Finding correct level of abstraction is an important design decision.
Is the process of wrapping functionality and data together in to one unit. This is a way of information hiding. Through this method internal working of methods are hidden and only an interface (API) is presented to the users to work with. So if any changes to be done to the functionality or data in the class they can be done without affecting other components in the system.
By, M.A.C.Sandarenu 044034A