프로그래밍을 하는 방식에 있어 존재하는 트렌드를 살펴본다.
어떤 방식의 프로그래밍이 있을까?
순차지향프로그래밍 : 위에서 아래로 순서대로 실행
이를 지향하는 대표적인 언어로는 어셈블리어가 있다.
add:
subq $8, %rsp
leaq 16(%rsp), %rax
movq %rax, 0(%rsp)
leal 0(%edi,%esi,1), %eax
addq $8, %rsp
ret
main:
subq $8, %rsp
leaq 16(%rsp), %rax
movq %rax, 0(%rsp)
movl $2, %edi
movl $3, %esi
addq $8, %rsp
jmp add
절차지향프로그래밍 | 함수형 프로그래밍 : 함수실행흐름을 중심으로 실행
이를 지향하는 대표적인 언어로 C언어나 하스켈이 있다.
아래 코드는 위의 어셈블리어를 함수형으로 바꾼것으로 논리적으로 동치이다.
int add(int a, int b){
return a + b;
}
int main() {
int a = 2;
int b = 3;
return add(a, b);
}
객체지향 프로그래밍 : 프로그램의 전체 목적에 부합하는 책임을 객체별로 나눠 실행
각 알맞는 객체가 알맞는 책임을 가지고 있는지를 살펴야한다.
여기서 캡슐화 의 의미가 나타난다.
전체로직은 분산되었고, 협력 객체들의 내부동작이 어떤지는 알 수 없게 되므로써 내가 어떤 요청을 했을때 이 객체가 알아서 업무를 잘 처리하고 데이터를 잘 돌려줄 것이라고 믿는 것이다. 그래서 협력객체가 어떻게 일을하는지 신경쓰지 않는다.
이것이 바로 캡슐화!
프로젝트의 객체가 가진 책임을 나눠가져야 한다는 것이다.
그렇다면 객체가 책을 다하고 있는지는 어떻게 판단할까?
이때 필요한 개념이 테스트 코드 이다.
이는 추후에 살펴보려고 한다.
class RestaurantChain {
private List<Store> stores;
public long calculateRevenue() {
long revenue = 0;
for (Store store : stores) {
revenue += store.calculateRevenue();
}
return revenue;
}
}
class Store {
private List<Order> orders;
private long rentalFee; // 임대료
public long calculateRevenue() {
long revenue = 0;
for(Order order : orders){
revenue += order.calculateRevenue();
}
return revenue;
}
}
class Order {
private List<Food> foods;
private double transactionFeePercent = 0.03;
public long calculateRevenue() {
long revenue = 0;
for (Food food : foods) {
revenue += food.calculateRevenue();
}
return revenue;
}
}
class Food {
private long price;
private long originCost;
public long calculateRevenue(){
return price;
}
}
객체지향 프로그래밍을 해야한다고 하여 객체지향 언어를 쓰는 것만으로 그 패러다임을 따라간다고 볼수는 없다. 각각이 지향하는 바가 무엇인지를 알고, 목표에 맞게 설계를 해야한다.