천객만래 [千客萬來] (It has an interminable succession of visitors)


자바스크립트 소스 모듈 라이브러리





* 입력값이 숫자인지를 확인한다. (' '까지 괜찮음)

* param : sVal 입력스트링 

* return : Boolean True이면 숫자값 

function isNumberSpace(sVal)



* sVal 값이 숫자인지를 확인한다.('.'까지 괜찮음)

* param : sVal 입력스트링

* return : Boolean  True이면 숫자값

function isNumberSpace(sVal)



* 입력값의 앞에 정해진 자리수만큼 0을 채운다.  

* param : sVal 입력스트링, iSize

* return : String

function fillZero(sVal, iSize) 




* 길이가1인 경우 앞에 "0"을 붙인다.

* param : sVal 입력스트링

* return : String  "0"값을 포함하는 값

function addZero(sVal)




* 날짜 여부를 확인한다.(월일 or 년월 or 년월일)

* param : sYmd 입력스트링(MMDD or YYYYMM or YYYYMMDD)

* return : Boolean true이면 날짜 범위임

* 수정   : 월이나 일에 00 입력시 스크립트 에러. trimZero 부분을 function isDate(sYmd)



* 날짜 여부를 확인한다.(년월일)

* param : sYmd 입력스트링(YYYYMMDD)

* return : Boolean true이면 날짜 범위임

function isDateYMD(sYmd)




* 날짜 여부를 확인한다.(월일)

* param : sMD 입력스트링(MMDD)

* return : Boolean true이면 날짜 범위임

function isDateMD(sMD)



* 날짜 여부를 확인한다.(년월)

* param : sYM 입력스트링(YYYYMM)

* return : Boolean true이면 날짜 범위임

function isDateYM(sYM)



* 년월을 입력받아 마지막 일를 반환한다(년월)

* param : sYM 입력스트링(YYYYMM)

* return : String 해당월의 마지막날

function lastDay(sYM)



* 대소문자를 포함한 영문자인지 확인한다.

* param : sVal 입력문자열

* return : Boolean true이면 알파벳

function isAlpha(sVal)



* 영문자와 숫자 구성된 문자열인지 확인

* param : sVal 입력문자열

* return : Boolean true이면 영문자,숫자로 구성된 문자열

function isAlphaNumeric(sVal)



* 문자열의 길이를 return (한글:2자)

* param : sVal 입력문자열

* return : int 입력문자열의 길이

function strLength(sVal)




* 문자열 길이 체크

* param : str 필드객체, field 필드명

* return : boolean 

function chkStrLength(str,field) 




* 한글이지 여부 체크

* param : sVal 입력문자열

* return : Boolean true이면 한글

function isHangul(sVal)




* 입력받은 날짜로부터 몇일 후의 날짜를 반환하기

* param : ObjDate객체, 일수, 결과Data객체

* return : 

function calcDate(objDate,iDay,objResultDate)



* 숫자 0으로 초기화 된 1차원 배열을 생성한다.

* param : iSize 배열 크기

* return : this 배열

function makeArray(iSize)



* 숫자 분리자(,)(.)가 있는 숫자이거나 일반숫자형태인지 검사한다.

* param : sVal

* return : Boolean 

function isMoneyNumber(sVal)



* 숫자 분리자(,)만 있는 숫자이거나 일반숫자형태인지 검사한다.

* param : sVal

* return : Boolean 

function isMoneyNumber2(sVal)



* 숫자 분리자(.)만 있는 숫자이거나 일반숫자형태인지 검사한다.

* param : sVal

* return : Boolean 

function isMoneyNumber3(sVal)



* 숫자 분리자(.)만 있는 숫자인지 검사한다.

* param : sVal

* return : Boolean 

