OOPogramming에서 둘중 어느 방법으로 하시나요?

이한길의 이미지

가만히 생각해보니...

UI를 먼저 구현하고 그것을 상속해서 필요한 기능을 넣는 것과...
필요한 기능들을 구현하고 거기에 UI를 구현하는 것..

크게 두가지로 나눌 수 있을 것 같습니다.

어떤 책에보면 프로그램을 먼저 콘솔 기반으로 제작하고..
거기에 UI를 구현하는 형태를 취하는데..

어떤 책은 UI를 구현하고 상속해서 거기에 필요한 기능을 구현하더군요.

어느 방법이 좋을까요?
물론 상황에 따라 어느쪽이 더 좋을지 나뉠 수 있겠지만..
단순 어플리케이션의 경우에는 어느쪽이 좋을까요?

물론 이런 경우에도 상황에 따라... 라고 할 수 있겠습니다만..
그렇다면 어떤 상황에 어느 방법이 좋을지..

그리고 주로 어떤 방법으로 프로그래밍을 하시고
이유는 무엇인지 듣고 싶네요.

onemind555의 이미지

프로그램 크기에 따라 다르게 생각 할 수 있다고 생각 합니다..

프로그램이 조그만하다면 UI만들고 UI중심으로 만들수 있겠지만...

프로그램이 크고 안정성도 있어야 한다면 CUI방식을 만들지 않더라도 UI를 따로 분리해서 하는게 더 효율이 있을 거라고 생각 합니다.

UI와 구현부를 분리하면 필요하면 테스트 자동화를 할 수도 있고.. 자기가 무엇을 만들고 있는지 명확히 이해 할 수 있다는 장점이 있다고 생각 합니다..

UI와 같이 겹쳐져 버리면 디버깅도 시간이 오래 걸리고 별로 이득이 없는듯 해요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

sDH8988L의 이미지

흠... UI를 구현한 후에 그걸 상속해서 기능을 구현하는 것은 해보진 않았네요...

저는 거의 다 일단, 엔진이라고 볼 수 있는 Core를 기술한 후에 거기에 UI를 Add-on하는 방식으로 Program을 짭니다...
물론, UI는 단 놈으로 바꿀 수 있도록 좀 독립적으로 짜죠...

이렇게 하면, 위의 분도 말씀하셨지만, Test할 때도 편하고 Bug 잡기도 쉽더라구요...

UI를 구현한 후에 그걸 상속받아서 하는 방법은 뭔가 좀 불안해 보이네요...

간단한 Program이라면 모를까, 좀 복잡하거나 나중에 관리를 해야 하는 좀 큰 Program이라면 좀 힘든 방법 아닐까요???

이한길의 이미지

아직 저도 일반 어플리케이션을 이런 방법으로 ...
즉 UI를 먼저 구성하고 그걸 상속해서 기능을 구현하는 방법으로
작성해보지는 않았지만 해볼만 한것 같다는 생각이 들었습니다.

제가 그런 생각이 든 것은... 크게 두가지 이유였습니다.

일단 이런 형태로 UI가 먼저 구성되어 있으면
후에는 UI에 신경 쓰지않고 핵심 코드에 신경을 써 가면서
작성을 할 수 있을 것 같습니다.

그리고 UI를 먼저 구성하게 되면 좀더 사용자의 입장을 고려하고
프로그램을 만들게 될것 같다는 생각이 들었습니다.
사실 UI를 나중에 구성하면 프로그램에 맞추는 식이 될 수 있지만
UI부터 구상하면 난 이렇게 작동했으면 좋겠다는 식으로 구성을 하게 되지요.

그리고 UI를 먼저 구성하게 되면
좀더 구현해야 할 부분이 명확해지지 않을까 하는 생각이 듭니다.

이런 이유들에서 UI를 먼저 구현하고
기능을 집어 넣는 것도 괜찮겠다는 생각입니다.

그리고 이렇게 하면 오히려 더 명확하게 구분하게 될지도 모른다는...
추측을 조심스럽게 해봅니다. 사실 나중에 UI를 구성하면서..
더 필요하게 된 코드를 어디에 쓸지 고민이 될때도 있는것 같습니다.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

onemind555의 이미지

정답은 없는 듯 합니다..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

1002의 이미지

둘 다 합니다.
1. UI를 먼저 작업할때.
어플리케이션의 동작이 이해 안갈때 UI 부분을 간단히 먼저 작업해봅니다(콘솔로 만들거나, 간단한 폼 정도). 전체 돌아가는 UI를 보고 Domain Logic 과 interface 등을 만든뒤, Refactoring 해서 분리해냅니다.

