Download VCard

© 최병일 1981-‘10

'2008/05'에 해당되는 글 3건

  1. 2008/05/19 객체간 소통에 관한 낙서(2)
  2. 2008/05/18 객체 지향 소프트웨어 일주 - 5
  3. 2008/05/08 객체 지향 소프트웨어 일주 - 4

객체간 소통에 관한 낙서

작성자: yagur Rev : 1

 두명의 사람이 대화를 한다면...
사용자 삽입 이미지


세명의 사람이 대화를 한다면...
사용자 삽입 이미지

열명의 사람이 서로 전부 정보를 전달하게 된다면...

사용자 삽입 이미지

이 그룹에 한명이 정보를 바꾸면 어떤 상황이 벌어질까? 전부 변경된 정보를 얻을 확률은? 정보의 변경 영향력을 추측하기 어려울것이다.
이들의 중간 매개체가 존재한다면 어떠할까?

사용자 삽입 이미지

 예를 들면 위키 같은것....
 하지만 구성원이 위키를 확인하기전까지, 구성원에게 정보가 갱신이 되지 않을수도 있다. 그래서 이들 구성원은 때론.... 탑다운 형태를 지니기도 한다.
사용자 삽입 이미지
  이들은 모두 역활로 정의된 것들을 실체화 하는 구성원들이다. 모두 대체될수 있는것이 이상적일것이며, 저들의 정보 소통경로의 효율성에 따라 해당 그룹의 품질은 평가 될수 있다.
  지금 작성하는 객체들은 어떠할까? 모두가 모두를 알아야 할정도로 정보 소통의 경로가 복잡하지 않은가? 정보 공개의 제한을 어디까지 해야 객체간의 효율적인 정보 교환이 이루어질까...
 
Tag
card.ly
Top
Comment 2 Trackback 0
  1. 황상철 2008/07/11 00:18 address edit & delete reply

    이야 참 재밌네요. 사람을 더 추가하게는 프로젝트를 도와주는게 아니라는 말이 생각납니다. ^^

    • yagur 2008/07/12 23:20 address edit & delete

      존재 목적 그리고 정보 소통 방법과 소통량이 인적자원 혹은 객체자원에게 중요한것 같습니다. 구멍난 배에 사람을 더 태우는면 더 빨리 가라앉을것 같습니다. =)

Trackback : http://yagur.impon.net/trackback/140 관련글 쓰기

객체 지향 소프트웨어 일주 - 5


작성자: yagur Rev : 2

Around Object Oriented Software - 5

  은닉(Encapsulation, Information Hiding)

 정보 은닉에 관해서는 파나스가 옳았고 저자가 틀렸다. 저자는 7장에서 파나스의 개념을 '참사로 이끄는 처방'이라고 보고 배제했다. 그 때는 파나스가 옳았고, 저자가 틀렸다. 하지만 저자는  이제 객체 지향 프로그래밍에 흔하게 구현되는 정보 은닉이 소프트웨어 설계 수준을 높이는 유일한 길이라고 확신한다.
- 프레더릭 브룩스

  모듈 혹은 객체의 은닉은 소프트웨어에서 매우 유용한 개념으로 자리잡고 있다. '감추다'라는 은닉의 사전적 의미를 그대로 받아들이면 된다. 감추어서 얻는 이득은 무엇일까? 활용의 시각(응용 영역)에서 보았을때 은닉은 생산성의 향상과 변경 영향력의 감소를 가져온다. 자동차에서 이 은닉의 적절한 예를 볼수 있다.

사용자 삽입 이미지
  좌측은 수동기어, 우측은 자동기어

  '수동 기어'와 '자동 기어'의 차이점은 무엇일까? 자동 기어는 사용자로 하여금 주행시 기어 조작의 기능을 은닉해버렸다. 덕분에 아래와 같이 인터페이스가 작아졌다.

