티스토리 툴바

Designing a Component는 UI 컴포넌트 설계를 다룬 글이다. 하지만, 라이브러리나 비즈니스 컴포넌트에 투영해보아도 훌륭하게 적용된다. 무엇보다 세 가지 항목으로 정리할 수 있다는 것은 매력적인 추상화다.

Make the component specific in purpose, yet flexible in use.
기능을 추가하다가 누더기게 되게 하지 말라. 요구사항이 증가하면 컴포넌트는 변모하게 되어 있다. 그래서 리팩토링이 필요하고, 클래스 수준에서 보면 역할을 적절하게 분배하여 효과적으로 협업(collaboration)하게 해야 한다.

여기서 다소 느닷 없는(?) 길로 들어서보자. 성인이면 여러 가지 역할을 부여 받기 마련이다. 가령, 직장인이라면 회사에서 하나 이상의 역할을 수행하게 되고, 부모님이 계시면 자식으로써의 역할, 결혼한 분들은 배우자로써의 역할, 아이가 있다면 부모의 역할이 있다. 이러한 역할이 만만치 않은 이유는 동시에 수행해야 한다는 점이다.

이러한 책임 사이에서 적절하게 조화를 이루지 못하는 사람이 소프트웨어 설계를 맡게 되면 잘 할 수 있을까? 둘은 완전히 다른 문제인가?

결론은 소프트웨어 컴포넌트나 사회인으로써나 다양한 역할에 대해서 초점을 분명히 하여 '할 것만 하고', 상황 변화에 유연하고 기동성 있게 대처해야 한다.


Separate the concerns of interface, interaction, and content.
model view controller 아키텍처 패턴이 떠오른다. 하지만, 도리어 interface, interaction, content가 더 어감이 좋다. 앞서 말한 초점을 분명히 하는 기법 중 하나로 볼 수 있다.

Document the interface and use the component before releasing it.
당연한 것이지만 개발자 입장에서 늘 간과하기 쉬운 요소이다. 쓰지 않으면 컴포넌트로써의 가치가 없게 된다.

오픈시드에 참여하면서 커뮤니티 활동과 지식 공유에 열심인 이들은 새로운 문서화(Documentation) 방법을 고민하고 있음을 알 수 있다.

문서 하면 종이나 텍스트 형태의 전자 문서를 떠올리게 된다. 그러나, 음성이나 영상 형태로 문서화를 하는 것이 더 효과적인 경우가 있는 것 같다. 요약이 어렵다는 것이 최대의 약점이지만, 전달의 효율성 입장에서는 텍스트 문서에 비할 바가 아니다.

동영상 제작에도 여러 가지 기법이 있다. 직접 촬영을 할 수도 있지만, 화면 캐스팅을 할 수도 있고, 온라인 회의와 병행한 화면 캐스팅도 가능하다.

사무실에서 서류철이 자취를 감춘 것을 떠올려 보면, 문서화를 텍스트에 국한해 생각하는 관념을 서서히 탈피해야 할 때가 온 것 같다.

설정

트랙백

댓글

Figure 4: Metamodel and model approach

발췌한 글 논지의 중심에 선 그림은 아니지만, 글 자체보다는 이 그림이 확 시선에 들어왔다.

모델러가 모델을 그릴 때는 메타를 염두해야 한다.
메타(Meta)라는 말을 알 필요는 적다.
더구나 거북한 단어니까 가급적 남용할 필요도 없다.
다만, 어떤 기준을 가지고 모델을 도출하고 표현해야 하는데 그 기준이 곧 메타라 할 수 있다.

UML로 객체지향 모델링을 하면 가장 기본적인 단위가 클래스이다.
클래스 역시 일종의 타입이 된다.
모델링을 하면 구체적인 타입으로 클래스 이름이 부여된다.
클래스라는 타입과 개별 클래스 사이에서의 구분이 요구되는 경우는 거의 늘상 일어난다.
가령, 한국과 개별 번지 사이에 구분이 필요한 것처럼 세상은 무척 복잡하기 때문이다.

그래서, UML에서 확장방안으로 제공하는 것이 스테레오타입(stereotype)이다.
그렇다고, 반드시 스테레오 타입에 메타 타입을 부여해야 할 이유는 전혀 없다.
모델은 의사소통을 위한 것이라는 대전제를 잊지 않는한 그야말로 아무거나 부여할 수 있다.
'왜 그런 것을 스테레오타입으로 부여하느냐'라고 묻는 분들에게 대답을 준비할 필요는 있다.

하지만, 효용성의 관점과 형식적 완성이 늘 부합하지는 않는다.

그래도 우리는 선택의 자유가 있다. ^^

나는 대개의 경우 둘 사이의 조화를 찾으려고 노력한다. 조화가 궁극에 다다르면 오늘 조엘이 올린 글에 소개된 다리처럼 우아함을 갖게 된다.



하지만, 소프트웨어 개발에서는 우아함만 고수하기엔 현실이 척박하다. 따라서, 둘 중 하나를 포기해야 할 상황이 발생하고... 나는 어느 때고 효용성을 택한다. 그리고, 그래야 한다고 떠들고 다닌다. (그래서, Pragmatic 시리즈가 너무 좋다. ^^)

어디까지나 순전히 가상상황이지만, 내가 어떤 제품을 쓰는데 클래스나 메소드이름을 영문과 숫자가 섞인 12자리 암호로 정해야 한다면 어떻게 할 것인가? 스테레오타입에 한글 클래스명을 넣겠다. UML만 공부한 사람이 '쟤는 UML 알긴 하는거야' 라고 코웃음 칠 수 있지만... 나는 UML을 졸업했으니까, 굳이 규정(disciplines)에 얽매일 필요는 없다.

규칙과 원칙(principle)이 충돌하면, 원칙을 새우기 위해서 새 규정을 만들어야 한다.

설정

트랙백

댓글

에서 애플리케이션의 사용자 인터페이스나 사용성(Usability)에 대해서 배울 만한 점을 찾아본다.

사용자 삽입 이미지

구글의 SearchMash는 UI의 본질적인 개선을 볼 수 있다. 단순한 스타일을 고수하면서, 대개 검색엔진 사이트에서 광고등의 용도로 사용하는 오른편의 공간을 보면 특정 분류별 검색 결과를 별도의 키입력 없이 빠르게 볼 수 있게 배려했다. 물론 이러한 UI를 돋보이게 하는 바탕에는 구글의 정교한 검색 결과가 있다. Live.com 역시 비슷한 스타일을 제공하지만, 검색 결과를 보면 확연한 차이를 느낄 수 있다.


검색 품질이 떨어지지만, UI 관점에서만 보면 snap은 놀라울 정도로 인상적이다.
사용자 삽입 이미지

검색 결과가 왼쪽에는 목록으로 오른쪽에는 미리 보기로 배열된다. 스크롤을 하면 뒤쪽의 항목이 자동으로 로딩 되어서 페이지를 클릭할 필요가 없다.

사용자 삽입 이미지

도움말도 매우 직관적이다. 설명이 없어도 충분히 직관적인 인터페이스인데, 그야말로 직관적인 설명을 제공한다.

설정

트랙백

댓글

http://groups-beta.google.com/groups/roundedcorners?c=666666&bc=white&w=80&h=80&a=tr

이렇게 입력하면

http://groups-beta.google.com/groups/roundedcorners?c=666666&bc=white&w=80&h=80&a=tr

위와 같은 둥근 모서리를 만들어낼 수 있다.

그야말로 구글 스타일이다.
개념적으로 이랬으면 하고 떠올릴만한 개발자 API
실제 그것을 범용화 하여 만들어내기는 쉽지 않다.

구글은 마치 생각만 하면 만들 수 있는 이들 같기도 하다.
웹개발자라면 위 주소를 보고 단박에 사용법을 짐작하리라

C는 Color에 대한 RGB 값이고,
BC는 Background Color,
W는 Width
H는 Height

유일하게 Zach의 설명이 필요한 것은 a이다.
A는 which corner를 의미했고, tr이란 Top Right를 의미했다.