2. Domain 을 먼저 작업할때
평상시 어플리케이션에 대해 이해하는 경우에 이부분을 먼저 작업합니다. Test Driven 으로 개발하시는 분들은 아마 Domain 먼저 접근하시는게 Test를 작성하기 쉽기 때문에 이쪽부터 접근하시려고 하실겁니다. 상대적으로 Refactoring 횟수가 적긴 합니다.

* UI 부분은 어플리케이션에 비교적 변경이 잦은 부분이라 생각합니다. 웹이라면 디자이너랑 협업도 해야 하는 부분이기도 하고요. 그래서 UI 를 먼저 구성한다 해도 '언젠가 이 부분은 바뀐다' 를 전제로 하고 가능한 한 디펜던시를 없애려고 노력합니다. 개발하시는 부분에 따라 다르긴 하겠지만. 개인적으로 UI 를 먼저 작성할 경우에 구현해야 할 부분이 명확해지고 프로그램을 이해하기에 좋다는 의견에는 동의합니다. 하지만, 후에 UI 에 핵심코드에 신경을 써 갈 수 있다는 점에는 반대합니다. (추후 변경이 잦다는 점에서요.)

* 가능한 한 UI에 로직이 붙은 Class를 상속하진 않습니다. 라이브러리 의존적인 코드가 많은 위치일 것이기 때문에 DIP 상으로도 맞지 않죠. 차라리 interface 를 정의하고 표현부분에 대해서는 Delegation 을 하는 입장을 취합니다.

* 어느부분을 먼저하건, 최종적으로 필요한 기능들이 완성되어있으면서 Low Coulping, High Cohesion 한 모듈들을 만들어내면 된다고 봅니다. 최근에 학교 프로젝트가 Minimax 스타일의 오델로 만드는 거였는데, 이 경우는 도스용 콘솔 어플리케이션 만들고, 이를 GUI 버전으로 옮겼습니다. 중간에 AI 부분 로직 자체에 대한 디버깅을 할때엔 콘솔버전으로 하면서 UnitTest 같이 붙이고, 최종 프로덕트는 GUI 버전으로 완료시켰습니다.
최종 프로덕트의 경우 12 x 12 짜리 게임인데, 중간에 테스팅을 하기 위해 8 x 8 모드로 만들었습니다.(AI가 버전업 될때마다 클래스 하나가 늘어납니다. 그리고 이 클래스는 기존에 이미 만들어진 AI 들과 대전을 하고 그 결과 로그를 만들어내야 합니다. 그리고 초기 작업때는 WZebra 등의 AI와 대결해보기 위해 8x8 모드가 필요합니다.) 모듈간 의존성이 낮았기 때문에, 하나의 프로그램에 대해 이러한 부가적인 기능들을 만드는데 별로 시간이 걸리지 않았습니다.

juneaftn의 이미지

일반적으로 UI진영(예컨대 콘스탄틴파)쪽에서는 UI-first 접근법을 취하고, OO진영(예컨대 엉클밥파)쪽에서는 DM-first 접근법을 취합니다. (여기서 UI-first라고 할 때, 이것을 UI 코드 구현을 먼저한다는 정도로 협소하게 생각하면 안됩니다)

저는, UI가 완전히 다 끝나고 나서 DM을 만들거나, 혹은 DM이 다 완결된 후에 UI를 손대거나 하는 계단 방식은 취하지 않습니다(사실 이런 방식은 현실적이지 못하며, 이런 방식을 주장하는 사람도 거의 없습니다). 사실 DM과 UI는 일견 병렬적으로 나아갑니다. 다만 초점을 어느 시기에 어디에 두느냐는 차이가 있습니다. 예컨대 DM에 초점을 두는 시기에는 UI의 추상(abstraction)을 함께 다룹니다. 반면 UI에 초점을 두는 시기에는 DM의 추상을 병행합니다. 이 추상성의 정도는 상황에 맞게 조절합니다.

그리고 언제 어느 부분에 초점을 두어야 할까 하는 문제는 어느 쪽의 ROI(고객의)가 높은가로 판별합니다. (테스트가능성 같은 개발자를 위한 가치도 결국은 고객의 ROI로 설명할 수 있습니다.)

개발자의 훈련입장에서 보면, 양쪽의 극단을 모두 경험해 보는 것이 바람직하다고 생각합니다. 양극단을 모두 잡을 수 있으면 때에 맞게 적절한 정도를 취할 수 있지 않을까 생각합니다.