사용자 삽입 이미지
좌측은 수동기어 차량의 패달, 우측은 자동기어 차량의 패달

  자동차량을 몰게 되면 차량 운행의 본 목적에 좀더 집중할수 있다. 왼쪽 발을 쉬게 하고, 주행시 기어 변경을 할 필요가 없으므로 오른손으로는 다른 행동을 취할수 있다. 신경 쓸것이 적어 졌으므로 차량 응용(운전, 길찾기, 주변상황에 따른 방어운전 등) 자체에 좀더 집중할수 있게 되는것이다. 그리고 차량 운행에 필요한 학습량을 줄일수 있다. RPM과 속도에 따라 어떤 기어를 선택해야하는지, 그리고 클러치의 사용방법과 같은 것은 이제 필요 없어졌다.
  기능이 은닉된 자동 기어 탑제 차량의 판매량이 수동 기어 탑제 차량의 판매량을 월등하게 압도하고 있다. 이를 보았을때 사용자는 자동 기어 차량(기능 은닉이 이루어진 제품)을 선호(생산성 향상의 이유)한다고 볼수있다.
  작은 인터페이스는 은닉과 관련이 있다. 인터페이스가 작아짐으로서 사용자는 응용 대상과의 정보 소통량이 줄어들기 때문이다.
  이전 글의 마무리 부분에 은닉의 방법에 따라 다른 시점에서 구성력을 다룰수 있다고 끝맺음 하고있다. 의존 대상와 연관되어있는 모듈(혹 객체)들을 은닉한다면 사용자는 모듈의 독립성을 느끼기 때문이다. 포도송이 들여오기(전글의 예)의 시각화된 그림을 빙산으로 생각해볼수 있다.

사용자 삽입 이미지
포도송이를 빙산으로

  수면위의 모듈은 사용자에게 공개된 공개 부분이고, 수면아래의 모듈들은 의존성을 맺고 있는 은닉된 모듈들이다. 하지만 사용자는 이 정보들이 은닉되어 있기 때문에 공개된 모듈의 인터페이스에 의존하면된다. 빙산의 일각만을 보면 되기때문에 작은 인터페이스의 효과를 갖게 된다.
  객체를 대상으로 바라 보았을때 C++에 pimpl idiom이란 아주 간단한 예가 있다.

class Engine;
class Gear
{
public:
    void SetGear(...);
private:
    Engine* m_pEngine;
};
 pimpl idiom의 예

  위의 소스에서 Engine을 멤버로 갖고 있지만 그것이 무엇인지 사용자는 몰라도 된다. Gear를 변경하면 Gear의 구현부인 소스만이 Engine 객체에 의존성을 둔다. 사용자는 헤더에서 빙산의 일각 즉 Engine이 Class이다 란것만 알면 된다. 그리고 Gear가 어떻게 Engine에 영향을 미치는지는 은닉된다.
  여기서 좀더 은닉하기 위해 의존성 줄이기Depedency Break를 시도할수 있다. Gear를 Interface로 분리해 공개 영역으로 노출하고 구현은 은닉하는것이다.

사용자에게 노출되는 인터페이스
class GearInterface
{
public:
    void  SetGear(...) abstract;
};

은닉되는 구현부
class Engine;
class ConcreteGear : public GearInterface
{
public:
    void  SetGear(...) override;
protected:
    Engine* m_pEngine;
};

  사용자는 공개 노출되는 인터페이스만으로 접근하기 때문에 Engine을 알필요가 없다. Engine 객체는 수면아래로 은닉되는것이라 할수 있다. pimpl 관용구를 통해 구현부안에서도 의존성을 줄이고 있고, 사용자의 응용 영역에 노출되는것은 인터페이스이기때문에 구현을 또한번 은닉하게 된다.
   이 은닉과정을 객체뿐 아니라 이들이 응집된 결과물인 모듈에도 같은 원리로 적용될수 있다. 무엇을 노출하고 무엇을 은닉할지는 결코 쉬운 문제가 아니란것은 아쉬운 부분이다. 하지만 일반화와 추상화를 통해 작은 인터페이스를 만들고, 구현을 은닉함으로서 해당 모듈의 교체를 쉽게 하는것은 모듈의 독립성, 구성력에 큰 도움이 되리라 믿어 의심치 않는다.

'개발 > 수필' 카테고리의 다른 글

테스트와 장인 - 10  (0) 2008/09/30
테스트와 장인 - 9  (0) 2008/07/12
객체 지향 소프트웨어 일주 - 5  (0) 2008/05/18
객체 지향 소프트웨어 일주 - 4  (0) 2008/05/08
객체 지향 소프트웨어 일주 - 3  (0) 2008/03/28
테스트와 장인 - 8  (0) 2008/03/19
Tag
card.ly
Top
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/139 관련글 쓰기

객체 지향 소프트웨어 일주 - 4


작성자: yagur Rev  : 1

 Around Object Oriented Software - 4

  1.모듈성(Modularity)

  객체 지향적인 소프트웨어를 작성하는 커다란 이유 중 하나는 재사용성Reusability과 확장성Extendibility이다. 굳이 객체 지향 개발에 국한시키지 않아도 재사용과 확장은 소프트웨어 개발에 중요한 의미를 지니고 있다. 의도적이던 비의도적이던 어플리케이션 제작을 확장이란 관점에서 보면, 우린 수직적인 추상도를 아래와 같이 그릴수 있다.

