# Object Orient Programming-Course1 Week1
###### tags: `OOP` `Coursera`
<style>
.red {
color: red;
}
</style>
<style>
.blue {
color: blue;
}
</style>
<style>
.green {
color: green;
}
</style>
# Four Design Principles
## 1 Abstraction
Abstraction is the idea of simplifying a concept in the problem domain to its essentials within some context.Abstraction allows you to better understand a concept by breaking it down into a simplified description that ignore unimportant details.
### Rule Of Least Astonishment
The abstraction captures the essential attributes and behavior for concept with no surprises and no definitions that fall beyond its scope.
**Context** or **Specific perspective** is critical when forming an abstraction.
Anything other than a concept's essential attributes and behaviors is irrelevant
Ex: Context is an **academic setting**
|.........|Essential |Irrelevant|
|---------|------------------------|----------|
|Concept |Student |Student |
|Attribute|courses currently taking|has a cat |
|Behavior |Study, doing assignment |cooking |
Ex: Context is **Modeling student from social perspective**
|.........|Essential |Irrelevant|
|---------|---------------------------|----------|
|Concept |Student |Student |
|Attribute|Student group belongs to |has a cat |
|Behavior |Hold an activity for groups|studying |
## 2 Encapsulation
### Three concept
1. Bundle attribute values or datas, behaviors or functions and manipulate those values together into a self-contained object.
2. Expose certain data and function
3. restrict access to certain data and functions to only within that object.
### Getter method
Getter methods are methods that retrieve data(usually private)
Typically named by "get + ${returned attribute name}"
### Setter method
Setter methods change data
Typically named by "set + ${target variable name}"
## 3 Decomposition
Decomposition is taking a whole thing and dividing it up into different parts. Or, on the flip side taking a bunch of separate parts with different functionalities, and combining them together to form a whole.
A **whole** might have a fixed or dynamic number of a certain type of **part**.
EX: Whole: refrigerator == decomposition==> Fixed part: one freezer, dynamic part: food item in it.
A **lifetime** of a part can be closely related or not so related to the whole.
EX: closely related: refrigerator to frezzer, car to engine(in most cases), not so related: refrigerator to food item, car to tire.
### three types of relationships found in decomposition
1. Association
2. Aggregation
3. Composition
### 3-1 Association
Association is **some** relationship. This means that there is a loose relationship between two objects. These objects may interact with each other for some time.
Ex:
```graphviz
digraph obj{
node[shape=record];
rankdir="BT";
Person [label = "{<f0> Person|<f1> \n |<f2> \n }"];
Airline [label = "{<f0> Airline|<f1> \n |<f2> \n }"];
Airline->Person [dir="forward",arrowhead="none",arrowtail="normal",headlabel="0..*",taillabel=" 0..*"];
}
```
The instance means that 0 to multiple persons can associate to 0 to multiple airlines.
### 3-2 Aggregation
Aggregation is a <span class = "red">week</span> "**has a**" relationship where a whole has parts that belong to it. The relationship is considered **week** as the parts can exist independently although it belongs to the whole.
EX:
```graphviz
digraph obj{
node[shape=record];
rankdir="BT";
Airlines [label = "{<f0> Airlines|<f1> \n |<f2> \n }"];
CrewMembers [label = "{<f0> CrewMembers|<f1> \n |<f2> \n }"];
CrewMembers->Airlines [dir="forward",arrowhead="odiamond",arrowtail="normal",headlabel="0..* ",taillabel=" 0..*"];
}
```
For an airline, the crew members are it's crucial part. We can state that airline **has a** crew members though it won't bother that crew members or airlines exist without each other.
### 3-3 Composition
Composition is an exclusive containment of parts, otherwise known as <span class = "red">strong</span> "**has a**" relationship. The parts can't exist without the whole, and the whole can't exist without the parts as well. **If the whole is destroyed, all its composition parts are too.**
EX: Rooms are parts of the house and should always exist with a house. Neither of them can't exist without each other.
```graphviz
digraph obj{
node[shape=record];
rankdir="BT";
House [label = "{<f0> House|<f1> \n |<f2> \n }"];
Room [label = "{<f0> Room|<f1> \n |<f2> \n }"];
Room->House [dir="forward",arrowhead="diamond",arrowtail="normal",headlabel=" ",taillabel=" 1..*"];
}
```
## 4 Generalization
Generalization may be defined as the technique of extracting the essential characteristics (these include attributes, properties and methods) from two or more subclasses and then combining them inside a generalized base class
technique: inheritance
what should be generalized: repeated, common, shared characteristic
### 4-1 Generalization with Inheritence
**The arrow in Inheritence is always pointing upward**
#### 4-1-1 General Form of Inheritence
```graphviz
digraph obj{
node[shape=record];
rankdir="BT";
Superclass [label = "{<f0> Superclass|<f1>Superclass attributes \n |<f2>Superclass methods \n }"];
Subclass [label = "{<f0> Subclass|<f1>Subclass attributes \n |<f2>Subclass methods \n }"];
Subclass->Superclass [dir="forward",arrowhead="onormal",arrowtail="normal",headlabel=" ",taillabel=" 1..*"];
}
```
The super classes are generalized classes and subclasses are specialized classes. Although <span class = "blue"> protected</span> attributes and methods in superclass are reachable for its subclasses, the subclasses should not take them as its attributes and methods.
#### 4-1-2 Example of Inheritence
EX:
```graphviz
digraph obj{
node[shape=record];
rankdir="BT";
Animal [label = "{<f0> Animal|<f1>#numberOfLegs:int \n#numberOfTails:int\n#name:string |<f2>+walk() \n+run()\n+eat() }"];
Dog [label = "{<f0> Dog|<f1>Subclass attributes \n |<f2>Subclass methods \n }"];
Dog->Animal [dir="forward",arrowhead="onormal",arrowtail="normal",headlabel=" ",taillabel=" 1..*"];
}
```
```java=
public abstract class Animal{
protected int numberOfLegs;
protected int numberOfTails;
protected string name;
public Animal(string _name, int _legs, int _tails)
{
this.numberOfLegs = legs;
this.numberOfTails = _tails;
this.name = _name;
}
public walk(){ ... }
public run(){ ... }
public eat(){ ... }
}
public class Dog extends Animail{
public Dog(string _name, int _legs, int _tails){
super(_name, _legs, _tails); //explicit constructor: which means the constructor must be called.
}
public walk(){
System.out.printIn("I'm a dog walking"); // override
}
}
```
Super class should have explicit constructor so that all the attribute can be initiaized when the class is instantiated.
A subclass's constructor should call its superclass's constructor if its superclass has explicit constructor.Otherwise, the superclass's attribute will not be appropriately initialized.
### 4-2 Generalization with Interface
* subtype: A class denotes a type for its objects. The type signifies what these objects can do through public methods. In modeling a problem, we may want to express subtyping relationships between two types. For example, we can have dog type as a subtype of animal type.
* Interface: An interface denote a subtype which only declares method signature, and no constructor, attribute or method body.
* When inherit an interface, all the methos signature in the interface must be explicity declared and implemented in the subclass.
#### 4-2-2