출처: http://xach.livejournal.com/95656.html

설정

트랙백

댓글

간단한 클래스 하나로 테스트해본다.

사용자 삽입 이미지

Ctrl+G로 코드 생성을 해보면 finalize() 메소드가 생성된다.
이를 막으려면 아래와 같이

사용자 삽입 이미지

Generate Desturctor 옵션을 끈다.(디폴트는 ON)
생성된 코드를 이클립스에서 열고 Alt+Shift+S > Generate Getters and Setters
EA 모델에서 다시 Ctrl+R 하면 getter/stters가 추가된다.

사용자 삽입 이미지

살짝 아쉬운 것은 프로퍼티 메소드는 보기 싫어서
Feature Visibilities... 에서 Hide Property Methods 옵션을 꺼도 변화가 없다는거..
뭐냐.. 이넘은.. C# 전용인거냐?

설정

트랙백

댓글

Elastic tabstop, 탭과 스페이스 사용 논란을 잠재워줄까?에서 발췌한 그림


그냥.. 뭐라 토를 달 만한 말이 떠오르지 않지만 훌륭한 인터페이스 인 것 같다.
수만님의 표현에 그대로 공감이 간다.

탭의 모양이 아니라, 의미를 살린 아주 멋진 개념이라 기분좋다.

설정

트랙백

댓글

사용자 삽입 이미지


Java Persistence with Hibernate
를 보고 그림.. 다소 보강

설정

트랙백

댓글

마치 물개선생님의 댓글로 인해 글을 쓰는 듯 하여, 사람 무안하게 만든다는 인상을 줄까봐 한 템포 쉬었다 올리려다가 널리 이해하시리라 믿고... ^^

이글은 어제인가 정리하려던 내용이다. 얼마전 두 개의 솔루션 사이를 이어주는 일종의 연동 코드를 분석했다. 그 중 가장 중요한 시나리오를 그린 시퀀스는 아래 그림과 같다.

실제 코드를 분석하여 그린 그림이다. 리버스(역공학)를 이용했다면 이보다 훨씬 복잡한 선들이 표시된다. 저렇게 그린 그림은 다시 추상화 시킨 시나리오로 변경해서 개념도를 만들어 둘 사이의 연동을 표현할 수 있다. 그래야만 코드를 짠 사람과 나처럼 코드를 분석한 사람 이외에도 뭔가 대화를 할 수 있다. 저 그림을 맘에 들어하고, 뭔가 얘기를 꺼낼 만한 사람은 지구인이 아니라고 봐도 좋다. 저 수준에서는 그린 사람만이 의미를 알 수 있고, 기껏해야 코드를 작성한 개발자와 둘이서 의사소통을 할 수 있다.

종종 고객들은 역공학을 이용해서 그럴싸한 산출물을 만들 수 없는지를 묻는다. 역공학이란 소스를 분석하여 그 관계를 모델로 표현하는 일이다. 따라서, 멤버 변수가 되든 파라미터 형태가 되든 소스에 의존성이 표현되어 있어야 툴을 이용하여 다이어그램을 만들어낼 수 있다.

Spring을 사용하는 경우라면 코드에는 인터페이스에 대한 의존이 있고, xml 파일을 통해 실제 구현 클래스 의존이 삽입되는 것이 일반적이다. 이렇게 되면, 대부분의 코드에 대해 역공학이 불가능하다. 소스를 제공하지 않는 상용 프레임워크나 EJB를 사용하면 역시 중추가 되는 부분이 역공학의 영역을 빠져 나간다. 또한, SI에서 필연적으로 발생하는 연동의 경우는 거의 대부분 네트워크 통신을 포함하기 때문에 역공학이 불가능하다. 마치 차포 떼고 장기 두는 것에 비유할 수 있으려나

예전에 역공학을 처음 접했을 때, 마치 역공학이 silver bullet까지는 아니더라도 엄청난 신공이 될 줄 알았다. 2003년 봄, 역공학의 참맛을 볼 수 있는 레슨이 시작되었다. 통신쪽 JCP 멤버사인 모토로라나 에릭손 등이 짠 엔진급 코드를 분석해야 할 일이 생겼다.

나는 마치 기다렸다는 듯이 눈을 빤짝거리며, 속으로는 '드디어 리버스의 위력을 보여줄 때가 왔어'라고 외치며 기고만장해 있었다. 당시 XDE 보다는 가벼웠던 투게더를 돌려놓고, 1~2 시간을 소비하고 나면 달랑 시퀀스 한장이 만들어졌다. 긴 시간에 대해 보답하려는 듯 메시지를 나타내는 화살표가 선이 아니라 면[각주:1]으로 나타났다. 나는 그럴 리 없다며(리버스에 대한 맹목적인 신념을 버리지 못해) 몇일 인지 몇주인지를 더 날리고 나서야 자바 코드를 보며 맨땅에서 그렸다. 코드를 한 행씩 죄다 분석하면서 그리는 것은 수고스러운 일이었지만[각주:2], 기억에는 한계가 있기 때문에 분석한 내용을 시퀀스로 그려놓고 나면... 길고 긴 코드를 분석해낸 내용이 퍼즐맞추기처럼 축적되었다.

역공학을 유용하게 쓸 수 있는 곳은 많아 보이지 않는다. 단지 추측에 지나지 않지만 임베디드쪽에 도입하면 가장 효용성이 높을 것 같다. 솔루션의 엔진 부분에서 모델과 코드를 고도로 동기화 하고자 한다면 유용할 수도 있을 것 같다. 하지만, 그 외의 경우라면 역공학은 단지 허접한 클래스 다이어그램 생성기 정도를 넘어서기 힘들다.

  1. 서로 호출하는 내용이 너무 많아서 최대로 확대를 해도 선과 선 사이의 분별이 되지 않는 부분이 다수 등장함 [본문으로]
  2. 그러니 쓰레기가 안나온다. [본문으로]

설정

트랙백

댓글

커리큘럼 구성을 고민하는 교수님을 만났다.
'데이터베이스는 필수이고, 그리고 SQL도 해야겠지'라는 말씀을 할 때
데이터베이스는 필수지만, SQL에 대해서는 좀 생각해볼 여지가 있다는 견해를 피력했다.
ORM을 활용하면 SQL은 주역이 아니라 조연이 된다고 하자 놀라셨다.

복잡한 SQL은 객체 영역(프로그래밍 영역)의 역할을 축소시킬 수 있다.
현장에서는 SQL을 통해 추출한 결과를 단지 화면으로 전달하는
프로그래밍 모듈을 비즈니스 컴포넌트라고 부르는 경우를 어렵지 않게 찾아볼 수 있다.

객체에 로직을 넣는 것과 SQL 혹은 Stored Procedure에 로직을 넣는 것 중에 어떤 것이 유리할까?
데이터베이스를 지지하는 사람들은 늘 "성능"을 이야기한다.
그렇다면, 객체에 로직을 넣게 되면 어떤 점이 유리할까?

가장 두드러져 보이는 부분은 변화에 대한 적응성이다.
Real-time Enterprise라는 개념이 등장하는 배경에는 갈수록 중요해지는 유연성과 적응성이 있다.
리팩토링 데이터베이스에서 언급한 것처럼 개발자들은 변화에 대처하는 쪽으로 선회하여 많은 발전을 했다.
반면, 데이터베이스 진영은 변화를 극도로 꺼린다. 글쎄라고 여겨지면 어렵지 않게 확인해볼 수 있다.
바로 DBA를 찾아서 스키마를 바꿔달라고 해보자!

대부분의 IDE는 리팩토링을 지원한다.
SQL이나 테이블 구조에 대한 리팩토링을 지원하는 도구는 아직 없다.
데이터베이스 진영이 변하지 않는다면 SQL을 완전히 ORM으로 대치해야 할런지도 모른다.
변화에 기민하게 대처하도록 요구될 시대를 맞이하게 되면...

ORM 도입의 선행 조건

ORM

설정

트랙백

댓글