사용자 삽입 이미지
어플리케이션 수직적 추상도

  위에서 밑으로 의존성Dependency을 지니고, 아래에서 위로 확장Extending된다 할수 있다. 이들 확장 과정에 생긴 라이브러리들은 일종의 모듈이고, 목적이나 명세에 맞게 그 기능들이 응집되어있다. 그렇다면 이 응집력Cohesiveness의 기준을 무엇에 둘것인지 생각해볼수 있다. 고려해야할 것들은 굉장히 많다. 공통적 특성, 명세, 프로젝트 상황등등 수도 없이 많은 이론과 시공간적인 조건들이 존재한다. 아쉽게도 명쾌하게 이들을 구분하고 구성하는것을 쉬운것과 어려운것으로 분류 해야한다면, 어려운쪽에 속할것이다.
  객체지향을 실현하는 것은 객체란 응집 대상을 디자인하는것이고, 또 이들이 응집되어 파생된 결과물을 모듈화하는것이다. 모듈성을 지니기 위해 여러가지 사항들을 고려해볼수있다.

   1-1 모듈의 독립성(Modular Independability)

  어떠한 바보라도 일을 더 크고, 훨씬 복잡하고, 격렬하게 만들 수 있네. 반대 방향으로 돌리기 위해선 천재의 손길과 엄청난 용기가 필요하지.
- 존 드라이든

  지금 생산중인 어플리케이션은 모듈화 되지 않고, 복잡하게 얽히고 설킨 한그릇의 스파게티인가? 나중에 가서 이들의 응집성을 고려해 모듈화하려하면 어떤 상황이 올지 상상해보자. 이 상상이 즐겁다면 작업물의 생산과정이 타의 모범이 될만한것이고, 이 과정이 괴롭다면 '천재의 손길'과 '엄청난 용기'의 필요성을 느끼기 시작한것이다. Unix의 철학인 KISS(Keep it simple s....)를 항상 염두하고 모듈화한다면, '용기'와 '천재의 손길'의 필요 횟수를 줄일수 있을것이다.
  일부를 수정하기 위해 작업을 할때 변경의 여파를 고려해보자. 이는 모듈화에 필요한 응집성의 기준을 정립하는데 적지 않은 도움이 된다. 이는 모듈의 독립성과 관련이 있는데, 서로 다른 두 모듈은 서로의 변경으로부터 자유로워야 한다는 것이다. 이 글의 수직추상도의 하부에 위치하는 레이어들은 주로 그런 특성을 지니고 있다. 하지만 많은 모듈은 다른 모듈에 연관성을 지니고 있으며, 이는 상위 레이어로 갈수록 더욱 그러하다.
  프로그램 모듈은 언어의 연관성의 세계에서 주로 확장되기 때문에 독립성을 너무 중시하면 생산의 효율이 떨어질수도 있다. 모듈의 위치를 잘분석하고 독립성이란 특징을 잘 해석해 적용해야할것이다.

사용자 삽입 이미지
연쇄 반응Chain Reaction

  위의 그림은 연쇄 반응에 관한 그림이다. 하나에 변경을 주었을때 연쇄적으로 다른것이 영향을 주게 되는것을 그림에서 볼수 있다. 모듈의 연관성이 수직적으로 이루어졌을때, 그 레이어가 높은곳에 있을수록 하위 레벨에 여러 레이어에 의존하고 있을 가능성이 크다. 이 경우 하위 레이어(혹은 모듈)의 변경이 있을경우 상위 레벨 레이어(혹은 모듈)들은 연쇄적으로 오동작하는 반응을 보인다.

사용자 삽입 이미지
변경 연쇄 효과 영향력

  이때 수평적인 관계에 있는 모듈(레이어 깊이 레벨이 같은경우)들이 연관되어 있다면 상하개념이 아닌 수평적인 위치에 있는 모듈들까지 이 연쇄 반응에 휘말리게 된다. 나비효과Butterfly Effect를 벗어나려면 수평적 위치(같은 레벨의 레이어)에 속한 모듈들은 서로간의 의존성을 끊고 서로간에 독립성을 보장해주는것이 좋다. 그렇다면 이들은 서로 변경의 영향력에서 벗어나, 변경의 연쇄 반응에서 벗어날수 있다.

사용자 삽입 이미지
좌측은 동일 레이어의 모듈간 연관성이 있는 경우, 우측은 독립성이 보장되는경우

  최악의 연쇄반응을 잃으키는 방법들중 몇가지를 소개하자면 소프트웨어 동작 플랫폼 교체, 언어의 컴파일러 버젼을 옛날것으로 바꾸기 등이 있다. 개발자에겐 핵폭팔과 같은 연쇄반응을 잃으키지 않을까? 이 독립성 보장은 모듈의 분해력, 구성력과 관련이 있다.



  1-2 모듈의 분해력(Modular Decomposability)

  거대한 모듈 혹은 여러 기능이 응집된 모듈은 공통의 문제 영역을 위해 응집되어있다. 이들은 더 작은 하위 문제 영역(subproblem domain)으로 분해될수 있다.