function isMoneyNumber4(sVal){    




* 소수점이 있는 숫자이면서 정해진 자릿수에 맞는 형식인지 확인다.  

* param : sVal 입력객체, iSize1 정수자릿수, iSize2 소수자릿수

* return : boolean

function isMoneyNumber5(sVal, iSize1, iSize2) 



* 소수점 숫자표현(소수점 위의 3자리마다 "," 맞춤)

* param : val

* return : String

function getMoneyType(val)



* 부호가 있는 소수점 숫자표현(소수점 위의 3자리마다 "," 맞춤)

* param : val

* return : String

function getSignMoneyType(val)





* 콤마를 제거한 숫자형태 문자열로 반환(부호와 소수점도 없앰)

* param : val

* return : String

function getOnlyNumber(val)



* 콤마를 제거한 숫자형태 문자열로 반환(부호, 소수점 그대로)

* param : val

* return : String

  function getOnlyNumberDot(val)





* 콤마를 제거한 부호가 있는 숫자형태 문자열로 반환

* param : val

* return : String

function getOnlySignNumber(val)




  

* 앞뒤 공백을 제거한다.

* param : sVal

* return : String

function Trim(sVal)



* 앞 공백을 제거한다.

* param : sVal

* return : String

function LTrim(sVal)



* 뒤 공백을 제거한다.

* param : sVal

* return : String

function RTrim(sVal)






// DESCRIPTION  : 공백문자 제거

// 함수명       : MTrim(공백이 있는 문자열)

// Return Value : 공백이 제거된 문자열

function MTrim(sVal){



* 공백만 존재하거나 아무것도 없는지 확인한다.

* param : sVal

* return : boolean (true이면 공백이나 Empty이다)

function isEmpty(sVal){



* 현재 컨트롤과 MaxLength 받아서 MaxLength 되면 

   다음 컨트롤로 이동

* param : objCurrent, objNext

* return : 

function focusMove(objCurrent, objNext)



* 현재 컨트롤과 MaxLength 받아서 MaxLength 되면 

   다음 컨트롤로 이동(선택)

* param : objCurrent, objNext

* return : 

function focusMoveSelect(objCurrent, objNext)



* 완료된 날짜값에 대해 "/" 추가

* param : me(value)

* return : String

function calOnMask(me){



* 날짜값 "/" 제거

* param :  me(value)

* return : String "/" 제거된 날짜값

function calOffMask(me){





* 날짜값 자동 "/" 붙임.(완성된 날짜값에 대해 /붙임)

* param : 

* return : 

function cal_value2(me){



* 오늘 날짜 생성 ( "/" 붙여서 리턴)

* param : 

* return : todate

function todate() {





Spec     : 숫자입력시 3자리마다 자동으로 콤마 찍기

Argument : string

Return   : string

Example  : onkeyup="comma_value(this)"

function comma_value(sval)




Spec     : 숫자입력시 3자리마다 자동으로 콤마 찍기

Argument : string

Return   : string

Example  : onkeyup="comma_value(str)"

function formatNumbertoString(cur)



  

// 숫자만 입력 (소수점 허용, 음수 허용)

// 사용법 : onKeyPress = onlyNum();

function onlyNum()



// 숫자만 입력 (소수점 허용, 음수 불가)

// 사용법 : onKeyPress = onlyNum2();

function onlyNum2()





// 숫자만 입력 (소수점 불가, 음수 허용)

// 사용법 : onKeyPress = onlyNum3();

function onlyNum3()



// 숫자만 입력 (소수점 불가, 음수 불가)

// 사용법 : onKeyPress = onlyNum4();

function onlyNum4() 









* 입력완료된 숫자값에 대하여 콤마를 찍어줄때 사용

   (소수점 이하 처리 안됨)

* 콤마 형식을 사용할 경우에는 onkeyup이벤트로 사용하기 바라며,

* 다음의 펑션을 호출할때는 comma_value(me) 펑션을 호출하기 바람.

* param : value

function numOnMask(me){



* 콤마가 들어간 숫자에서 ","를 뺀다.

* param : value

function numOffMask(me){





// 입력 완료된 숫자 값에 컴마를 적용하여준다

(소수점 이하는 "," 안 붙음)

// return : String

function numOnMask2(me){ 



// 입력 완료된 숫자 값에 컴마를 적용하고 소수점 이하는 삭제한다

// return : String

function numOnMask3(me){ //단순히 값에 컴마를 적용할때 사용



* 입력값을 소수점 이하 몇 자리까지 보여줄지 정한다.  

* 소수점 이하 자리수가 입력된 값보다 작으면 0으로 채운다.

* param : sVal 입력스트링, iSize 소수자릿수

* return : String

function numOnMask4(sVal,iSize) 



* 입력값에 마스킹을 적용한다.

   (소수점 이하와 부호를 삭제하고 콤마추가)

* param : sVal 입력스트링

* return : String

function numOnMask5(sVal) 




* 입력값에 마스킹을 적용한다.

   (부호를 삭제하고 콤마추가. 소수점은 그대로 둠)

* param : sVal 입력스트링

* return : String

function numOnMask6(sVal) 





* 숫자 외의 값이 입력되어있으면 false 리턴

* param : sval (object)

* return :

function onlyNumber(sval) {





* 특수문자 값이 입력되었는지 체크(특수문자가 있으면 false 리턴)

* param : sval (object)

* return :

function chkValidChar(sval) { 






*

* 윈도우 오픈1 (사용자 지정 위치생성) 

* param : wUrl                지정url

* param : wTitle        지정타이틀

* param : wTop                지정 창 높이정렬기준

* param : wLeft   지정 창 왼쪽정렬기준

* param : wWidth        창넓이

* param : wHeight        창높이

* param : wSco                스크롤바 생성유무, 1:생성 0:비생성

function win_open(wUrl,wTitle,wTop,wLeft,wWidth,wHeight,wSco)  



*

* 윈도우 오픈2 (무조건 가운데 생성)

* param : wUrl                지정url

* param : wTitle        지정타이틀

* param : wWidth        창넓이

* param : wHeight        창높이

* param : wSco                스크롤바 생성유무, 1:생성 0:비생성

function win_open2(wUrl,wTitle,wWidth,wHeight,wSco) 



*

* 윈도우 오픈3 (무조건 전체 생성)

* param : wUrl                지정url

* param : wTitle        지정타이틀

* param : wWidth        창넓이

* param : wHeight        창높이

* param : wSco                스크롤바 생성유무, 1:생성 0:비생성

function win_open3(wUrl,wTitle) 








/**

* 두 날짜에 며칠 차이나는지 구함

* from_val이 to_val보다 크면 -붙여서 리턴

*/

function getDayInterval(from_val,to_val) 



JCommon.zip


Posted by SB패밀리

플랫폼(Platform)과 프레임워크(Framework), 아키텍처(Architecture) 개념비교

 

참조 출처: 네이버 지식in

 소프트웨어 분야에서 프레임워크와 라이브러리, 플랫폼, 아키텍쳐를 비교해 보면, 다음과 같다.

 프레임워크: 소프트웨어의 뼈대 구조

 

프레임워크란 특정형태의 소프트웨어 문제를 해결하기 위한 상호 협력하는 클래스들과 인터페이스들의 집합. 즉 소프트웨어 콤포넌트들의 집합을 의미한다. 이는 여러클래스와 컴포넌트로 구성되고 좀더 높은 수준에서 패턴들을 조직화하며 다양한 애플리케이션에서 이용 가능한 범용성(generic)을 가진다.

 프레임워크는 다른 소프트웨어 프로젝트가 개발될 수 있는 뼈대 구조이다. 지원 프로그램, 라이브러리, 언어, 다른 소프트웨어 구성 요소들을 엮어 주는 소프트웨어 등을 포함하고 있다. 따라서, 플랫폼도 프레임워크의 일종이라고 볼 수 있으며, MS사에서 닷넷 플랫폼을 닷넷 프레임워크라고 지칭하는 것도 틀린 것이 아니다.

 또한, UI 프로그램 개발을 위한 부분 만을 떼어내서 프레임워크라고 할 수도 있다. UI 프로그램 개발을 위한 부분 만으로는 완전한 소프트웨어 실행 환경이 되지 않으므로 플랫폼은 아니지만 프레임워크이다. 이러한 점에서 프레임워크와 플랫폼은 다른 경우가 많다.


프레임워크에 대한 내용의 이해를 돕기위해 라이브러리와 비교를 해보자. 라이브러리는 애플리케이션에서 호출할수 있는 함수와 루틴으로 구성되며, 필요한 클래스를 개발자가 불러오는 방식을 지닌다.

 프레임워크와 라이브러리의 관계는 구성적인 측면에서 라이브러리는 함수와 루틴들로 볼 수 있고, 프레임워크는 콤포넌트들로 볼 수 있다. 실제 사용하는 측면에서 라이브러리는 내부에서 불러서 사용하고, 프레임워크는 내부에서 호출이아니라, 자체가 그대로 동작하거나,상속을 받아 재구성하여 동작한다. 이러한 콤포넌트들은 라이브러리를 불러서 사용할 수 있다.


프레임워크(Framework)
  - 잘 정의된 문제도메인 안에서 성공적으로 어플리케이션을 작성하기 위해 필요한 가치 있는 지식을 내포함
  - 비교적 규모가 크고, 복잡하며, 다루기 어려움
  - 어플리케이션 프로그래머는 프레임워크의 인터페이스를 구현하거나 프레임워크 클래스를 상속하여 사용함
  - 프레임워크는 적절한 시기에 어플리케이션을 호출함(흐름에 대한 제어를 프레임워크가 수행)

라이브러리(Library)
  - 어플리케이션 프로그래머가 적절하다고 생각할 때 호출하여 사용함
    (
흐름에 대한 제어는 어플리케이션 코드에서 수행)
  - 라이브러리는 어플리케이션 프로그래머에게 코드작성규칙을 강요하지 않음 
  - 어플리케이션 프로그래머는 코드 작성시 에러 핸들링 정책에 신중을 기해야 함
 

플랫폼: 소프트웨어 실행 환경

 

가장 일반적이면서도 명료한 의미는 "소프트웨어가 실행되는 환경"이다. 개발 언어나 개발 환경을 플랫폼에 포함시키기도 하지만 이는 부수적 개념 혹은  확장된 개념에 불과하고, 핵심은 "소프트웨어가 실행되는 환경"이다.

 각 프로그램은 아무 플랫폼에서나 실행되는 것이 아니고 특정 플랫폼에서만 실행된다. 일반적으로, O/S는 모두 플랫폼이다. Windows는 윈도우즈 프로그램만을 실행시킬 수 있는 플랫폼이고, 리눅스는 리눅스 프로그램만을 실행시킬 수 있는 플랫폼이다.

자바 런타임 환경도 플랫폼이다. 자바 프로그램은 O/S에 대한 종속성은 거의 없고 자바 런타임 환경없이는 실행되지 않으므로 자바 런타임 환경을 주요 플랫폼으로서 필요로 한다. 마찬가지로 닷넷 프로그램도 닷넷 런타임 환경없이는 실행되지 않으므로 닷넷 런타임 환경이 플랫폼이 된다.


아키텍처: 소프트웨어의 주요 설계 구조

 

소프트웨어의 주요 특징들을 결정짓는 주요 설계 구조이다. 즉, 소프트웨어의 주요 구성 요소 및 구성, 이들간의 주요 인터페이스, 중요 동작 방식 등 소프트웨어의 주요 특징들을 결정짓는 모든 설계 구조를 포함한다.

 소프트웨어의 주요 특징을 결정짓고 소프트웨어 개발에 미치는 영향도 매우 커서 소프트웨어 개발에 있어서 가장 중요한 부분이라고 할 수 있다. 지원 프로그램, 라이브러리, 언어, 다른 소프트웨어 구성 요소 등과 같이 구체적인 구현을 포함하지 않는다는 점에서 프레임워크나 플랫폼과는 명확히 구분된다.

 

정리하자면, 이렇게 된다.

 

아키텍쳐 = 소프트웨어 설계 구조

프레임워크 = 소프트웨어 개발 구조  <-- 라이브러리 참조

플랫폼 = 소프트웨어 실행 환경 

Posted by SB패밀리
파워빌더에서 DEBUG나 RUN을 모드에서 실행시의 속도와
Deploy를 통한 어플리케이션 모드에서 실행시의 속도가 다른 경우가 발생하는데
여기에 대한 질문과 답변예를 살펴보자.


질문1)

10.0으로 파워빌더를 업그레이드 하기 전에 트라이얼 버전으로 문제가 없는지 체크를 하고 있습니다. 저희 시스템이 기존에 7.0으로 개발이 되어있는 상태였는데요 pb 9버전으로 마이그레이션 후 pb10.0으로 마이그레이션 하고 테스트를 진행 했습니다. 마이그레이션은 에러없이 정상적으로 되었구요.. 소스에서 실행 했을때 문제 없이 작동도 잘 됩니다. 그런데 문제는 컴파일을 했을때 인데요.. 프로그램을 실행후에 Window가 Open되는데 25초 이상이 걸립니다. 그 후에도 프로그램의 실행 속도가 엄청나게 느려지고 프로그램의 기능도 소스에서와 다르게 작동을 합니다. 이런 현상을 글로써 설명하기가 굉장히 힘이 든데요. 소스로 테스트 했을때와 컴파일 후에 다르게 실행이 된다는것이 이상하구요. 7.0에서는 아무 문제없이 쓰던 소스 그대로 인데 이렇게 되는게 이상합니다. 그래서 pb 10.0이 문제 인가 해서 pb 9.0에서 컴파일을 했는데요 역시 마찬가지 현상이 나타납니다.

답변)

질문 내용을 보았을때 속도가 느려지는 것은  10으로 마이그레이션 해서 그런것이 아니라 라이브러리 리스트 구조상 무언가 잘못지정되어 있는 것이 있는게 아닌가 싶습니다. 예를 들어 실제 오픈 되는 윈도우가 있는 PBL가 이 윈도우가 참조하는 다른 오브젝트가 다른 PBL에 있는데 이 PBL경로가 다른 폴더에 있거나... 아니면 오픈되는 윈도우가 계승을 받은 윈도우 인데...조상 윈도우의 라이브러리 위치가 뒤에 있거나, 이런 부분을 조정을 해 보시기 바랍니다.


질문2)
파워빌더로 현재 어플리케이션을 개발중입니다.
현업에서 어플리케이션 실행 시 속도가 너무 느려 점검해본 결과 파워빌더에서 소스 실행시와 어플리케이션(실행파일)에서 실행 시에 DB 연결 속도 차이가 무려 10배 이상 나고 있습니다. 아직 데이터 건수가 많지 않아 조회 시 속도가 느린지는 확인되지 않고 있습니다.
이런 현상이 일어나는 원인이 무엇이며, 해결책이 있는지 알고 싶습니다.
참고로 기타 인터넷 속도등은 전용망이기 때문에 잘 나오고 있습니다.
답변)
개발툴과 실행파일 사이에는 이미 로드된것을 이용하는것과 안하는것의 차이가 있습니다.
개발 툴에서 실행시 데이터베이스 연결은 물론 필요한 Object들이 이미 메모리에 로드되어 있어서 말씀하신 속도의 차이를 보일 수 있습니다.
하지만 이러한 속도는 실행 모듈에서 어플케이션이 실행되고 나면 조회에 있어서는 같은 속도를 유지 해야 됩니다.
만약 데이터 조회에 있어서도( DB 연결 후) 말씀하신 속도의 차이가 있으면 어딘가에 문제가 있다고 볼수 있습니다.
또한 어플리케이션 Open 시 과도한(사용하지 않는) 오브젝트를 로드한다든가 LIbrary Path 마지막에 있는 오브젝트를 로드하는 방법은 많은 시간을 소요할 수 있습니다. 그러므로 일반적으로 어플리케이션이 Open 시 사용되는 Object는 어플리케이션과 같은 PBL에 위치를 시키고, 실행 파일 만들때 이 pbl만 pbd Check를 빼서 속도를 최대화 하실 수 있습니다. 

 

Posted by SB패밀리

프레임워크를 만들었음에도 불구하고 초기 프레임워크 ㅐ념이 나올 때의 글만 보다가 요즘 다시 보니 새로운 느낌까지 들고 너무 책을 등한시 했다는 생각이 든다.
출퇴근시간이 1시간이상 소요되는 되다가 저녁먹고 나서는 건강을 위해서 운동을 해야하고
요즘 경제서적보랴 ... 한동안 등한시 해왔던 개발이론 분야....
다시 책을 집어 들고 인터넷에서 여러 개발자분들의 노고를 감사히 읽으면서 이해를 해야겠다.

프레임워크 생산성의 향상

•프로그램에서의 생산성 향상 방안 : 코드의 재사용
•Function, Procedure 개념 지원 언어의 출현, 이후 객체지향 언어가 출현
•컴포넌트 사용 : 재사용을 높이고 검증된 코드를 사용하게됨 --> SW 품질이 높아지고 개발비용/유지비용이 낮아짐
•컴포넌트 재활용과 디자인 재활용
•객체지향 프로그램에서는..
•클래스 : 기능을 모듈화 & 추상화 지원
•추상클래스 : 객체간 프로토콜 일치 가능
•동적바인딩 : 프로시저 호출 지연 바인딩(Late-binding)
•클래스 상속 : 서브클래스에서 기능을 추가/보완
•다형성 : 객체의 기능을 교체
•랄프존슨이 말한 프레임워크
•추상클래스들의 집합과 상호 협조하는 클래스들의 인스턴스 동작방법으로 이루어진 재사용 가능한 디자인
•예제) 윈도우 애플리케이션용 프레임워크
•화면의 로직처리
•윈도우 그리는 컴포넌트
•통신 컴포넌트
•내부 정보 처리하는 도큐먼트 컴포넌트
•등등등..

Framework이란 무엇인가? 

 Ralph Johnson 이라는 사람은 추상클레스( abstract class) 들의 집합과 상호 협조하는 클래스들의 인스턴스 동작 방법으로 이루어진 재사용 가능한 디자인이라 정의.

프로젝트에 어울리는 잘 만들어진 프레임워크를 이용한 어플리케이션은 비록 거대해지더라도 프레임워크의 의도에 맞게 어플리케이션의 설계가 이루어짐. 때문에 어플리케이션에 의해 System의 안정성을 해치거나, 터무니없이 낮은 퍼포먼스를 내는 일은 거의 없을 것 임.

라이브러리와 프레임워크의 차이!
라이브러리는 개별적인 기능들을 집단형태로 묶음을 의미.
때문에 라이브러리를 이용해 문제를 해결하고자 할때는 메소드의 기능을 정확히 이해하고 사용해야 함.
프레임워크는 원하는 기능을 제공하는 모듈의 인스턴스와 이에 수반되는 여러가지 장치 들의 상호작용까지의 묶어서 정의 하게 됨.때문에 프레임워크에서 제공되는 기능을 사용하게 되면 이와 수반된 이미 검증된 작업의 플로우까지 함께 사용하게 되는 것입니다.
이렇게 함으로 해서 어플리케이션의 코드를 줄일 수 있고, 안정성을 높이며 개발 속도를  빠르게 할 수 있습니다.


라이브러리 대신 프레임워크 사용하는 이유

•라이브러리
•정의 : 해결하고자 하는 도메인 문제와 상관없이 재사용할 컴포넌트의 집합
•사용시 : 제공하는 메소드의 기능을 정확히 알고 있어야 함 (목적, 인자, 결과값)
•프레임워크
•정의 : 해결하고자 하는 도메인 문제에 특화된 인스턴스들이 함께 동작되는 컴포넌트 집합과 디자인
•사용시 : 필요한 지점에서 적절히 삽입하고 쉬운 사용, 세부적인 부분은 몰라도 됨
•프레임워크 = 반제품(Semi-Complete Application) : 적은 비용으로 App 만들기 위해 절반정도는 구현되어 있는 수준

•예제 : 신뢰성 있는 메시징, 트랜젝션 개발시
•라이브러리 : 각 라이브러리별 메소드를 알고, 개발해야 됨
•프레임워크 : WCF 쓰면 내부의 세부사항은 몰라도 기능 흐름만 파악하면 되며, 코드가 주어듬


좋은 프레임워크와 효과적인 사용법

•일반적인 프레임워크 사용방법
•1) 클래스의 서브클래스 생성
•2) 생성된 객체의 내부환경을 설정
•3) 프레임워크가 제시하는 표준 방법으로 App에 적용
•좋은 프레임워크의 요소
•효율성(Effectiveness) : 개발자에게 효율적이여야, 개발 속도를 빠르게 해야, 개발비용을 줄여야 함
•확장성(Extensibility) : 특정 도메인의 App 개발시 개발항목을 포괄하는 확장성을 가져야 함 (App이 삼각형 윈도우를 지원해야 한다는 식의 무리한 확장성은 포함 안해도 됨)
•적용규모(Coverage) : 구현사항을 어느 범위까지 적용할지?
•평이성(Simplicity)와 이해도(Understandability) : 교육이 쉬워야, 너무 복잡하거나 추상적이면 안됨
•통합성(Framework Intergration) : 다른 프레임워크나 라이브러리와 상호소통이 잘되면 좋다
•품질(Qualities) : 능률성,적용성,표준성.. 필수항목은 아닌듯
•안정성(Stability) : 개발코드에 정확한 계산과 결과물 도출


프레임워크 도입시 고려할 점

•필요이상으로 복잡해지고 코드나 객체가 커지면 안됨
•랄프존슨 : "원할하게 일할 수 있을 만큼 이 프레임워크가 쉽게 느껴지는가?"
•프레임워크 도입시 더 비효율적이 될거 같으면 때려치워라! (개발비용, 교육, 문서화 작업 등...)


프레임워크 만들기

•추상 개념을 먼저 생각하기는 어렵다.. 먼저 구현해 보자
•먼저 구현 -> 문제 해결 방법을 작은 집합으로 나눔 -> 구현체 중 컨텍스트를 인자화해 변경할 수 있도록 수정
•도메인 전문가가 만들때 : Up-Front 디자인 방식
•코딩 전문가가 만들때
•반복적인 구현을 통해 코드를 개선해 나감
•반복 개발시 Hot Spots과 Frozen Spots를 잘 구분해서 다음번 개발시 잘 구성하자
•App이 다 만들어지면 이전 프레임워크와 비교하여 재사용성 부분을 반영
•구현클래스에서 추상클래스 유추하기
•구현클래스에서 일반적인 부분들을 뽑아서 추상클래스 만들기
•1) 공통 기능의 구현클래스 준비
•2) 구현 클래스의 공통 기능을 하나의 메소드로 옮긴다.
•3) 옮겨진 구현 클래스의 멤버로 있는 메소드의 이름을 동일하게
•4) 이름을 변경한 메소드의 인자, 리턴값을 동일하게 일반화
•5) 해당 메소드를 분리하거나 병합할 필요시 리팩토링
•6) 같은 메소드명이지만 다른 구현이라면 추상클래스에서 메소드명을 반영
•7) 구현 클래스의 메소드 내용이 같다면 수퍼클래스로 구현을 옮김
•상향식 설계
•하향식 : 구현 클래스 먼저 만들고 이를 바탕으로 추상클래스 만듬
•상향식보다 쉽다.
•R = I + J = AX + AY = A(X + Y) --> 여기서 A는 공통부분