테스터는 프로젝트의 전조등이다.
테스터는 프로젝트의 앞길을 환하게 비춰주어야 한다.
프로그래머와 관리자들이 지도를 놓고 어디로 가야하는지에 대해 언쟁을 벌이더라도 꿋꿋하게 앞길을 비춰주면서, 적어도 현재 위치가 어디인지, 어느 곳을 지나가고 있는지, ... 알려줘야 한다.
테스트는 분쟁의 소지를 줄여줄 수 있다. 정성적인 생각을 성공/실패로 정량화 해준다. 테스트 작성으로 문제가 해결되지는 않지만 신뢰할만한 지표 역할을 해줄 수 있다.

테스터가 실패에 초점을 맞추면 고객은 성공에 초점을 맞출 수 있다.
창의성과 기술력을 모두 동원하여 제품 내에 숨어있는 중요한 문제점을 찾아내야 한다.
제품에서 문제가 있을 곳을 찾아냄으로써 프로젝트팀이 기술과 제품의 위험요소들을 더 많이 알 수 있도록 도와준다.
성공과 실패를 바라보는 관점(vision)의 무게가 평형/조화를 이뤄야 하는 것이 아닌가 생각된다.

테스트를 통해서 품질을 보장할 수는 없다.
회사 내에서 테스트팀을 "품질 보장팀"으로 부르고 있는지도 모르겠다. ... 프로젝트의 품질을 용이하게 보장할 수 있도록 도와주는 정보를 제공할 뿐이며, 프로젝트의 품질은 전체 팀원들의 노력으로부터 나오는 것이기 때문이다.
분업의 최대 취약점은 분리에서 오는 분열이다.

문지기가 되지는 마라!
지금까지 보아온 프로젝트 중에서 가장 효율적이었던 경우는 만장일치로 제품 출시를 결정하는 것이었다. 테스터에게 출시에 대한 결정 권한이 주어졌다면 그 즉시 팀에서 다른 역할을 맡고 있는 사람이나 관계자와 함께 그 권한을 공유해야 한다는 입장을 밝히는 것이 좋다.
관리가 아닌 협업

프로세스 개선 그룹이 되는 것을 조심하라.
문제를 발견하는 것에 지쳐서 문제를 예방하기 위한 더 나은 방법은 없는지 생각해볼 수도 있다. ... 다른 팀원들이 한순간에 테스터의 노력을 헛수고로 만들어서 무능한 것처럼 보이게 되는 경우도 많이 있다. ... 테스트팀을 프로세스 평가 모임 같은 것으로 보이게 하지 않도록 주의해야 한다.

테스트를 잘 수행하기 위하여 필요한 항목들을 모든 사람들이 이해할 것이라고 기대하지 마라.
여러분이 이 책을 읽고 있다고 해서 다른 사람들도 이 책을 읽을 것이라고 기대하지는 마라.

블랙박스 테스트는 알지 못함을 기반으로 테스트를 실행하는 방법이다.

테스터는 여행객 이상이다./모든 테스트는 질문에 대한 대답을 찾는 과정이다.
어떤 문제가 있을 때 문제의 종류를 식별해내는 어떤 원칙이나 프로세스를 적용하지 않는다면 제품을 다뤄보는 행동을 테스트라고 말할 수 없다. 테스트를 진행할 때, 평가 전략을 이끌어가고 있는 의문이 무엇인지를 스스로에게 물어보라. 이러한 의문을 가지지 않는다면 테스터라기 보다는 관광객일 뿐이다.

모든 테스트는 모델을 기반으로 수행된다.
문제가 복잡해진 경우, 관점의 분화(Separation of Concerns)가 분열로 이어지는 것을 막기 위해서 모델이 필요하다. 모델은 각각의 관점에 대한 액기스만을 취합하여 이들 사이의 연계를 표현할 수 있어야 한다.

소프트웨어 테스팅 법칙 293가지
Cem Kaner 지음,
이주호 옮김/정보문화사

설정

트랙백

댓글

직업을 바꾸기 전까지는 잊지 않을 Principle of least privilege이라는 원칙은 모델링에도 적용된다.

관계(Relationship)가 있기는 한데 구체적으로 모르겠다 싶으면 일단 선을 찍 긋는다.
이를 연관(Association) 관계라고 한다. '일단 뭔가 있다'는 것이다.
그러다 서로 호출하는 혹은 서비스하는 방향을 알게 되면 방향성(Navigation)을 화살표로 표기한다.
관계에 참여하는 객체(Instance)의 숫자를 알게 된다면 수(Multiplicity)를 명시할 수 있다.

관계를 잘 살펴보니 전체와 부분이라고 여겨지면 Aggregation으로 나타내어 연관을 보다 구체화 할 수 있고, 부분에 해당하는 객체가 고유한 인스턴스로는 별 의미가 없어지는 경우라면 Composition으로 나타내어 이를 명기할 수 있다.

이 과정 전체에 걸쳐서 Principle of least privilege를 지키고 있다.
확실하지 않을 때는 구체적으로 표현하여 오류의 여지를 만들 필요는 없다.
아래는 이와 관련한 에피소드이다.

more..


설정

트랙백

댓글

갱신: 2006.11.30

From Java to Ruby: Things Every Manager Should Know (Pragmatic Programmers)에서 마틴 파울러와의 인터뷰 내용(23쪽)을 박스 처리해서 제공하고 있습니다. 마틴 파울러는 Smalltalk와 C++이 함께 쓰이던 시절 Smalltalk이 기업용 정보 시스템에는 더 유리하다고 생각했지만 결과는 반대로 나타나 의외였다고 합니다. 그리고, 자바가 등장하여 C++을 영역을 차지(killed)하자 일부를 얻었지만, 자바는 Smailltalk에 비해 퇴보했다고 이야기 합니다.

일부를 얻었다는 것은 아마도 Daddy, Are We There Yet? A Discussion with Alan Kay의 내용을 통해 유추할 수 있을 것 같습니다.

Although the present day hot OO languages, Java and C#, make a lot of their C-like syntax, much of their real roots can be found in Smalltalk.
...
Kay sees Java as falling between Smalltalk and C++. In some ways it is an improvement, in other ways it is mainly C++ with garbage collection.

자바의 객체 지향적인 특징은 Smalltalk에 근거하고 있다는 것입니다. 다만, C++을 특성을 많이 흡수하여 마치 가비지 컬렉션(garbage collection)이 추가된 C++처럼 보이기도 한다는 것이죠. 이러한 면이 Smalltalk 지지자 입장에서는 퇴보한 것으로 보이는 듯 합니다. 그럼에도 불구하고 C++과 비교해서는 Smalltalk의 대리자로써 정보 시스템 분야에 진출하게 된 것이죠.

개인적으로는 Daddy, Are We There Yet? A Discussion with Alan Kay에 있는 답글이 더 관심이 가더군요.

There was marketing. Xerox PARC is widelly known as a market failure, while Sun manage to bring Java, since its early version, to the spotlight. There is no reason that we should expect future decision to adopt this or that solution without a strong marketing support.

마케팅 관점에서 자바는 성공한 것이고, Smalltalk는 실패했다는 것입니다:
1. Successes should mix good technical reasons with strong market.

There is timing. Virtual machines are expensive in terms of speed and memory consuption. However, when Smalltalk appeared, we were "not there" yet. Smalltalk was a heavy load and it was very difficult to use. Computers were not so as wide-spread as today. Java, on the other side, got in the market "just in time" for a amazing growth of CPU and memory in a already ubiquitous PC

다음은 타이밍에 대한 지적입니다. 아무리 혁신이라도 현실적으로 수용가능한 양상으로 전개되어야 한다는 것으로 이해할 수 있을 것 같습니다:
2. Sucesses should be revolutionary and evolutionary at the same time.

There was freedom. Smalltalk was about "take it all or leave it all". Java is a language, that can be used in different environments. Developers have their ways. I, for example, around 89/90 was using Actor and not Smalltalk, because it was more windows like.

자바는 Smalltalk와 달리 개발 환경에 자유도가 높았다는 것이죠:
3. Sucesses should allow for freedom of choice in things other that its own "master concept".