zoops의 이미지

개인적인 방법은..
Logic 이 위주인 Server 같은 프로그램은 로직먼저...
UI 가 중요한 Client Program 은 UI 먼저...
(사실 Logic 도 많지 않져... ) 이렇게 짭니다...

Logic 도 UI 도 중요한 프로그램은 병렬로 짜는것에 한표를 던지고 싶지만... 쉽지는 않겠군요..

프로그래머는 로직에 무게중심을 많이 두지만..
시장은 UI에도 많은 무게가 쏠려있다는것을 염두에 두고 프로그래밍을 하시면 될것 같군요.

- zoops -

이한길의 이미지

저는 아직 그렇게 많은 경험이 없어서...
한번 시작하려고 하면 어떤 방법으로 접근해야 할지 고민을 많이 합니다.

많은 조언들 감사합니다.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

fender의 이미지

개인적인 생각으로는 프로그램의 종류에 따라 'UI를 중심으로' 클래스를 설계할 수는 있어도 'UI 로직에' 비즈니스 로직을 끼워 넣는 개발은 득보다는 실이 많은 것 같습니다.

VB의 대표적 문제점이 '마법의 버튼' 같은 코딩 스타일로 빠지기 쉽다는 점인데, 즉 버튼의 이벤트 핸들러에 400-500 줄씩 코딩이 들어간다던 지 하는 경우 입니다.

그런 부분만 피한다면 작은 규모의 간단한 데스크탑 어플리케이션의 경우 따로 기획이 없는 경우가 많기 때문에 UI를 중심으로 설계해도 큰 문제는 없을 것 같습니다.

그 밖의 경우는 대부분 도메인 모델 -> 비즈니스 계층 -> 프리젠테이션 계층 순으로 올라가는게 편한 경우가 많은 것 같습니다.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

지리즈의 이미지

하나의 실행파일을 생성하도라도, UI단과 로직단을 별도로 개발해서 붙이는 형태를 취합니다.
server client 개념과 크게 다르지는 않습니다.
이런 개발 방식은 로직단과 UI단 각각 재활용이 용이한 장점이 있습니다.
또한 손 쉽게 front END를 바꿀 수 있고,
S/C모델로의 포팅또한 쉽습니다.

개인 용도의 개발자 입장에서는 모르겠지만,
회사입장에서는 상당히 ROI가 좋은 방법론입니다.

There is no spoon. Neo from the Matrix 1999.

nohmad의 이미지

주제를 벗어난 얘기인지도 모르지만...
CUI(Commandline User Interface)를 주 환경으로 해서 먼저 만들고,
그담에 GUI든 웹인터페이스든 이 CUI와 스트림으로 input/output을 주고 받는 건 어떨까요?

제가 기억하기론, edonkey의 경우에도 커맨드라인 메인 인터페이스가 있고,
많은 클론들이 여기에 GUI를 붙여서 제작이 되고도 했습니다.
최근 mldonkey를 쓰고 있는데, 이 mldonkey의 경우,
브라우저로 볼 수 있는 웹인터페이스와 더불어 외부 포트를 열어서
텔넷 접속으로 사용할 수 있는 CUI 환경을 제공하기도 합니다.

이런 식으로 제작할 경우, 좀더 융통성 있게 만들 수 있지 않나 하는 생각이 듭니다.
아무래도 통합된 프로세스보다는 반응이 느리긴 하겠지만,
실제 클라이언트 데스크탑 환경에선 별 차이 없을 것이고,
CUI, GUI, 웹을 모두 제공한다는 것은 큰 장점이 될 수도 있을 것 같습니다.
그리고 GUI보다는 커맨드라인 옵션 파싱이 훨씬 쉽기에,
핵심 알고리듬에 좀더 주력할 수 있게 해준다는 것도 장점이 될 수 있겠죠. (원시적인 모듈화가 가능하다는 얘깁니다.)

cheezy의 이미지

저는 작은 웹로직만 주로 구현해 봐서 그런진 몰라도 일단
UI 즉, 화면설계부터 먼저고려하게 되더군요.
일단 화면에 필요한 것이 무엇이고 주어진 비지니스 로직에서 필요로 하는것이 무엇인지를 고려하죠.

이런 방법은 Data Path을 먼저 고려한 뒤 Control Logic을 구현하는 H/W description(VHDL) 방법과도 일견 유사해 보이네요.. ^^;;

Found Myself.

caramis의 이미지

저는 core + GUI Frontend 에 한표 던집니다...

from caramis ~ !