자바스크립트 oop를 넘어 aop로
이 글을 어떻게 하면 객체지향을 넘어 관점지향 프로그래밍을 하는 방법에 대해서 기술한 것입니다.
우선 간단하게 객체지향에 대해서 알아보도록 하겠습니다.
객체지향프로그래밍은 영어로 Object-Oriented Programming 줄여서 OOP라고 합니다. 이것은 프로그래밍 패러다임의 일종으로써, 이전의 절차지향적 프로그래밍 이후에 나온 패러다임입니다. 간단하기 이야기 하자면 프로그래밍을 할때 주인공이 변경되었다라고 생각하시면 됩니다. 이전에는 함수(function)위주로 프로그래밍을 하였다면 이후에는 객체(object)위주로 프로그래밍을 한다는 의미 입니다.
즉 논리 보다는 다루고자 하는 객체라는 시각으로 접근하는 것입니다.
ex>
절차 지향적 프로그래밍
숫자+숫자-숫자을 계산하는 프로그램을 구현하시오.
function compute(a,b,c){
return a+b-c;
}
OOP관점에서는
obj = {
a: 0, b: 0, c: 0, init: function(a,b,c){ this.a = a; this.b=b; this.c=c}, compute: function(){return this.a + this.b - this.c
}
obj.init(숫자, 숫자, 숫자);
obj.compute();
두 패러다임에서 누가 옳고 그르다고 말할 수 없습니다. 프로그램의 규모가 작은 경우 즉 위와 같은 경우에는 확실이 절차지향 프로그램이 이점을 가지고 있습니다. 하지만 애플리케이션 단위로 프로그램이 크다면 객체지향 프로그램이 더욱 더 좋은 선택이 될 것입니다.
현재 자바스크립트 소스코드는 절차지향적 프로그래밍 되어 있는것들이 많이 있습니다.
그 이유는 아마도 자바스크립트로 되어 있는 프로그램의 대부분이 소규모인 경우가 많아서 그런것이라고 생각합니다.
하지만 점점 웹의 규모가 커지고 사용자의 웹에대한 욕구가 커지면서 자바스크립트는 소규모를 넘는 프로그램을 할 필요성이 점점 증가하고 있습니다. 이에 따라서 객체지향적인 프로그래밍을 할 필요성이 커지고 있습니다. 그렇다고 기존의 소스코드를 모두 삭제하고 처음부터 다시짜는건 시간적으로나 인력으로 큰 손실이 발생할 수 있습니다. 쉽고 간단하게 함수를 객체의 메소드로 바꿀 수 있다면 개발자가 부담없이 절차지향적 프로그램을 객체지향적 프로그램으로 손쉽게 리팩토링 할 수 있을 것입니다.
이와 같은 메소드를 prototype.js에서 제공하고 있어서 이를 공유합니다.
Function.prototype.methodize라는 함수가 있습니다.
예를 들어서
function setName (target, name) {
target.name = name;
}
이런 절차식 프로그래밍으로 작성된 코드가 있습니다.
이 코드를 객체지향의 메소드로 변경하려면
obj.setName = setName.methodize();
obj.setName('a');
>> obj.name === a
형태로 객체지향적인 프로그램을 할 수 있습니다.
여기서 한발작 더 나아가 현재는 관점 주도 프로그래밍에 대한 패러다임이 있습니다.
AOP라고 하는데 기초가 되는 개념은 관심의 분리 입니다. 모듈 구조를 잘 설계하여도 횡단 관심과 핵심 관심으로 나뉨니다. 횡단 관심은 모듈에서 공통적으로 나타나고 있는 부분 핵심 관심은 이 모듈만 특화적으로 가지고 있는 기능입니다.
횡단관심의 예로는 로그작성, 보안/인증, 트랜젝션, 리소스플링, 에러검사, 정책 적용, 멀티쓰레드 안전관리, 데이터 퍼시스턴스등입니다.
예를 들자서
function add(a,b){
숫자여부 판단 로직.
return a+b;
}
function minus(a,b){
숫자여부 판단 로직.
return a-b;
}
여기서 핵심 관심은 a+b, a-b이고 횡단 로직은 a,b가 숫자를 판단하는 로직입니다.
대부분의 소스코드에서 a,b에 각각 숫자 여부를 판단하는 로직을 수행하고 있지만 이를 분리하여 별도로 가져가는게 AOP입니다.
이에 관련된 함수가 prototypejs에서 Function.prototype.wrap입니다.
function coreAdd(a,b){
return a+b;
}
function coreMinus(a,b){
return a-b;
}
var vali = function (fn, a,b) {
if(a===null || b===null || typeof b === 'number' || typeof b=== 'number)
return null;
return fn(a,b)
}
var add = coreAdd.wrap (vali);
var minus = coreMinus.wrap(vali);
감사합니다.
우선 간단하게 객체지향에 대해서 알아보도록 하겠습니다.
객체지향프로그래밍은 영어로 Object-Oriented Programming 줄여서 OOP라고 합니다. 이것은 프로그래밍 패러다임의 일종으로써, 이전의 절차지향적 프로그래밍 이후에 나온 패러다임입니다. 간단하기 이야기 하자면 프로그래밍을 할때 주인공이 변경되었다라고 생각하시면 됩니다. 이전에는 함수(function)위주로 프로그래밍을 하였다면 이후에는 객체(object)위주로 프로그래밍을 한다는 의미 입니다.
즉 논리 보다는 다루고자 하는 객체라는 시각으로 접근하는 것입니다.
ex>
절차 지향적 프로그래밍
숫자+숫자-숫자을 계산하는 프로그램을 구현하시오.
function compute(a,b,c){
return a+b-c;
}
OOP관점에서는
obj = {
a: 0, b: 0, c: 0, init: function(a,b,c){ this.a = a; this.b=b; this.c=c}, compute: function(){return this.a + this.b - this.c
}
obj.init(숫자, 숫자, 숫자);
obj.compute();
두 패러다임에서 누가 옳고 그르다고 말할 수 없습니다. 프로그램의 규모가 작은 경우 즉 위와 같은 경우에는 확실이 절차지향 프로그램이 이점을 가지고 있습니다. 하지만 애플리케이션 단위로 프로그램이 크다면 객체지향 프로그램이 더욱 더 좋은 선택이 될 것입니다.
현재 자바스크립트 소스코드는 절차지향적 프로그래밍 되어 있는것들이 많이 있습니다.
그 이유는 아마도 자바스크립트로 되어 있는 프로그램의 대부분이 소규모인 경우가 많아서 그런것이라고 생각합니다.
하지만 점점 웹의 규모가 커지고 사용자의 웹에대한 욕구가 커지면서 자바스크립트는 소규모를 넘는 프로그램을 할 필요성이 점점 증가하고 있습니다. 이에 따라서 객체지향적인 프로그래밍을 할 필요성이 커지고 있습니다. 그렇다고 기존의 소스코드를 모두 삭제하고 처음부터 다시짜는건 시간적으로나 인력으로 큰 손실이 발생할 수 있습니다. 쉽고 간단하게 함수를 객체의 메소드로 바꿀 수 있다면 개발자가 부담없이 절차지향적 프로그램을 객체지향적 프로그램으로 손쉽게 리팩토링 할 수 있을 것입니다.
이와 같은 메소드를 prototype.js에서 제공하고 있어서 이를 공유합니다.
Function.prototype.methodize라는 함수가 있습니다.
예를 들어서
function setName (target, name) {
target.name = name;
}
이런 절차식 프로그래밍으로 작성된 코드가 있습니다.
이 코드를 객체지향의 메소드로 변경하려면
obj.setName = setName.methodize();
obj.setName('a');
>> obj.name === a
형태로 객체지향적인 프로그램을 할 수 있습니다.
여기서 한발작 더 나아가 현재는 관점 주도 프로그래밍에 대한 패러다임이 있습니다.
AOP라고 하는데 기초가 되는 개념은 관심의 분리 입니다. 모듈 구조를 잘 설계하여도 횡단 관심과 핵심 관심으로 나뉨니다. 횡단 관심은 모듈에서 공통적으로 나타나고 있는 부분 핵심 관심은 이 모듈만 특화적으로 가지고 있는 기능입니다.
횡단관심의 예로는 로그작성, 보안/인증, 트랜젝션, 리소스플링, 에러검사, 정책 적용, 멀티쓰레드 안전관리, 데이터 퍼시스턴스등입니다.
예를 들자서
function add(a,b){
숫자여부 판단 로직.
return a+b;
}
function minus(a,b){
숫자여부 판단 로직.
return a-b;
}
여기서 핵심 관심은 a+b, a-b이고 횡단 로직은 a,b가 숫자를 판단하는 로직입니다.
대부분의 소스코드에서 a,b에 각각 숫자 여부를 판단하는 로직을 수행하고 있지만 이를 분리하여 별도로 가져가는게 AOP입니다.
이에 관련된 함수가 prototypejs에서 Function.prototype.wrap입니다.
function coreAdd(a,b){
return a+b;
}
function coreMinus(a,b){
return a-b;
}
var vali = function (fn, a,b) {
if(a===null || b===null || typeof b === 'number' || typeof b=== 'number)
return null;
return fn(a,b)
}
var add = coreAdd.wrap (vali);
var minus = coreMinus.wrap(vali);
감사합니다.
댓글
댓글 쓰기