Syntax also plays a role. Although Smalltalk is pure OO and beautiful, it is easier for a programmer to learn Java (most of them know Pascal/C ou Basic).

아무리 Smalltalk가 더 훌륭하다고 해도 기술은 사람을 위한 것이고, 자바가 익히기에 더 쉬웠다는 것이죠:
4. Sucesses should be affordable.  

이것은 단순히 문법적으로 자바가 쉬웠다기 보다는 기존 프로그래밍 언어 사용자들의 개념을 수용한 것이죠. 전통적인 요소들을 객체 지향 프로그래밍언어와 버무린 것이죠. 그래서, 그 순수성은 떨어졌을지 몰라도(가비지 컬렉션을 포함한 C++로 보일 정도로) C/C++을 포함한 다른 언어 사용자 흡수에는 훨씬 유리했겠죠.

자바와 Smalltalk의 과거를 통해 Groovy와 Ruby의 관계에 대한 시사점을 제공하는 글: Groovy & Grails

설정

트랙백

댓글

설정

트랙백

댓글

UML을 어떻게 써야 하는지...라는 참으로 이 아저씨스러운 글을 올렸다.
자신만의 색깔이 있다는 것은 좋은 일이다.

이글은 일단 해학이 있다. 하지만, 난 해학의 뜻을 잘 모른다.^^
암튼 암호화 된 비아냥이 들어있다.
암호를 해독할 눈이 있는 경우에만 시원한 느낌을 받을 수 있다.
간혹 비아냥만 해석되는 사람도 있다.

이보다 내가 마음에 드는 점은 소녀풍으로 풀어냈다는 것이다.
내용이야 어쨌든 막판에 점수 내서 호들갑을 떨 수 있다는 것... 아찔한 순간이다.^^

학부시절에 작성해서 유명해질 욕심으로 올렸던 글이 있다.
당시는 전혀 유명해지지 않았다.

몇년이 지나고 나서 현업에서 활동할 때
강의를 듣는 분 중에 날 안다고 해서.. 어떻게?
했더니 그 강좌를 언급해서... 쪽팔려 죽는 줄 알았다.
개뿔도 모르면서 유명해지려고 나서면 당하는 댓가다.
네이버의 펌질은 어찌해볼 도리가 없었다. 한동안 쪽팔림 극복기가 요구되었다.

UML을 이용해 생업을 하는 입장에서 느낀 바는
UML이 아니, 정확하게는 객체지향 모델링이 사람들에게 받아들여지기가 무척 어렵다는 점이다.

성인남녀라면 8시간 정도면 누구나 UML을 마스타! 할 수 있다.
UML은 초간단 표기법일 뿐이다.
문제는 생각을 표현하는 것이 평소 훈련이 안된 사람들에게는 무척 어렵다는 점이다.

대부분의 사람들에게는 자신의 생각을 표현하는 것에 익숙하지 못한 듯하다.
그런 것도 몰라주고 짧은 시간에 다른 사람들도 이해할 수 있게끔 표현하라니
짜증이 앞서는 것이 더 문제인지도 모르지만.

나는 고객들로부터 단 한번도 생각을 표현하는 방법에 대한 질문을 받아본 일이 없다.
모두가 묻는 것을 한 마디로 요약하면

'이젠 어떻게 그려요?'

많은 사람들은 모델링을 CBD라고 부른다.
CBD는 방법론으로 통용된다. 고로, 상당수가 모델링을 방법론으로 이해한다.ㅡㅡ;

어릴 때 프라모델 완구를 '조립식'이라고 불렀던 기억이 안다.
저 아저씨가 모델링 지침을 조립식 설명서에 비유한 일이 있다.
참 적절한 비유라고 생각한 적이 있다.
더러는 생산성(아무나 짤 수 있게)을 위해서 작명 지침마저도 조립식 설명서처럼 만드는 경우가 꽤 있다.

요즘 들어 부정적인 글을 많이 올린다. 쩝. 한번쯤 마음을 정화할 필요가 있다.
사실 말하고 싶은 것은 다음의 한마디다.

모델링은 의사전달을 돕기 위한 것이지
의사소통을 피하기 위한 것 혹은 대치하기 위한 것은 아니고
더더군다나 작성만 하면 뭔가 도움을 주는 것은 절대 아니다.


UML은 그 용도에 맞춰쓸때 빛이 나기 마련이다.

설정

트랙백

댓글

스터디 발표를 듣다가 문득 '프라임(Prime)'이라는 말이 의미있게 다가왔다.
Prime은 소수(素數)나 으뜸을 칭하는 의미인데
왜 수학에서는 A에 상응하는 무언가를 표현할 때 A′(A 프라임)이라고 하는가?
학창 시절 수학시간에는 왜 이러한 의문이 들지 않았을까 하는 생각과 의문이 떠올랐다.

위키피디아를 보면, 인치와 피트를 나타내는 기호로 사용되고 영국에서는 대쉬로도 불린다고 한다.

민재님은 프라임에 대한 설명 대신에 유사하게 사용되는 Foo에 대해 알아봤던 과정을 공유했다.
어원에 대한 여러 가지 유추 중에 가장 의미있어 보이는 것은 "File Or Object"이다.
그 용도는
to represent an as-yet-unspecified term, value, process, function, destination or event but seldom a person
즉, 사람을 제외한 모든 것 중에서 아직 분명하게 설명/정의할 수 없는 것을 칭할 때이다.
(사람일 때는 홍길동을 써주기 바란다. ^^)

이러한 개념이 연이어 필요할 때는
Foo 이후에는 Bar,
그 이후는 Baz/Gazonk,
네 번째는 bop/Bat/Quux,
그 뒤는 Quuux, Quuuux, Quuuuux

많기도 하다.

설정

트랙백

댓글

일단, Rose 7.0 버전에서 작성한 모델을 하위 버전에서 올렸을 때
cat으로 짜른 unit을 로딩하는 중에 문제가 발생한다. 결국, 마이너버전까지 맞춰주는 것이 좋다.

그리고 오늘 문서 작업을 하면서 접하는 현상


유독 콜레보레이션을 표현하기 위한 클래스 다이어그램을 복사하면 응답없음으로 달려간다.
미지근한 커피를 입한 한가득 머금고 거의 가글하는 수준이 되어야 복사가 된다.
콜레보레이션이 없는 클래스 다이어그램과 시퀀스 복사는 이상이 없다. 이유가 뭔가. 암튼.. 메모

설정

트랙백

댓글

재방송입니다.(원문 작성 일시:2006/07/14 (금) 01:34)

출발은 Spring in Action 책에 나온 Cross-cutting concerns 이미지를 찾고 싶었다.
구글 이미지 검색을 열고 'cross-cutting'을 입력했더니
기대와는 다른 흥미로운 이미지들이 등장했다.

그 중에서 가장 눈길을 끄는 것은 단층이 나온 그림이었다.

메신저에 지질학 전공한(지금은 같은 바닥에 있지만) 분이 있기에
재빠르게.. 물었다.
지질학과 출신의 명운을 걸고 대답해보라고..

seoul.com@gmail.com(구글톡):
헐.. 관입한 마그마는.. 나중에 생긴거다라는 법칙
[永會] ahnyounghoe@empal.com님의 말:
오~
[永會] ahnyounghoe@empal.com님의 말:
학비만 축낸건 아니군요
-_-
[永會] ahnyounghoe@empal.com님의 말:
전 근데.. 뭔소린지 모르겠어요..
[永會] ahnyounghoe@empal.com님의 말:
관입이란 표현도 모르겠고
[永會] ahnyounghoe@empal.com님의 말:
음.. 지질이 형성된 이후에
[永會] ahnyounghoe@empal.com님의 말:
크로싱 할 수 있단 원리인가
[永會] ahnyounghoe@empal.com님의 말:
하긴.. 지질이 생기기도 전에..
seoul.com@gmail.com(구글톡):
퇴적암 지층이 형성된 이후에.. 단층(fault)가 생겼고 그 이후에.. 관입이 되었다.. 이런얘기
[永會] ahnyounghoe@empal.com님의 말:
크로싱하는 건 말도 안되지
[永會] ahnyounghoe@empal.com님의 말:
관입이라는데.. 뚫고 들어왔단거죠?
seoul.com@gmail.com(구글톡):
엉 intrude
[永會] ahnyounghoe@empal.com님의 말:
호.. 재밌네요.. AOP 원리랑 딱이군..ㅋㅋ
[永會] ahnyounghoe@empal.com님의 말:
감사..ㅋㅋ
seoul.com@gmail.com(구글톡) :
지질학과 1학년때 배우는거.. ㅋㅋㅋ
[永會] ahnyounghoe@empal.com님의 말:
법칙이름은 그럴싸한데
[永會] ahnyounghoe@empal.com님의 말:
상식적으로 생각해보니 당연한 소리네요
seoul.com@gmail.com(구글톡):
엉 그니깐 법칙이지
* 이상 메신저 전문

