SlideShare a Scribd company logo
1 of 18
Design Principle




                   page 1
SW complexity vs SW design



       Decrease complexity

        Top down approach

      Separation of Concerns


                  Jintae Kim   page 2
Practical SW design & Construction


Iterative

Incremental

Add, modify, delete



                   Jintae Kim        page 3
Bad Smell

• Not modifiable

                                   스파게티 코드 다수 존재



                                Feature enhance, bug fixing으로
                                    인한 코드 수정 어려움



                                미흡한 영향평가로 new bug 등장



                                     코드 수정 비용 증가




                   Jintae Kim                         page 4
Our goal is to design maintainable SW

• A good design is modifiable and flexible.

• A good design helps us to analyze side-effect when
  modifying source code.

• A good design is to break down the complexity of Software.

• A good design comes from a good designer




                           Jintae Kim                  page 5
Requirements acquisition

• No Requirements specification, No design



• Requirements


      Functional vs   NonFunctional


                         Jintae Kim          page 6
Continuous Design & Validation




                                 page 7
Prevent architecture erosion !!!

  The well-designed SW does NOT become always good SW




             Design                  Injection




                      Validation

                        Jintae Kim               page 8
Make dummy functions

• Header file을 이용하여 함수 명 정의
 함수 목적이 잘 드러나도록 기술
 함수 목적을 코멘트로 기술
 /***********************************************
 * System : MOAKEY IM (Input Method)
 * File : MOAIM.h
 ************************************************

 /* MSG Callback Function */
 LRESULT CALLBACK MOAWndProc (HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK DoCreateSIP (HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK DoPaintSIP (HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK DoLButtonUpSIP (HWND, UINT, WPARAM, LPARAM);

 /* SIP 이미지를 drawing 한다. */
 void drawingSIPImage();

 /* SIP 상에서 Key가 눌렸다가 떼어졌을 때 처리*/
 void onLButtonUp();
 .....
 .....

                             Jintae Kim                          page 9
Make the relations between functions



                 DoCreateSIP()




                                                      …
                         …
 MOAWndProc()     DoPaintSIP()                  drawingSIPImage()




                                                      …
                         …
                DoLButtonUpSIP()     onLButtonUp()




                        Jintae Kim                              page 10
Inject the relations of functions into source
      code


            MOAWndProc()                             DoPaintSIP()               drawingSIPImage()




LRESULT CALLBACK MOAWndProc (HWND            RESULT CALLBACK DoPaintSIP (HWND       void drawingSIPImage()
p_hwnd, UINT p_wMsg, WPARAM p_wParam,        p_hwnd, UINT p_wMsg, WPARAM            {
LPARAM p_lParam)                                                                    /*
{                                            p_wParam, LPARAM p_lParam)             현재모드에해당되는키보드이
  switch( p_wMsg )                           {                                      미지를화면에출력해준다.*/
  {                                          /* Display(가로/세로방향) 모드를확인한다. */
                                                                                        return;
    case WM_CREATE:                            setDisplayMode();                    }
      return DoCreateSIP (p_hwnd, p_wMsg,
                    p_wParam, p_lParam) ;    /* Display 모드와SIP 모드에따라IP(Input
    case WM_PAINT:                           Panel) Window사이즈및위치를조정한다. */
     return DoPaintSIP (p_hwnd, p_wMsg,        setSIPWndPosition();
                  p_wParam, p_lParam) ;
    case WM_DESTROY:                         /* SIP 이미지를drawing 한다*/
      return DoDestroySIP (p_hwnd, p_wMsg,     drawingSIPImage()
                     p_wParam, p_lParam) ;
    default: break;                          /* 모아키가활성화되어있는경우다시그려준다.
    }
                                             */
    return DefWindowProc (p_hwnd, p_wMsg,      drawingMOAKeyImage();
                    p_wParam, p_lParam);
}
                                                 return 0;
                                             }


                                                         Jintae Kim                               page 11
Validate dummy structure

•       기본설계에 나타나는 구조와 소스코드의 구조 일치
                                                            소스상의 Call 구조의 예




•       Call Depth (0.32) / function Complexity (1.69) 양호
       소스코드를 이해하기에 적절하다 (이유: 실제 구현이 이뤄지지 않고 구조만 잡았기 때문)
•       Unused functions 존재
       기본설계 시 파악 치 못한 관계 존재하여 발생 (3개) (call graph 반영)




                                             Jintae Kim                 page 12
Inject the relations of functions into source
code
•      함수의 파라미터, 반환 타입                    •      함수 실행 조건 구현
       구현

void drawingSIPImage(HWND p_hwnd)         void drawingSIPImage(HWND p_hwnd)
{                                         {
                                          #ifdef DEBUG_MOAIM
                                            /* Pre Condition */
                                            ASSERT(p_hwnd != NULL);
                                            ASSERT(g_nSelSIPMode > -1);
                                            ASSERT(g_nSelSIPMode < MAX_SIP);
                                            /* SIP에해당되는이미지값이지정되어있어야한다.*/
                                          ASSERT(sip_img_map[g_nSelHandlerMode][g_nSelDisplayMode
                                                 ][g_nSelSIPMode][g_nSelInputMode].id > -1);
                                          #endif // DEBUG_MOAIM
//                                        // 현재모드에해당되는키보드이미지를화면에출력해준다.
       현재모드에해당되는키보드이미지를화면에출력
       해준다.
                                          #ifdef DEBUG_MOAIM
                                               /* Post Condition */
                                          #endif // DEBUG_MOAIM

                                                 return;
    return;
}                                         }




                                    Jintae Kim                                       page 13
Validate the whole structure of dummy
functions
•       상세 설계의 구조가 소스코드 상에 잘 투영되었는지 검증
     return / parameter type의 추가로 인한 구조 변경 여부 검증: 변경 사항 없음
     Prototype 검증 시 발생된 추가/삭제된 함수의 구조 반영 여부 확인: 2개 함수가 구조에 반영




•       Call Depth (0.67) / function Complexity (1.88) 양호
       소스코드를 이해하기에 적절하다 (이유: 실제 구현이 이뤄지지 않고 구조만 잡았기 때문)
       Prototype 검증때 보다는 call depth, function complexity 증가하였으나 그래도 적절한 수준

•       Unused functions 존재
       Prototype 검증시 파악된 3개 함수 중 2개만 반영
       미반영 함수는 debug 메시지를 위한 함수였음


                                                Jintae Kim                    page 14
Realize the algorithm of functions
•    검증된 구조를 바탕으로 실행 가능한
     알고리즘 구현
void drawingSIPImage(HWND p_hwnd)
{                                                                           /* image cx */
#ifdef DEBUG_MOAIM                                                          sip_img_map_cache[g_nSelInputMode].rect.right –
  /* Pre Condition */                                                       sip_img_map_cache[g_nSelInputMode].rect.left,
  ASSERT(p_hwnd != NULL);                                                   /* image cy */
  ASSERT(g_nSelSIPMode > -1);                                               sip_img_map_cache[g_nSelInputMode].rect.bottom –
  ASSERT(g_nSelSIPMode < MAX_SIP);                                          sip_img_map_cache[g_nSelInputMode].rect.top,hdcMem, 0, 0, SRCCOPY);
  /* SIP에해당되는이미지값이지정되어있어야한다.*/                                              SelectObject(hdcMem, hOldSel);
ASSERT(sip_img_map[g_nSelHandlerMode][g_nSelDisplayMode][g_nSelSIP          DeleteObject(hBmp);
        Mode][g_nSelInputMode].id > -1);                                    DeleteDC(hdcMem);
#endif // DEBUG_MOAIM
                                                                            /* SIP 과Application간경계선그려주기*/
// 현재모드에해당되는키보드이미지를화면에출력해준다.                                                MoveToEx(hdc, 0, 0, NULL);
 HDC hdc = GetDC(p_hwnd);                                                   LineTo(hdc, sip_wnd_rect_cache[g_nSelInputMode].right,0);
 HDC hdcMem;                                                                ReleaseDC(p_hwnd, hdc);
 HBITMAP hBmp, hOldSel;
 hdcMem = CreateCompatibleDC(hdc);                                      #ifdef DEBUG_MOAIM
 hBmp = LoadBitmapW(g_hInst,                                                   /* Post Condition */
        MAKEINTRESOURCE(sip_img_map_cache[g_nSelInputMode].id));        #endif // DEBUG_MOAIM
 hOldSel = (HBITMAP)SelectObject(hdcMem, (HBITMAP) hBmp);
 BitBlt(                                                                         return;
   hdc,                                                                 }
   /* image x */
   sip_img_map_cache[g_nSelInputMode].rect.left,
   /* image y */
  sip_img_map_cache[g_nSelInputMode].rect.top,




                                                                   Jintae Kim                                                           page 15
DBC (Design By contract)

• 정직한 거래를 보장하는 최선의 해법 중 하나는 계약
• 계약
  - 상대편과 자신의 권리와 책임을 정의
  - 계약 위반 시 손해에 대해서도 정의

• DBC(계약에 의한 설계)
  - 프로그램의 정확성을 보장하기 위해 소프트웨어 모듈의 권리와
    책임을 문서화 하는데 초점
  - 프로그램의 정확성: 스스로 자신이 하는 일이라고 주장하는
    것보다 많거나 적지도 않게 딱 그 만큼만 하는 것




                   Jintae Kim   page 16
DBC (Design By contract)

• 선행조건(precondition)
  -   함수/메소드가 호출되기 위해 참이어야 하는 것
  -   즉, 함수/메소드의 요구사항
  -   선행조건이 위반된 경우(계약위반) 호출되어서는 안 된다.
  -   제대로 된 데이터를 전달하는 것은 호출하는 쪽의 책임이다.

• 후행조건(postcondition)
  - 함수/메소드가 자신이 할 것이라고 보장하는 것
  - 즉, 함수/메소드가 완료되었을 때 세상의 상태
  - 후행조건이 있다는 것은 곧 그것이 종국에는 종료될 것이라는 걸
    암시.
  - 무한반복 허용되지 않음




                       Jintae Kim   page 17
DBC (Design By contract)

• 모듈불변식(module invariant)
  - 호출자의 입장에서 볼 때는 이 조건이 언제나 참이라고 모듈이
    보장
  - 함수/메소드의 내부 처리 중에는 불변식이 참이 아닐 수도
    있지만, 종료하고 호출자로 제어권이 반환되는 때에는 불변식이
    참이 되어야 한다.
  - 불변식에 관여하는 어떤 데이터 멤버에게도 모듈이 무제한적인
    쓰기 접근권을 줄 수 없다는 것을 기억하라

 추가 계약 내용
  - 만약 호출자가 로틴의 모든 선행조건을 충족한다면, 해당 루틴은
    종료 시 모든 후행조건과 불변식이 참이 될 것을 보증해야 한다.




                    Jintae Kim    page 18

More Related Content

Similar to Sw설계

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Hacosa js study 4주차
Hacosa js study 4주차Hacosa js study 4주차
Hacosa js study 4주차Seong Bong Ji
 
클린코드 17장
클린코드 17장클린코드 17장
클린코드 17장진화 손
 
Finding Functional Programming
Finding Functional Programming Finding Functional Programming
Finding Functional Programming NAVER Engineering
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약Tae wook kang
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shadingMinGeun Park
 
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목dgmit2009
 
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)fefe7270
 
Html5+js with game engine cocos2d-html5 분석 @KGC2012
Html5+js with game engine   cocos2d-html5 분석 @KGC2012Html5+js with game engine   cocos2d-html5 분석 @KGC2012
Html5+js with game engine cocos2d-html5 분석 @KGC2012Chanho Song
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
응컴_Term_Project_아이디어붐제출.pptx
응컴_Term_Project_아이디어붐제출.pptx응컴_Term_Project_아이디어붐제출.pptx
응컴_Term_Project_아이디어붐제출.pptxssuser506c05
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer ModelHan Lee
 
모바일 해커톤 사전교육 2일차
모바일 해커톤 사전교육 2일차모바일 해커톤 사전교육 2일차
모바일 해커톤 사전교육 2일차Han Sung Kim
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축guest0ad316e
 
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델Jaeho Seok
 

Similar to Sw설계 (20)

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Hacosa js study 4주차
Hacosa js study 4주차Hacosa js study 4주차
Hacosa js study 4주차
 
클린코드 17장
클린코드 17장클린코드 17장
클린코드 17장
 
Finding Functional Programming
Finding Functional Programming Finding Functional Programming
Finding Functional Programming
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약3D 모델러 ADDIN 개발과정 요약
3D 모델러 ADDIN 개발과정 요약
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shading
 
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목
제 4회 DGMIT R&D 컨퍼런스 : IIFE와 QA공통항목
 
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)
 
Html5+js with game engine cocos2d-html5 분석 @KGC2012
Html5+js with game engine   cocos2d-html5 분석 @KGC2012Html5+js with game engine   cocos2d-html5 분석 @KGC2012
Html5+js with game engine cocos2d-html5 분석 @KGC2012
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
How to Grunt.js
How to Grunt.jsHow to Grunt.js
How to Grunt.js
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
응컴_Term_Project_아이디어붐제출.pptx
응컴_Term_Project_아이디어붐제출.pptx응컴_Term_Project_아이디어붐제출.pptx
응컴_Term_Project_아이디어붐제출.pptx
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model
 
모바일 해커톤 사전교육 2일차
모바일 해커톤 사전교육 2일차모바일 해커톤 사전교육 2일차
모바일 해커톤 사전교육 2일차
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축
 
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델
[0731 석재호]윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델
 

More from 김진태 Jintae Kim

Bug(fault)를 예측하려는 노력
Bug(fault)를 예측하려는 노력Bug(fault)를 예측하려는 노력
Bug(fault)를 예측하려는 노력김진태 Jintae Kim
 
Continuous integration: the architecture of open source application
Continuous integration: the architecture of open source applicationContinuous integration: the architecture of open source application
Continuous integration: the architecture of open source application김진태 Jintae Kim
 
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법소스코드를 개선하여 효율성과 품질을 향상 시키는 방법
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법김진태 Jintae Kim
 
Clean code 정보통신대학원_2012_spring
Clean code 정보통신대학원_2012_springClean code 정보통신대학원_2012_spring
Clean code 정보통신대학원_2012_spring김진태 Jintae Kim
 

More from 김진태 Jintae Kim (6)

Bug(fault)를 예측하려는 노력
Bug(fault)를 예측하려는 노력Bug(fault)를 예측하려는 노력
Bug(fault)를 예측하려는 노력
 
Continuous integration: the architecture of open source application
Continuous integration: the architecture of open source applicationContinuous integration: the architecture of open source application
Continuous integration: the architecture of open source application
 
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법소스코드를 개선하여 효율성과 품질을 향상 시키는 방법
소스코드를 개선하여 효율성과 품질을 향상 시키는 방법
 
The Introduction to Refactoring
The Introduction to Refactoring The Introduction to Refactoring
The Introduction to Refactoring
 
Clean code 정보통신대학원_2012_spring
Clean code 정보통신대학원_2012_springClean code 정보통신대학원_2012_spring
Clean code 정보통신대학원_2012_spring
 
1.코드장인의길
1.코드장인의길1.코드장인의길
1.코드장인의길
 

Sw설계

  • 2. SW complexity vs SW design Decrease complexity Top down approach Separation of Concerns Jintae Kim page 2
  • 3. Practical SW design & Construction Iterative Incremental Add, modify, delete Jintae Kim page 3
  • 4. Bad Smell • Not modifiable 스파게티 코드 다수 존재 Feature enhance, bug fixing으로 인한 코드 수정 어려움 미흡한 영향평가로 new bug 등장 코드 수정 비용 증가 Jintae Kim page 4
  • 5. Our goal is to design maintainable SW • A good design is modifiable and flexible. • A good design helps us to analyze side-effect when modifying source code. • A good design is to break down the complexity of Software. • A good design comes from a good designer Jintae Kim page 5
  • 6. Requirements acquisition • No Requirements specification, No design • Requirements Functional vs NonFunctional Jintae Kim page 6
  • 7. Continuous Design & Validation page 7
  • 8. Prevent architecture erosion !!! The well-designed SW does NOT become always good SW Design Injection Validation Jintae Kim page 8
  • 9. Make dummy functions • Header file을 이용하여 함수 명 정의  함수 목적이 잘 드러나도록 기술  함수 목적을 코멘트로 기술 /*********************************************** * System : MOAKEY IM (Input Method) * File : MOAIM.h ************************************************ /* MSG Callback Function */ LRESULT CALLBACK MOAWndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DoCreateSIP (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DoPaintSIP (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DoLButtonUpSIP (HWND, UINT, WPARAM, LPARAM); /* SIP 이미지를 drawing 한다. */ void drawingSIPImage(); /* SIP 상에서 Key가 눌렸다가 떼어졌을 때 처리*/ void onLButtonUp(); ..... ..... Jintae Kim page 9
  • 10. Make the relations between functions DoCreateSIP() … … MOAWndProc() DoPaintSIP() drawingSIPImage() … … DoLButtonUpSIP() onLButtonUp() Jintae Kim page 10
  • 11. Inject the relations of functions into source code MOAWndProc() DoPaintSIP() drawingSIPImage() LRESULT CALLBACK MOAWndProc (HWND RESULT CALLBACK DoPaintSIP (HWND void drawingSIPImage() p_hwnd, UINT p_wMsg, WPARAM p_wParam, p_hwnd, UINT p_wMsg, WPARAM { LPARAM p_lParam) /* { p_wParam, LPARAM p_lParam) 현재모드에해당되는키보드이 switch( p_wMsg ) { 미지를화면에출력해준다.*/ { /* Display(가로/세로방향) 모드를확인한다. */ return; case WM_CREATE: setDisplayMode(); } return DoCreateSIP (p_hwnd, p_wMsg, p_wParam, p_lParam) ; /* Display 모드와SIP 모드에따라IP(Input case WM_PAINT: Panel) Window사이즈및위치를조정한다. */ return DoPaintSIP (p_hwnd, p_wMsg, setSIPWndPosition(); p_wParam, p_lParam) ; case WM_DESTROY: /* SIP 이미지를drawing 한다*/ return DoDestroySIP (p_hwnd, p_wMsg, drawingSIPImage() p_wParam, p_lParam) ; default: break; /* 모아키가활성화되어있는경우다시그려준다. } */ return DefWindowProc (p_hwnd, p_wMsg, drawingMOAKeyImage(); p_wParam, p_lParam); } return 0; } Jintae Kim page 11
  • 12. Validate dummy structure • 기본설계에 나타나는 구조와 소스코드의 구조 일치 소스상의 Call 구조의 예 • Call Depth (0.32) / function Complexity (1.69) 양호  소스코드를 이해하기에 적절하다 (이유: 실제 구현이 이뤄지지 않고 구조만 잡았기 때문) • Unused functions 존재  기본설계 시 파악 치 못한 관계 존재하여 발생 (3개) (call graph 반영) Jintae Kim page 12
  • 13. Inject the relations of functions into source code • 함수의 파라미터, 반환 타입 • 함수 실행 조건 구현 구현 void drawingSIPImage(HWND p_hwnd) void drawingSIPImage(HWND p_hwnd) { { #ifdef DEBUG_MOAIM /* Pre Condition */ ASSERT(p_hwnd != NULL); ASSERT(g_nSelSIPMode > -1); ASSERT(g_nSelSIPMode < MAX_SIP); /* SIP에해당되는이미지값이지정되어있어야한다.*/ ASSERT(sip_img_map[g_nSelHandlerMode][g_nSelDisplayMode ][g_nSelSIPMode][g_nSelInputMode].id > -1); #endif // DEBUG_MOAIM // // 현재모드에해당되는키보드이미지를화면에출력해준다. 현재모드에해당되는키보드이미지를화면에출력 해준다. #ifdef DEBUG_MOAIM /* Post Condition */ #endif // DEBUG_MOAIM return; return; } } Jintae Kim page 13
  • 14. Validate the whole structure of dummy functions • 상세 설계의 구조가 소스코드 상에 잘 투영되었는지 검증  return / parameter type의 추가로 인한 구조 변경 여부 검증: 변경 사항 없음  Prototype 검증 시 발생된 추가/삭제된 함수의 구조 반영 여부 확인: 2개 함수가 구조에 반영 • Call Depth (0.67) / function Complexity (1.88) 양호  소스코드를 이해하기에 적절하다 (이유: 실제 구현이 이뤄지지 않고 구조만 잡았기 때문)  Prototype 검증때 보다는 call depth, function complexity 증가하였으나 그래도 적절한 수준 • Unused functions 존재  Prototype 검증시 파악된 3개 함수 중 2개만 반영  미반영 함수는 debug 메시지를 위한 함수였음 Jintae Kim page 14
  • 15. Realize the algorithm of functions • 검증된 구조를 바탕으로 실행 가능한 알고리즘 구현 void drawingSIPImage(HWND p_hwnd) { /* image cx */ #ifdef DEBUG_MOAIM sip_img_map_cache[g_nSelInputMode].rect.right – /* Pre Condition */ sip_img_map_cache[g_nSelInputMode].rect.left, ASSERT(p_hwnd != NULL); /* image cy */ ASSERT(g_nSelSIPMode > -1); sip_img_map_cache[g_nSelInputMode].rect.bottom – ASSERT(g_nSelSIPMode < MAX_SIP); sip_img_map_cache[g_nSelInputMode].rect.top,hdcMem, 0, 0, SRCCOPY); /* SIP에해당되는이미지값이지정되어있어야한다.*/ SelectObject(hdcMem, hOldSel); ASSERT(sip_img_map[g_nSelHandlerMode][g_nSelDisplayMode][g_nSelSIP DeleteObject(hBmp); Mode][g_nSelInputMode].id > -1); DeleteDC(hdcMem); #endif // DEBUG_MOAIM /* SIP 과Application간경계선그려주기*/ // 현재모드에해당되는키보드이미지를화면에출력해준다. MoveToEx(hdc, 0, 0, NULL); HDC hdc = GetDC(p_hwnd); LineTo(hdc, sip_wnd_rect_cache[g_nSelInputMode].right,0); HDC hdcMem; ReleaseDC(p_hwnd, hdc); HBITMAP hBmp, hOldSel; hdcMem = CreateCompatibleDC(hdc); #ifdef DEBUG_MOAIM hBmp = LoadBitmapW(g_hInst, /* Post Condition */ MAKEINTRESOURCE(sip_img_map_cache[g_nSelInputMode].id)); #endif // DEBUG_MOAIM hOldSel = (HBITMAP)SelectObject(hdcMem, (HBITMAP) hBmp); BitBlt( return; hdc, } /* image x */ sip_img_map_cache[g_nSelInputMode].rect.left, /* image y */ sip_img_map_cache[g_nSelInputMode].rect.top, Jintae Kim page 15
  • 16. DBC (Design By contract) • 정직한 거래를 보장하는 최선의 해법 중 하나는 계약 • 계약 - 상대편과 자신의 권리와 책임을 정의 - 계약 위반 시 손해에 대해서도 정의 • DBC(계약에 의한 설계) - 프로그램의 정확성을 보장하기 위해 소프트웨어 모듈의 권리와 책임을 문서화 하는데 초점 - 프로그램의 정확성: 스스로 자신이 하는 일이라고 주장하는 것보다 많거나 적지도 않게 딱 그 만큼만 하는 것 Jintae Kim page 16
  • 17. DBC (Design By contract) • 선행조건(precondition) - 함수/메소드가 호출되기 위해 참이어야 하는 것 - 즉, 함수/메소드의 요구사항 - 선행조건이 위반된 경우(계약위반) 호출되어서는 안 된다. - 제대로 된 데이터를 전달하는 것은 호출하는 쪽의 책임이다. • 후행조건(postcondition) - 함수/메소드가 자신이 할 것이라고 보장하는 것 - 즉, 함수/메소드가 완료되었을 때 세상의 상태 - 후행조건이 있다는 것은 곧 그것이 종국에는 종료될 것이라는 걸 암시. - 무한반복 허용되지 않음 Jintae Kim page 17
  • 18. DBC (Design By contract) • 모듈불변식(module invariant) - 호출자의 입장에서 볼 때는 이 조건이 언제나 참이라고 모듈이 보장 - 함수/메소드의 내부 처리 중에는 불변식이 참이 아닐 수도 있지만, 종료하고 호출자로 제어권이 반환되는 때에는 불변식이 참이 되어야 한다. - 불변식에 관여하는 어떤 데이터 멤버에게도 모듈이 무제한적인 쓰기 접근권을 줄 수 없다는 것을 기억하라  추가 계약 내용 - 만약 호출자가 로틴의 모든 선행조건을 충족한다면, 해당 루틴은 종료 시 모든 후행조건과 불변식이 참이 될 것을 보증해야 한다. Jintae Kim page 18