필요한 설계 원칙
 
•의존 관계 역전 원칙(The Dependency Inversion Principle)
•인터페이스 분리 원칙(The Interface Segregation Principle)
•리스코프 치환 원칙(The Liskov Substitution Principle)
•단일 책임 원칙(The Single Responsibility Principle)
•개방 폐쇄 원칙(The Open-Closed Principle)


프레임워크 개발의 9 단계

•http://st-www.cs.illinois.edu/users/droberts/evolve.html
•시간축에 따라 동시에 진행할 수도 있다.
•1) Three Example : 세가지 애플리케이션 패턴
•2) White-box Framwork : 화이트박스 패턴
•3) Component Library : 컴포넌트 라이브러리 패턴
•4) Hot Spots : 핫 스팟 패턴
•5) Pluggable Object : 플러그러블 오브젝트 패턴
•6) Fine-grained Object : 파인-그레인드 객체 패턴
•7) Black-box Framework : 블랙박스 패턴
•8) Visual Builder : 비주얼 빌더 패턴
•9) Language Tools : 언어도구 패턴

프레임워크 개발은 여러 도메인에 대하여 여러가지 문제를해결할 수 있도록 만들어지기 때문에 특정 도메인의 간단한 문제를 해결하기 위하여 기능과 구현이 복잡해지고 코드의 크기나 객체의 크기가 커질 수도 있음.

Posted by SB패밀리