역시.. 전공은 전공이다. 15년 된 것을 기억하다니..

이 법칙으로 AOP 개념을 창안/보급하는 이들이
은연중에 AOP가 OOP보다 더 진보적인 접근이라고 말하는 것에 대한
항변을 할 수 있을 것 같다.

기능 모듈이나 레이어가 구성되지 않았는데..
이를 가로질러서 삽입해야(cross-cut) 하는 무언가(Aspect)이 존재할 수가 있는가?
AOP는 OOP의 유산하에서 등장한 진보일 뿐이다.
단층이 없다면... 마그마가 이들을 가로지를 수가 없는 것처럼
OOP 하에서 AOP가 의미를 지니는 것이지..
하나의 함수로 구성된 프로그램에서 AOP만으로 무엇을 할 수 있는가?

특정한 것을 부각시키려고 대립각을 세우는 방식은 지양하고 싶다.

또 하나 흥미로운 것은.. 바로.. 메타 데이터 도출 혹은.. 카테고리 분류다.
글이나 게시물에 카테고리를 부여하다 보면.. 중복을 하고픈 욕구가 생긴다.
요즘.. 태그가 등장하기도 했지만...

태그랑 카테고리는 마치 인터페이스와 클래스 (계층)
의 관계와 같은 느낌은 갖게 된다. 암튼.. 카테고리 분류에서도 cross-cutting 문제는.. 중요하다.
Hot and New가 대표적인 예가 될려나


마지막으로 소프트웨어 개발과 그나마 연관히 깊은 그림.. 명작은 아니지만
AOP

설정

트랙백

댓글

재방송(원문 작성 일시:2006/08/03 (목) 15:13)

Martin Fowler의 Patterns of Enterprise Application Architecture 1페이지를 보면 아키텍처(Architecture)의 정의에 대해 이야기 하고 있다. 아키텍처에 대한 다양한 정의가 있지만, 공통적인 요소로 두 가지를 언급한다.

1. 시스템을 이루는 주요 구성요소를 추려 놓은 것
2. 변경하기 어려운 결정

변경하기 어려운 결정은 그만큼 중요하다. 만일 시스템 전반 적으로 변경이 수월해진다면 아키텍처라고 할 만한 것들이 줄어든다는 이야기가 된다. 같은 논리로, 변경이 용이하게 만들수록 단순한 아키텍처를 가질 수 있다.

올바른 이론이라도 그것을 실현하는 것은 쉽지 않다. 그렇다면, 실천을 염두하고 주의할 점들을 생각해보자.

"변경하기 어려운지를 결정하는 주체가 누구인가?"

최근에 DBA에게 데이터베이스 스키마가 넘어간 이후에는 스키마 변경이 얼마나 어려운지를 실감하게 된다. 이것은 기술적으로 어렵다는 것이 아니다. 어떤 이유에서건 DBA가 변경을 실천하게 하기가 어렵다는 것이다.

대부분의 엔터프라이즈 애플리케이션(정보 시스템) 개발에서는 COTS나 이기종 시스템과 연동하기 마련이다. 프로토콜이나 연동을 위한 API가 있다고 해도 해당 제품이나 제품을 커스터마이징해주는 업체의 개발자들에게 일방적으로 어떤 방식을 강요할 수는 없다. 그들은 본인들이 지금까지 해오던 방식을 선호하기 때문이다.

정말 변경하기 어려운 것은 사람들의 마음이다. 아무리 훌륭한 기술이 나와도 사람의 마음을 바꿀 수는 없다. 나에게 매력적인 기술이 남들을 매료시킨다는 보장은 없다. 그런 면에서 보면 아키텍처를 순전히 기술적인 것으로만 보는 시각은 실용성이 부족한 것이다.  

내가 Martin Fowler의 책을 좋아하는 이유는 두 가지 요소를 꼽은 이후에 그가 페이지를 할당한 내용들에 있다. Ralph Johnson의 견해를 빌려 정리한 내용인데, 아키텍처는 주관적이고 시스템 설계에 대한 전문가(프로젝트 이해관계자들의 대표격)들의 공유하는 이해라고 한다. 개인의 주관이 아니라 팀의 주관으로 만든 사항들이 아키텍처라고 할 수 있다.

그래서, 아키텍처가 팀원 개인의 주관적인 이해와의 괴리가 적을 때 가치가 극대화 될 수 있다. 이를 위해서 모델이나 다이어그램을 그리고, 수도 없이 회의를 하게 된다. 협력적인 태도가 좋은 아키텍처를 만들어내는데 근간이 됨을 짐작해볼 수 있다.

공식적이건 비공식적이건 회의를 할 때, 우리는 합의를 도출하고 서로의 이해를 공유하는데 초점을 맞춰야 한다. 그러나, 종종 일부는 전달에 주력하고, 일부는 그저 듣기만 한다. 목적없이 그 자리에 앉아 있는 팀원이 늘어날수록 아무리 기술적으로 훌륭한 아키텍처라고 해도 가치는 떨어진다. 그 팀원은 그 아키텍처를 공유하지 않기 때문에, 그가 만든 결과물은 아키텍처와 무관해지게 되거나 해할 수도 있다.

모델링의 경험이 늘어갈수록 더 쉬운 방법을 고안해내는데 집중하게 된다. 쉽게 만들어야 공유가 잘 되기 때문이다. 모델링은 의사소통의 도구이기 때문에 쉬운 방법을 사용하는 것은 너무나 당연한 것이다. 그런데, 시장에 통하느냐의 문제를 고민해야 한다. 아이러니하게도 시장에서는 너무 쉬운 것은 의심한다. 이는 많은 사람들이 모델링을 하지만, 이유를 모르고 있거나 잘못된 용도로 모델을 이용하고 있다는 반증이다.

설정

트랙백

댓글

재방송(원문 작성 일시:2006/01/12 (목) 12:22 )

Red Cross Original Design

위의 디자인 보다는..
Red Cross Redesign

Knowledge Gap

사용자가 UI 를 보고 원하는 작업을 수행하려면 익혀야 하는 수준이 Target Knowledge Point 라면 현재 수준과의 괴리가 존재할 것이다. 그 Gap 을 최소화 할 수 있는 방안.. 그것이 직관적인 인터페이스를 만드는 길이란다. 그럴 듯 하네.
UI

설정

트랙백

댓글

재방송(원문 작성 일시:2005/12/10 (토) 00:19)

“I've come to the conclusion that people forget about regular Java objects because they haven't got a fancy name - so while preparing for a talk Rebecca Parsons, Josh Mackenzie and I gave them one: POJO (Plain Old Java Object). A POJO domain model is easier to put together, quick to build, can run and test outside of an EJB container, and isn't dependent on EJB (maybe that's why EJB vendors don't encourage you to use them.)”
~ Martin Fowler

재미있는 기원이다.
예전에 MF의 책인지, 아티클인지 봤던 글이지만
Pojo in action 소개글에서 다시 봐도 통쾌한 표현이다.
나를 포함한 다수의 자바 개발자들이 그간 빠져 있었던
EJB 에 대한 착각...