사용자 삽입 이미지
모듈 분해의 시각화

 보라색 원모듈이고 원을 이어주는 하늘색 선의존 관계를 나타낸다.

  너무 많은 분해는 의존성 복잡도를 증가시켜 관리하는데 어려움을 주지만, 적절한 분해는 재사용성을 증대시키고 변경 영향력의 확산을 줄여줄수 있다. 이때 고려해야할 사항은 모듈의 레이어상의 위치, 그리고 이들의 의존성 관계이다. 의존성은 최대한 줄여 독립성을 최대한 보장하고, 그 연결고리를 명확히 해야한다. 그래야 책임과 분배가 더욱 쉬워진다.
  명확한 의존성 정의에 관한 예를 하나 들어 보자. "이 수학 라이브러리를 업데이트 하려면 인텔 컴파일러가 필요하다. 하지만 컴파일된 결과물은 비주얼 C++에서도 링크해 사용할수 있다." 라는 의존성 정의는 사용자나 개발자가 절대 알아야할 의존 정보이다. 의존성이 명확하기 때문에 사용자는 인텔컴파일러를 써서 컴파일하고, 응용프로그램 제작시엔 비주얼 스튜디오에서 링크해 개발을 진행할수있다. 이런 사소한 컴파일 지침도 의존성이 존재한다. 복잡하고 엔트리가 많은 소프트웨어 모듈은 더욱 명확한 의존성 정의가 필요할것이며, 간결하고 그 수가 적을수록 구성Compose에 효율성을 띌것이다.
  분해력을 지니되, 역으로 분해된것이 어떻게 구성되어질지를 염두한다면 좋은 모듈의 구조를 이루는 첫발이 될것이다.


  1-3 모듈의 구성력(Modular Composability)

  모듈은 문제 영역에 따라 구분된 재사용 가능한 집합체이다. 이 모듈을 재사용해 하나의 시스템을 구성하지 못한다면 재사용성이 매우 떨어진다고 볼수있다. 그리고 이는 모듈이라 부르기에 부끄럽다.

사용자 삽입 이미지
포도송이 들여오기(응용 프로그램과 다른 영역의 모듈간의 링크)

   위의 그림은 응용 프로그램에서 하나의 모듈을 링크하려했는데 포도송이 같이 다른 모듈이 줄줄히 따라오는 경우이다. 이것이 잘된 구성일까? 과도한 분해와 잘못된 의존 관계 정립은 저런 결과를 가져올수도 있다. 필요에 의해 필요한것만 의존성을 지니게 하는것은 모듈의 독립성에 따라 좌우된다 할수 있다.

사용자 삽입 이미지
독립성이 보장된 모듈들의 링크

  독립성을 어느정도 지닌 모듈이라 하면 의존성을 아껴쓴 모듈을 말한다. 이들은 응용 영역에서 링크를 해도 다른것에 의존성이 생기거나, 원치 않는 기능이 딸려 올 확률이 적다. 하지만 지나치게 독립성을 강조하게 되면
기능의 중복이 생길 우려가 있다. 공통적이 기능은 다른 모듈에 의존하여 해결하면 되는데, 독립성 보장이란 이유로 기능을 중복해버리고 다른 모듈로의 의존관계를 끊어버리는 경우가 생긴다. 독립성과 연관성의 복잡함사이에 적절한 트레이드 오프는 필요하다고 보여진다.
  독립성을 최대한 살린 모듈들의 구성력이 좀더 낳으며, 변경의 영향력에 좀더 안전하다. 이는 모듈 자체의 엔트리가 대부분 공개된 경우이다. 하지만 모듈의 정보의 은닉을 어떻게 할지에 따라 이 기준은 또 다른 시점에서 다뤄질수 있다.

'개발 > 수필' 카테고리의 다른 글

테스트와 장인 - 9  (0) 2008/07/12
객체 지향 소프트웨어 일주 - 5  (0) 2008/05/18
객체 지향 소프트웨어 일주 - 4  (0) 2008/05/08
객체 지향 소프트웨어 일주 - 3  (0) 2008/03/28
테스트와 장인 - 8  (0) 2008/03/19
객체 지향 소프트웨어 일주 - 2  (2) 2008/03/15
Tag
card.ly
Top
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/137 관련글 쓰기