자바 객체의 아름다움은 만들어가는 것이다.
개발자(프로그래머/설계자 등등)가 노력과 협력을 통해서
차츰 개선시키고 생명력을 불어넣는 것인데
어떤 fancy 한 Spec 이나 프로그래밍 기법만 익히면
환상적인 일을 할 수 있을 것 같은 착각

POJO 라고 하면 못알아듣는 분도 있고
뭔가 새로운 것이란 착각을 불러 일으키지만
POJO 라고 하든 JavaBeans 라고 하든
그게 아니라 자바 파일이라고 하는 .java 라고 하든
그냥 객체라고 하든..:)

결국은 내용이 중요하지 그 형식의 압박에서 벗어나라는..
나름대로는 대단한 메시지다.

설정

트랙백

댓글


가용성, 사용성, 성능, 신뢰성, 설치 용이성, 유지보수 용이성, 정보 가용성, 서비스 가용성 등등
IBM의 알파웍스에서 배포하는 소프트웨어에 대해 사용자 피드백을 정리해서 보여주는 것인데
보편적인 평가척도나 품질 요소와 일맥해서 참조해볼만 할 듯

설정

트랙백

댓글

영속성(persistence)

위키피디아의 정의에 따르면, 영속성(persistence)은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 영속성은 파일 시스템, 관계형 테이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현한다. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버리게 된다. 결국 영속성은 특정 데이터 구조를 이전 상태로 복원할 수 있게 해주어 프로그램의 종료와 재개를 자유롭게 해준다.

the characteristic of data that outlives the execution of the program that created it: which is achieved in practice by storing the data in non-volatile storage such as a file system or a relational database or an object database

영속성이 필요한 객체를 'persistent object'라고 하는데, 필요없는 객체는 어떻게 표기할까? 먼저 위키피디아에서는 반대 표현을 ephemeral이라 한다. 처음보는 형용사인데, 영속성이 불필요한 데이터 구조를 수식할 때 사용하는 것이다.


Rose에서는 클래스의 속성으로 Persistence를 결정할 수 있는데, 영속성이 불필요한 것은 Transient가 된다.
자바에서도 Serialization 대상에서 제외하고자 할 때, transient 키워드를 사용하여 특정 속성이 영속성을 갖지 않게 할 수 있다.


EA의 경우도 마찬가지이다.

설정

트랙백

댓글

위키피디아의 정의에 따르면, DAO (Data Access Objects)는 객체 지향적 설계 패턴의 일종이다. DAO는 애플리케이션에 대하여 하나 이상의 데이터 저장 장치 혹은 관련 소프트웨어에 대한 공통적인 인터페이스를 제공하는 컴포넌트를 의미한다. 즉, 애플리케이션에 대해서는 일관성 있는 데이터 접근을 확보해주는 것이다.

a component which provides a common interface between the application and one or more data storage devices,
such as a database or file. The term is most frequently applied to the Object design pattern.

DAO를 활용하면 물리적인 저장 장치가 파일에서 관계형 데이터페이스로 변화하더라도 애플리케이션이 영향을 덜 받
도록 해준다. 물리적인 저장은 모두 관계형 데이터베이스를 활용하는 경우에도 제품의 종류나 데이터 접근 오퍼레이션(CRUD 작업)을 돕는 솔루션을 활용에 따라서 실제 구현은 많이 달라지게 된다. DAO와 같은 공통적인 접근 인터페이스를 두지 않는다면, RDBMS 제품이나 활용 솔루션에 변화가 생길 때마다 애플리케이션에도 변경이 필요하게 된다.

DAO는 Core J2EE 패턴으로 소개되었다.
Figure 9.1
Core J2EE 패턴 카타로그에 소개된 클래스 다이어그램과 시퀀스 다이어그램을 참조하면 대략을 이해하는데 도움이 된다.
Figure 9.2
 
BusinessObject
BusinessObject 객체는 데이터를 요구하는 클라이언트를 나타낸다. BusinessObject 객체는 데이터 원본에 접근하여 데이터를 얻거나 저장하기를 요구한다. 일반적으로 서비스 레이어의 객체로 구현하거나, 도메인 객체로 구현한다.

DataAccessObject
DataAccessObject 객체는 DAO 패턴의 중심이다. 기반을 이루는 데이터 접근 구현을 추상화시켜서  BusinessObject 객체가 구체적인 데이터 원본을 고려하지 않고도 접근할 수 있게 한다. 또한, BusinessObject 객체는 DataAccessObject 객체에게 데이터의 로딩 및 저장을 위임한다.

DataSource
데이터 원본에 대한 구현을 나타낸다. 데이터 원본은 RDBMS, OODBMS, XML 저장소, 일반 파일 시스템 등의 데이터베이스이다. 이들 외에 레거시나 메인프레임과 같은 기존의 다른 시스템이나 B2B 기반의 연계 서비스 혹은 LDAP과 같은 류의 저장소가 데이터 원본이 될 수도 있다.

TransferObject
데이터를 운반하는 객체를 나타낸다. DataAccessObject 객체는 BusinessObject 객체에게 데이터를 전달하거나 수정을 위해 데이터를 받기 위해 TransferObject 객체를 사용한다. 서비스 레이어 중심으로 구현을 하는 경우는 대부분의 도메인 객체가 TransferObject 역할을 한다.
아래 다이어그램은 DAO 패턴에 Factory Method를 추가로 적용하여 다수의 RDBMS나 기차 저장장치를 일관성 있게 활용하기 위한 전략을 보여준다.
Figure 9.3
Figure 9.4
Figure 9.5

설정

트랙백

댓글

// 개선 이전public
TestIOFunction(String name){
super(name);
getTestContext().setBaseUrl("http://mydomain/myapp"); // URL은 객체 외부에서 주어지는 값이다.
}  
// 개선 이후
public TestIOFunction(String name, String baseUrl){
super(name);
getTestContext().setBaseUrl(baseUrl);
}


위의 코드는 Add Parameter 리팩토링을 적용의 효과를 보여주는 코드이다.


이미지 출처: http://www.refactoring.com/catalog/addParameter.html

객체 내부에서 얻을 수 있는 정보가 아닌 것은, 해당 객체의 입장에서는 환경적인 정보라고 할 수 있다. 그렇다면 이를 얻기 위해 객체 외부에 존재해야 할 정보는 객체 내에 놓거나, 객체 외부의 자원(파일, DB, 네트웍 등등)에 접근해서 얻어야 한다. 이렇게 되면, 정보를 받아가는 부분이 객체 안에 숨게 되어 다음과 같은 문제를 고려할 수 있다.
  • 변경을 위해서는 이 객체를 수정한다.
  • 코드를 봐야 정보 전달 방식을 알 수 있어 추상화를 높여서 전체를 파악하는데 문제를 유발한다.
  • 추상화를 높여 모델이나 메소드 내부를 배제한 인터페이스 수준에서 보면, 정보 전달이 일어나는 것을 간과하게 될 수 있다.
메소드의 인자 수준에서 보면 Add Parameter 리팩토링에 대한 것이지만, 객체의 의존성 관점으로 보면 Dependency Injection 패턴(혹은 아키텍처 패턴)에 대한 내용이 되기도 한다.

리팩토링과 패턴을 분리해서 이야기 하는 경우가 많다. 분석과 설계를 분리해서 말하는 것과 같이 이러한 분리에 입각한 사고는 당장의 현안을 추릴 때는 도움이 된다.(Separation of Concerns) 그러나, 이들은 결코 분리할 수 없는 본질적인 연관성을 갖고 있다는 점을 간과한다면 각각의 진면목을 알 수 없을 것이다.

설정

트랙백

댓글

내 블로그 좌측에 달린 구독 버튼
많기도 하고, 들쭉 날쭉 번잡스럽다.

이들 아이콘을 사이즈에 맞게 편집할 재주나 노력할 의사는 없다.
그렇지만, 이들을 찾아서 스킨에 부착하는 일을 했던 것이
지금으로썬 잘한 일 같다.

내 입장에서 두 가지 선택 중에 하나를 택한 것이다.
1) 시각적 인지도를 높이는 icon 활용
2) 텍스트 정렬을 통한 규형미

간단히 Iconic vs 일사분란함

가장 아래의 이메일 구독 박스는 난잡스러움을
가중시키지만 지금 보면 역시 붙여두길 잘했다.

판단의 근거는.. 아래의 피드버너 구독자 퉁계다.

  • HanRSS 190
  • bloglines 27
  • Rojo 6
  • FISH 8
  • Google 6
  • newsgator 1
  • Yahoo 1
  • email 2

통계가 정확하다면 두 개 정도의 아이콘은 제 구실을 못한 것이지만
나머지는 횟수를 떠나 모두 쓰임을 했다.

블로그 방문자이면서 RSS리더 사용자인 User와 블로그 RSS 제공 시스템을 연결하는
User Interface의 기본적인 역할을 수행한 것이다.

보편적으로 한 사람의 사용자가 복수의 리더를 쓰지 않는다고 가정하면
위의 버튼 하나하나는RSS 구독 기능 관점에서는 별도의 인터페이스가 된다.

설정

트랙백

댓글

일종의 OOP(object-oriented programming)

보편적인 OOP와의 차이점
- 클래스가 없다.
- 상속(inheritance)을 통해 behaviour reuse

상속에 대한 구현 방식이 일반적인 OOP와 다르다.
- 기존의 객체를 프로토타입(prototypes)으로 삼아 인스턴스 복제(cloning)를 통해서 상속 실현

자바의 상속과 비교해보면
super:sub = prototype:clone


이러한 특징으로 인해 다양한 이름으로 불린다:
class-less, prototype-oriented, or instance-based programming

JavaScript 가 대표적인 사례

프로토타입 기반 프로그래밍의 옹호자의 주장에 따르면
클래스 기반 언어는 개발의 초점을 클래스 분류와 관계 포착에 의미를 두지만
프로토타입 기반 프로그래밍은 행위에 초점을 맞추다가..
(행위에 따른) 전형적인 모습에 기초하여 추후에 클래스를 분류한다.
유사 개념: 오리 인터페이스(Duck Interface)

개인적으로는이러한 분류(Classification)가 정적인 정의에서 출발하는 것보다
훨씬 실효성이 있다고 본다. 추정의 근거는 이러한 방식이 실증적이고
연속적으로 진화할 수 있는 접근이기 때문이다.

실행시점에서 동적으로 타입을 정의하는 루비류의 언어와
상당한 유사점을 갖고 있다.

Unlike the relationship between class and instance in class-based object-oriented languages, the relationship between the prototype and its offshoots does not require that the child object have a memory or structural similarity to the prototype beyond this link.

그리고 위의 내용을 보면 Duck Typing과도 닮아 있고(오리 인터페이스(Duck Interface) 참조)
상태가 클라이언트에게 완전히 Transparent 하다는 것은...
추상화 수준이 다르지만 SOA의 방향과도 매우 흡사한 느낌이다.

As such, the child object can continue to be modified and amended over time without re-arranging the structure of its associated class as in class-based systems. It is also important to note that not only data but also methods can be added or changed. For this reason most prototype-based languages refer to both data and methods as "slots".

위 내용까지 읽어보면 매료된다. (주의하자.)

상속이 실현되는(메소드를 호출하면 프로토타입의 메소드가 불려지는)
메커니즘은 Delegation이라고 부른다. 언어의 런타임이 Dispatching 해주는...

mitosis이라는 생물학적 개념을 차용한 것도 눈에 띈다.
유사분열이라.. 핵분열을 통한 복제.. 복제를 통해 새로운 개체가 탄생하는??
흥미롭다.

장단을 논한 부분을 대략적으로 훑어보면
상속을 하거나/주는 양자의 관계가 강력하지 않다는 것.
상태의 구조는 공유되지 않고, 링크도 약하다.
유연성이라고 요약해버리자. ㅡㅡ;

단점으로는 correctness, safety, predictability, and efficiency. 이런 단어들이 나열된다.
정적 타이핑과 비교해서 이들이 약해진다는..
보수적 혹은 안정적 관점이다.


참고: Prototype-based programming

설정

트랙백

댓글

전에 주로 자카르타 프로젝트쪽에서 약자를 먼저 정해놓고 뜻을 나중에 부여하는 것을 보고 참 재밌다고 생각했다. 예를 들어 CACTUS라는 것이 있는데, 물론 단어 자체로는 '선인장'이지만, 자카르타 사이트에서 선인장을 다운로드 할 수 있는 것은 아니니까?

Why the Name?  페이지에 가서 보면, 원래 이름은 J2EEUnit 였다가, J2EE가 썬의 등록상표라 이름을 바꾸려는데 좋아하는 샹송 가사가 맘에 들어서 작명을 했다는 식이라고 파악할 수 있다. 맞나? 그러면서, 몇 가지 약자를 만들어놓고 있고, 제안을 해달라고 요청한다. ^^;

약자는 Computer Assisted Construction of Test Units for the Server, or Cool and Comprehensive Test Units for the Server 등을 고려하고 있지만 아직 정해지지 않았고, 사실 정해질지 여부도 불투명하고, 그래야 할 필요성도 확실하지 않다. ^^;

PMD 사이트를 보니 이건 아예 발음하기 좋아서 지었다고 한다. ^^; 멋지군. 그러나 많은 해석(?)을 확보하고 있다.
Pretty Much Done
Project Mess Detector
Project Monitoring Directives
Protein Mutant Database
Project Meets Deadline
Programming Mistake Detector
Pounds Mistakes Dead
PMD Meaning Discovery

이런 약어를 지칭하는 용어가 있었다. backronym. 용어 사이트를 찾아보니 뜻은 아래와 같았다.

backronym     n.     [portmanteau of back + acronym] A word interpreted as an acronym that was not originally so intended. This is a special case of what linguists call `back formation'. Examples are given under BASIC, recursive acronym (Cygnus), Acme, and mung. Discovering backronyms is a common form of wordplay among hackers. Compare retcon.

retcon은 뜻을 봐도 뭔 소린지 모르겠다.ㅡㅡ;

The Jargon Dictionary라고 우연하게 들어간 사이트인데 괜찮은 것 같다.
http://info.astrian.net/jargon/ 

2004/06/18 (금) 엠파스에서

설정

트랙백

댓글

Adapter Pattern (Wrapper Pattern)


1. 컨텍스트
특정 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 전환시킨다. 인터페이스가 호환되지 않아 상호 작용할 수 없는 경우에, Adapter를 이용하여 클래스 사이의 인터페이스의 호환성을 보장할 수 있다. Adapter 패턴의 용도는 실생활에서 전기 플러그의 형태가 맞지 않은 경우에 어댑터(adapter)를 사용하는 것과 같은 이치라고 할 수 있다.

또한, 인터페이스를 맞추기 위하여 결과적으로 새로운 인터페이스로 클래스를 감싸게 되기 때문에 Wrapper 패턴이라고도 한다.

2. 적용 영역
l        존재하는 클래스를 사용하고자 하는데 인터페이스가 부적절한 경우
l        관계가 없거나, 예상하지 못하는 클래스와 함께 쓰일 수 있는 재사용 가능한 클래스를 생성하고자 하는 경우
l        Adapter는 클래스 수준의 Class Adapter와 객체 수준의 Object Adapter로 적용할 수 있다.
l        Object Adapter에서는 모든 하위 클래스의 인터페이스에 대해 Adapter를 적용하기 어렵다. 이러한 경우는 부모 클래스의 인터페이스에 Adapter를 적용한다.

3. 구조

Class Adapter의 클래스 다이어그램

Object Adapter의 클래스 다이어그램
4. 적용 결과
l        Class Adapter를 사용하는 경우는 Adaptee 클래스의 하위 클래스와 상호 작용할 수 없으나, Object Adapter를 사용하는 경우는 Adaptee 타입의 모든 객체와 상호 작용할 수 있다.
l        Class Adapter의 경우는 Adaptee의 하위 클래스이기 때문에 Adaptee 클래스의 행위를 재정의(overriding)할 수 있으나, Object Adapter의 경우는 별도로 Adaptee 클래스의 서브 클래스를 생성하고, Adapter에서 이러한 타입의 객체를 참조해야 하는 별도의 작업을 요하게 된다.
l        Class Adapter는 하나의 객체만으로 Adapter와 Adaptee 역할을 수행하게 되는 반면, Object Adapter는 adaptee 객체에 접근하기 위한 별도의 레퍼런스가 필요하다.

5. 관련 패턴
l        Bridge 패턴은 Object Adapter와 유사한 구조를 갖고 있지만, 서로 의도가 다르다. Adapter는 존재하고 있는 객체에 대한 인터페이스를 바꾸기 위한 의도를 갖지만, Bridge는 인터페이스를 해당 구현체(implementation)와 분리하기 위한 목적을 띈다.
l        Decorator 패턴은 인터페이스 변환 없이 다른 객체의 개선이 가능하다. 순수하게 Adapter 패턴만 적용해서는 순환 구성(recursive composition)이 불가능하고, Decorator를 이용하면 가능하다.
l        Proxy 패턴은 Adapter와 달리 인터페이스를 변환시키지 않고, 다른 객체에 대한 대리자 역할을 수행한다.

6. 참고 문헌

Design Patterns: Elements of Reusable Object-Oriented Software

Head First Design Patterns
에릭 프리먼 외 지음,
서환수 옮김
한빛미디어

GOF의 디자인 패턴
Erich Gamma 외 지음,
김정아 옮김
피어슨에듀케이션코리아

Java 언어로 배우는 디자인 패턴 입문
유키 히로시 지음
김윤정 옮김
영진.com

설정

트랙백

댓글

1. 컨텍스트
추상화한 것(인터페이스)과 실체(구현 객체)를 분리하여, 서로 독립적으로 다양한 형태를 띌 수 있게 하고자 하는 패턴. 하나의 추상 클래스(혹은 인터페이스)에 대해 여러 개의 구현체를 갖는 것은 상속(혹은 인터페이스 구현)을 통해서도 가능하다. 그러나, 이렇게 명시적인 바인딩이 존재하는 경우 추상 클래스와 이를 구현한 클래스가 독립적으로 수정되고, 확장되거나 재사용되는 일은 매우 어려운 일이다.
상이한 플랫폼 사이에서 동일한 기능을 수행하기 위한 클래스를 작성하는 경우 실제 구현은 해당 플랫폼에 맞게 독립적으로 구현하고, 인터페이스는 해당 기능을 사용하는데 적합하게 독립적으로 정의하는 방법을 통해 유연성을 확보할 수 있다.

위의 그림은 스위치의 인터페이스(Switch)와 구현(SwitchImp)을 구분함으로써 독립적으로 다양한 형태로 발전할 수 있는 유연성을 묘사한 것이다.

2. 적용 영역
l        추상 클래스 혹은 인터페이스와 구현 클래스 사이의 항구적인 바인딩(permanent binding)을 피하고자 하는 경우
l        추상 클래스 혹은 인터페이스와 구현 클래스가 별도로 상속을 통해 확장되어야 하는 경우
l        구현 클래스에서의 변화가 클라이언트에 영향을 미치지 않기를 원하는 경우
l        다수의 객체들이 하나의 구현 클래스를 공유하면서 이러한 사실을 모르게 하고자 하는 경우

3. 구조

4. 적용 결과
l        인터페이스와 구현 사이의 결합도를 낮춘다(decoupling).
l        추상 클래스 혹은 인터페이스와 구현 클래스가 독립적인 계층 구조를 지니기 때문에 확장성이 개선된다.
l        클라이언트가 구현 클래스에 대한 세부 내용을 알 수 없다.

5. 관련 패턴
l        Abstract Factory는 특정 Bridge를 생성하고, 설정할 수 있다.
l        Bridge 패턴은 Object Adapter와 유사한 구조를 갖고 있지만, 서로 의도가 다르다. Adapter는 존재하고 있는 객체에 대한 인터페이스를 바꾸기 위한 의도를 갖지만, Bridge는 인터페이스를 해당 구현체(implementation)와 분리하기 위한 목적을 띈다.

6. 참고 문헌
위키피디아: Bridge
충북대 번역글: The Bridge Pattern  
OOPSLA ’97 workshop of Non-Software Examples of Software Design Patterns by Michael Duell, John Goodsen, and Linda Rising

Design Patterns: Elements of Reusable Object-Oriented Software

Head First Design Patterns
에릭 프리먼 외 지음,
서환수 옮김
한빛미디어

GOF의 디자인 패턴
Erich Gamma 외 지음,
김정아 옮김
피어슨에듀케이션코리아

설정

트랙백

댓글

1. 컨텍스트
Composite 패턴은 클라이언트가 트리 구조(tree structures)를 형성하는 개별 객체들과 이들이 모여서 만들어진 구성체를을 동일하게 취급하는 것을 가능하게 한다.
그래픽 컴포넌트를 이용하여 그림을 그리는 예를 생각해보자. 선, 원, 문자 및 사각형과 같은 기본적인 그래픽 컴포넌트를 다루는 것은, 이들이 모여서 형성되는 구성체(Composite)를 다루는 방법과 동일하다. 즉, 선을 화면에 표시하는 작업이나, 선과 원이 합쳐진 객체를 화면에 표현하는 것이나 근본적으로 동일한 행위라는 것에서 고안된 패턴이 Composite 패턴이다.
J2SE SDK에 포함된 java.awt 패키지를 사용해본 개발자라면 이미 Composite 패턴에 익숙해져 있다고 할 수 있다. java.awt.Component 객체를 포함할 수 있는 Container 객체 역시 Component 클래스에 속하기 때문에 동일한 인터페이스를 갖고 있다. 다시 말해서 Container에 Component를 붙이는 방법이나, Container를 붙이는 방법이나 동일한 것과 같이 Component 클래스에 정의된 인터페이스를 이용할 수 있다는 것이다.

java.awt.Container의 계층 구조

2. 적용 영역
l        객체의 부분과 전체 계층 관계(part-whole hierarchies)를 표현하고자 하는 경우
l        클라이언트가 구성체(Composite)와 이들을 구성하는 개별 객체의 차이점을 인지할 필요가 없게 하고자 하는 경우

3. 구조

4. 적용 결과
l        Composite 패턴은 기본 객체(primitive object)와 이들의 구성체로 이루어진 객체(composite object)로 이루어지는 클래스 계층 구조를 정의한다.
l        클라이언트는 구성체로 이루어진 경우나 개별 객체의 경우 모두 동일한 형태로 취급하기 때문에, 클라이언트가 단순해진다.
l        새로운 종류의 컴포넌트 추가가 용이하다. Composite나 Leaf를 상속하기만 하면 현재의 계층 구조와 클라이언트에서 그대로 사용될 수 있다.
l        남용하는 경우는 너무 일반적인 설계를 초래할 수도 있다.

5. 관련 패턴
l        Chain of Responsibility 패턴을 위해 컴포넌트-부모 연결(component-parent link)이 사용된다.
l        Decorator 패턴은 종종 Composite 패턴과 함께 사용되어, 공통의 부모 클래스를 갖는다. 이때, Decorator가 add, remove 및 getChild와 같은 Component 인터페이스를 지원해야 한다.
l        Flyweight 패턴은 컴포넌트를 공유하지만, 부모 객체를 참조할 수가 없다.
l        Iterator 패턴은 Composite 객체를 순회(traverse)하는데 사용될 수 있다.
l        Visitor 패턴은 Composite과 Leaf 클래스를 넘나들면 분포하게 되는 오퍼레이션과 행위들을 로컬화(localization)할 수 있다.

6. 참고 문헌

Design Patterns: Elements of Reusable Object-Oriented Software

Head First Design Patterns
에릭 프리먼 외 지음,
서환수 옮김
한빛미디어

GOF의 디자인 패턴
Erich Gamma 외 지음,
김정아 옮김
피어슨에듀케이션코리아

설정

트랙백

댓글