사용자 인터페이스 클래스를 명령 행 인터페이스로 대체 할 수 있다고 생각하는 아키텍처를 설계하는 것이 좋습니다.


92

코드 완성 페이지 25에서 일반 사용자 인터페이스 클래스를 명령 행 1로 쉽게 대체 할 수있는 것이 좋습니다.

테스트의 장점을 알고 있으면 어떤 문제가 발생할 수 있습니까?

이 추가 작업이 웹 및 모바일 프로젝트에 실제로 도움이됩니까? 중소 프로젝트는 어떻습니까? 동일한 규칙이 적용됩니까? 디자인이 더 복잡해지면 어떨까요?


2
Perl에서 이것은 MooseX :: GetoptPlack :: Handler :: CLI 와 같은 도구 입니다.
Ether

4
CLI를 사용하여 프로그램을 먼저 빌드하면 UI를 그 위에 배치 할 수 있으므로 프로그램에 깊이 포함 된 UI보다 훨씬 유연합니다. 이것은 웹 서비스와 거의 동일합니다.
zzzzBov

28
항상 강한 단어입니다.
Mark Canlas

8
원래 인용문은 다음과 같습니다. "아키텍처는 비즈니스 규칙과 프로그램의 출력 부분에 영향을주지 않고 새로운 사용자 인터페이스를 대체 할 수 있도록 모듈화되어야합니다. 예를 들어, 아키텍처는 "인터랙티브 인터페이스 클래스 그룹 및 명령 행 클래스 그룹 연결" 따라서 CC는 GUI를 명령 줄로 교체 할 준비를하지 말고 아키텍처가 UI 변경을 수용해야한다고 말합니다. GUI-> 명령 줄은 단지 예일뿐입니다.
sleske

2
@Vandell 제 2 판 코드 완성이 있는데 25 페이지에 언급되어 있지 않습니다. 어떤 버전을 언급하고 있습니까?
JW01

답변:


43

다른 인터페이스 (예 : GUI vs CLI vs REST)에서 기능을 재사용 할 수있는 것은 항상 필요하지는 않지만 다른 사람들이 시스템과 상호 작용하는 새로운 방법을 찾을 때 시스템에 대한 재사용 을 활성화하고 활성화 하는 것이 좋습니다.

여기에는 가중치가 필요한 몇 가지 단점이 있습니다.

  1. 추가 추상화 계층 (때로는 계층)이 필요합니다. 이러한 계층을 갖추는 것이 좋은 엔지니어링 관행이지만 개발, 추가 비용이 들기 때문에 다른 영역 (예 : 유지 관리, 재사용, 테스트)에서 노력을 줄일 수 없으므로 이해해야합니다.
  2. 매체에 최적 인 흐름은 다른 사람에게는 끔찍할 수 있습니다. 기능이 GUI를 지원하도록 설계 되었으면 웹에 너무 번잡 할 수 있습니다 . 모든 매체에서 모든 기능이 가치있는 것은 아닙니다.
  3. 서비스와 사용자 인터페이스 사이에 일반 변환기를 정의하려는 함정이 있으므로 서비스 계약을 정의하고 모든 매체의 UI를 자동으로 (또는 가능한 많이) 파생시킬 수 있습니다. 많은 프로젝트가 그러한 프레임 워크를 구축하고 요구 사항이 변경됨에 따라 가능한 모든 사용자 정의를 추가하는 데 너무 많은 노력을 낭비했습니다.

그러나 이러한 계층을 구현 한 경험에서 항상 노력을 기울였습니다. 몇 가지 경우에 만기일 몇 주 전에 미디어 (예 : 웹 서비스 통합에서 UI로)를 교체해야했기 때문에 제 시간에 시스템을 배포했습니다.


2
다른 의견에서 언급했듯이 코드 응집력을 높이고 커플 링을 줄여야합니다. 두 가지 모두 코드를 간단하고 테스트하기 쉽게 만들어야합니다. 흐름은 더 GUI 개념이며 일반적으로 다른 기능에는 없어야합니다.
BillThor

나는 이것이 아직 언급되지 않았다는 것을 믿을 수는 없지만 이것이 Model-View-Controller 아키텍처의 본질입니다. 요점은 @BillThor가 말한 것처럼 커플 링을 줄이기 위해 뷰와 컨트롤러를 자유롭게 교체 할 수 있다는 것입니다. 이것은 MVC에 가장 적합한 사용 사례입니다.
Rudolf Olah

110

테스트와는 별도로,이 접근 방식의 확실한 장점은 프로젝트를 자동화 하고 스크립팅 할 수 있다는 것입니다 . 명령 행 명령을 프로그램에 보낼 수 있으면 GUI에서 동일한 것을 자동화하는 매크로를 작성할 수있는 것보다 복잡한 작업을 훨씬 더 쉽고 안정적으로 수행하는 스크립트를 작성할 수 있습니다.

물론 실제로 가치가 있는지 여부는 전적으로 프로그램을 자동화하려는 많은 사용자가 있는지 여부에 달려 있습니다.


12
많은 응용 프로그램에서 스크립팅에 플러그인 모델을 사용합니다. 일반적으로 객체 모델이 노출되고 파이썬과 같은 언어가 스크립트를 작성하는 데 사용됩니다. 커맨드 라인 매개 변수가 사소한 앱에서는 작동하지 않는다고 생각합니다.
softveda

또 다른 이점은 검색 가능성입니다. Sublime Text의 Ctrl-Shift-P 기능은 환상적인 예입니다. 메뉴를 검색하는 대신 모호한 기능이 필요한 경우, 내가 생각하는 것을 입력하기 만하면 명령 (및 단축키)을보고 즉시 실행할 수 있습니다.
Adam Iley

공개 소스 인 Java 기반 LDAP 서버 인 OpenDJ가 이에 대한 좋은 예입니다. GUI에서 수행하는 모든 수정에 대한 명령 행은 확인 대화 상자에서 사용할 수 있습니다.
Franck

1
@ Marnixv.R .: 제스처는 '35 .73N 118.23W에서 확대 '와 같은 명령으로 지정할 수있는 작업을 수행하는 편리한 방법 일뿐입니다. 불편하지만 도면을 명령으로 입력 할 수 있습니다. 그래도 편리하게 스크립트 가능한 인터페이스에는 큰 유틸리티가 있으며, 하나를 만드는 데 약간의 노력이 필요하다고 생각합니다.
케빈 클라인

7
+1 : 또 다른 주요 장점은 사용자 작업을 쉽게 기록하여 생산 문제의 재현을 단순화한다는 것입니다.
케빈 클라인

81

추가 작업이 아니라 다른 작업입니다. 올바르게 수행하면 더 복잡하지 않을뿐만 아니라 디자인을 분리해야하기 때문에 더 단순 해집니다. 실제로 CLI를 구현하는지 여부에 관계없이 디자인을 수행하는 것이 더 좋습니다.


4
완전히 잘못된 문장들에 대해서는 -1입니다. 물론 그것은 더 복잡해질 것입니다. 결국 추가 요구 사항 / 기능입니다.
Boris Yankov

@BorisYankov 나는 그가 "복잡한"대신에 "복잡한"을 의미한다고 생각한다-그것들은 비슷하게 들리고 의미가 겹치기 때문에 때때로 혼동하기 쉽다
Izkata

43

언급되지 않은 한 가지 주요 이점은이 작업을 수행 할 수 있다는 것이 기본 코드에서 UI를 엄격하게 분리 한다는 것입니다. 이것의 한 가지 주요 장점은 GUI를 크게 변경해야하는 경우 (예 : iOS 표준을 OSX 표준으로 또는 그래픽 엔진을 다른 것으로 변경), 기본 코드가 종속되어 있지 않기 때문에 변경해야하는 모든 것입니다. UI의 레이아웃 그것은 할 수없는 것이 있다면, 명령 줄 도구가 작동하지 않기 때문에, 수.

그 외에 테스트를 자동화 할 수 있다는 것이 주요 이점입니다.


내가 틀렸다면 수정하지만 한 GUI에서 다른 GUI로 변경하면 양식 유효성 검사 / 오류 메시지 표시, 이벤트 핸들러 설정 등의 측면에서 여전히 중요한 작업이 필요합니다.
Upvote

5
예, 그러나 모든 유효성 검사는 좋은 UI의 일부이므로 변경해야한다고 말했습니다. 예를 들어 사용자 계정의 현재 상태, 항목 검색 알고리즘, 게임의 특정 규칙 등을 저장하는 백엔드 코드입니다. 여기서 중요한 것은 마우스 / 키보드 기반 UI에서 게임의 터치 스크린 UI를 사용하더라도 전투 계산 및 스코어링에 동일한 백엔드 엔진을 계속 사용할 수 있어야하므로 동일한 기본 시스템을 사용하는 새로운 이벤트 핸들러 작성에 집중할 수 있습니다.
deworde

2
그것은 결코 쉬운 일이 아닙니다. 나는 이벤트 핸들러를 작성하는 것을 싫어하고 비즈니스 코드보다 훨씬 더 많은 유효성 검사 코드를 만듭니다. (나는 그들이 당신이 묘사 한 방식으로 분리되어야한다는 것에 동의하지만)
Upvote

2
@ClickUpvote GUI 구현 방법에 따라 다릅니다. 지원 클래스에 ValueChanged 메시지를 보내고 응답으로 ValueValid / ValueInvalid 메시지를받는 매우 얇은 GUI는 OnTextboxChanged 이벤트에서 모든 유효성 검사를 수행하는 것을 훨씬 쉽게 교체 할 수 있습니다.
Dan Neely

@ClickUpvote 나는 동의한다. 그것이 내가 좋아하는 것에 집중하거나 내가주의를 기울이지 않는 것에 집중할 수 있기를 원하기 때문에 가능한 한 빨리 그렇게 할 수있다.
deworde

17

예, 거의 항상 좋은 생각입니다.

이 접근 방식을 따르는 경우 GUI와 동일한 스레드에서 일부 GUI 처리기 뒤에 비즈니스 로직 또는 데이터 액세스 권한이 없을 수 있습니다. 이 이유만으로도 투자 가치가 있습니다.


2
예를 들어 텍스트 편집기를 작성하는 경우 그 이점은 무엇입니까?
Nikie

5
@nikie 예를 들어 WYSIWIG 텍스트 편집기보기를 일반 텍스트 또는 마크 업 기반 프런트 엔드로 대체 할 수 있기 때문에 동일한 정보를 기본 모델에 전달하는 한 기존 인프라가 계속 작동합니다.
deworde

5

나는 그것이 좋은 생각이라고 생각합니다. 또한 두 번째 명령 줄 프런트 엔드를 작성할 수 있으므로 궁극적으로 비즈니스 논리가 특정 응용 프로그램 서버 아키텍처와 완전히 분리되어 있음을 증명합니다.


5

이 작업에서 내가 볼 수있는 유일한 위험은 UI의 특정 부분에 도달하려면 사용자가 일반적으로 UI의 다른 부분을 통과해야한다는 것입니다.

개발자는 UI를 직접 실행할 수 있습니다. 개발자가 실제로 제품을 사용할 때까지 사용자 문제를 재현 할 수없는 상황을 보았습니다.

따라서 테스트를 만들 때도 고려해야합니다.


3

끔찍한 충고

약간 yagni입니다 (필요하지는 않습니다).

명령 줄 인터페이스를 노출하는 것은 단위 테스트를 지원하거나 SOLID의 일부 또는 권장하는 프로그래밍 방법을 준수하는 방식으로 앱을 구성하는 것과 다릅니다.

커맨드 라인 인터페이스에 적합하지 않은 UI에서는 작동하지 않습니다. MS Paint는 정말 간단한 앱이지만 어떤 상황에서 명령 줄에서 제어 할 수있는 이점이 있습니까?

스크립팅을 구현하는 데 도움이되지 않습니다. 실제로 그 방향으로 진행되는 것을 방해합니다.

유일한 긍정적 인 점은 25 페이지에 나타나기 때문에 적어도 책의 나머지 부분이 냄새가 날 수 있다는 경고가 나타납니다. 나는 오래 전에 그것을 읽었고 그것을 좋아하지 않았기 때문에 편견이 있습니다.


1
합의 +100000000

4
스크립터 블 MSPaint는 실제로 매우 유용합니다.
RoundTower

최고의 답변입니다. "YAGNI를 구현하지 마십시오"라는 진언을 따른 이후 실제 작업에 더 많은 시간을 할애하고 실험 할 시간이 충분했습니다. 사전에 영리하려고 노력한 결과 고객이 대부분 앞에서 언급 한 것과 다른 확장 기능을 원했기 때문에 필요하지 않은 시간을 낭비하지 않았다는 것을 알 수있었습니다.
topskip

PSPaint + 명령 행 인터페이스 = AutoCAD
Vorac

-1 (가능한 경우) "GUI뿐만 아니라 CLI 구현"도 표시하지 않습니다. "CLI와 같은 대체 UI를 구현하기위한 요리사"라고 표시되어 있습니다.
Mark Hurd

2

Mason Wheeler의 말을 바탕으로 명령 줄을 통해 응용 프로그램과 상호 작용할 수있어 작업을 매우 쉽게 자동화 할 수 있습니다.

이것은 테스트에 특히 유용합니다.

실제 예제를 제공하기 위해 응용 프로그램에서 자동 테스트를 실행하려면 응용 프로그램을 자동으로 설치하고 싶을 수 있습니다. 이를 위해 "myApplication.exe / silentinstall"매개 변수를 전달할 수 있습니다.

이 명령 행 스위치를 지정할 때 GUI 설치 프로그램없이 백그라운드에서 자동으로 설치가 수행되도록 프로그래밍 할 수 있습니다. 설치 프로그램에 대한 입력 (예 : 설치 디렉토리)은 XML 파일에서 선택할 수 있습니다.

다른 예를 들어 보자. Visual Studio와 함께 제공되는 Microsoft Test Manager GUI를 사용하면 GUI 인터페이스에서 테스트 실행을 시작할 수 있지만 명령 줄 스위치와 입력 조합을 사용하여 동일한 작업을 수행 할 수있는 명령 줄 인터페이스도 제공합니다. 즉, 테스트 실행을 자동화하기 위해 PowerShell 또는 DOS 스크립트를 함께 채울 수 있으며 스크립트가 매일 밤 실행되도록 예약 된 작업을 만들 수 있습니다.

일부 응용 프로그램에는 특정 옵션으로 응용 프로그램을 열도록 지정하는 명령 줄 스위치가 있습니다 (예 : '/ maximize'를 사용하여 응용 프로그램을 최대화 된 창에서 열 수 있음).

명령 행 인터페이스를 사용할 수있는 시나리오가 많이 있습니다. 이것들은 몇 가지 예일뿐입니다.


1

"일반 사용자 인터페이스 클래스를 명령 행 1로 쉽게 대체 할 수있는 것이 좋습니다"라는 문구를 다시 한 번 주목하십시오. 그렇다고 CLI를 작성해야한다는 의미는 아니며 쉽게 수행 할 수 있다는 것입니다.

즉, UI가 나머지 코드에서 분리되어야한다는 것입니다.


2
나는 당신이 코멘트를 할 생각이라고 생각합니까?
Julio Rodrigues

1

그것은 의존 하고 내가 의존한다고 말할 때, 그것은 단지 몇 가지 우연한 사례를 갖는 것의 문제 일뿐 만 아니라 응용 프로그램과 대상 청중에 크게 의존합니다. 우리가 방정식에서 게임을 제거한다고 가정하면, 같은 명령이 거의 없거나 전혀 구현되지 않는 곳에 작성하는 응용 프로그램이 여전히 많이 있습니다. 내 머리 위에는 모바일 (예 : iOS, Android 등) 환경을 대상으로하는 모든 응용 프로그램이이 제목에 해당 할 수 있습니다.

이를 염두에두고 일반적인 소프트웨어 공간에서 시각화 (예 : PowerPoint, Maya 등)에 크게 의존하는 응용 프로그램 은 명령 줄 교체가 구현되지 않을 것입니다. 실제로 Maya와 같은 그래픽 소프트웨어의 경우, 완전하고 적절한 명령 행 버전이 작동하는 방식을 결정하는 것이 바람직한 정신 운동 일 수 있으며 사용자 관점에서 그렇게하지 못할 수도 있습니다. 따라서, 인터페이스와 같은 명령이 보이지 않을 수 있거나 응용 프로그램의 스크립팅이 바람직한 경우에도 바람직한 공통적 인 응용 프로그램이있을 수 있음이 분명합니다.

다음으로 일반적인 소프트웨어 아키텍처의 관점을 제안 양식에서 살펴보면 "사용자 인터페이스없이 어떻게이 기능에 액세스 할 수 있습니까?" 일반적으로 수행 할 방법이없고 사용자와 직접 상호 작용하지 않는 경우 (예 : 제스처 입력) 전체 아키텍처를 개선해야하는 상황이있을 수 있습니다. 테스트를 쉽게하기 위해 명령 행을 통해 호출되지 않더라도 사용자 인터페이스를 통하지 않고 명령에 직접 액세스 할 수 있어야합니다. 이것은 일반적으로 견고한 API가 있어야하며 이론적으로는 우수한 API가 명령 줄 또는 사용자 인터페이스를 통한 액세스를 허용해야한다는 것을 의미합니다. 또한 장기적으로

하루가 끝나면 제안이 이해하려고하는 것이 의미가 있다고 생각합니다 (예 : 좋은 API를 가지고 사용자 인터페이스를 구축하십시오). .


1
나는 일반적으로 동의하지 않지만 Maya의 가장 큰 장점 중 하나는 실제로 매우 강력한 스크립팅 API (원래는 MELScript, 현재 Python)를 가지고 있다는 사실입니다.
jwd

@jwd-Maya는 몇 년 전에 사용했기 때문에 선택한 예입니다. 동일한 생각에 더 나은 것이 있으면 알려주세요. 브라이스는 잘 모르지만 어쩌면?
rjzii

0

따라 다릅니다.

종종 프로그램을 모델 / 뷰 / 컨트롤러 또는 모델 / 뷰 / 뷰 / 모델로 분할합니다. 모델이 명령 줄 액세스를 허용 해야하는 것처럼 보이지만 컨트롤러에 대해서는 확실하지 않습니다. 당연히, 시야가 대체되고 있습니다.

툴 체인에 따라 약간의 차이가있을 수 있습니다. Code Complete는 Microsoft Press 서적이므로이 GUI에 Microsoft 기술을 사용하고 있습니까? 그렇다면 COM 또는 DCOM을 통해 인터페이스를 노출하기위한 앱을 만들 때 확인란이있을 수 있습니다. 일부 Microsoft 기술의 경우, 리소스 테이블과 메시지 전달은 마법사가 신속하게 프로토 타입을 만드는 데 도움이되는 모든 것과 매우 집중적으로 결합됩니다. 점점 나아지고 있다고 생각하지만 MFC 또는 양식을 유지 관리하면 약간 다칠 수 있습니다.

경우에 따라 GUI 기반 프로그램은 관리 인터페이스를 둘러싼 래퍼이거나 자체 로직이 거의 없어서 명령 행 인터페이스로 제어 할 것이 많지 않을 수 있습니다. 별도의 콘솔 앱을 구축하는 것이 더 빠르지 만 여전히 중요한 것을 스크립트, 테스트 또는 사용할 수 있습니다.

내가 생각하는 핵심은 제안이 규칙이 아니라는 것입니다. 이를 따르는 경우, 사용자 또는 고객이 클릭 대신 입력을 선호 할 수있는 더 쉬운 단위 및 승인 테스트 또는 대체 인터페이스가 제공됩니다. 그것이 스스로를 지불한다면 그렇게하십시오. 행운을 빕니다.


4
-1 : Code Complete는 프로그래밍 기술에 대한 언어 독립적 인 책입니다.
deworde

1
그는 다른 말을하지 않았다.
클릭 Upvote

그의 질문은 UI 개발에만 국한된 것이 었습니다.
Ian

0

명령 행 프로그램의 유용성에 따라 다릅니다. 지도에 경로를 플롯하거나 3D 게임을하는 것과 같은 일부는 명령 행 인터페이스에 적합하지 않습니다. 그러나 시스템 도구와 같은 다른 것들은 GUI를 사용하는 것보다 명령 줄을 사용하는 것이 훨씬 더 좋습니다.

Richard Hipp 박사는 자신의 이상적인 GUI 운영 체제는 명령 창을 여는 아이콘과 웹 브라우저를 여는 다른 아이콘이있는 빈 데스크탑이라고 말했습니다. 거의 같은 느낌입니다. 명령 줄 프로그램으로 유용하고 그렇게 만드는 것이 어렵지 않다면 그렇게 할 것입니다. GUI는 완전히 다른 프로그램 일 수도 있고 다른 누군가가 만들 수도 있습니다!


맵에 경로를 플로팅하지 않는 이유는 무엇입니까? 같은 PlotRoute(startPoint, endPoint)것이 매우 간단합니다.
메이슨 휠러

@MasonWheeler-더 좋아질 것입니다PlotRoute(startPoint, endPoint, chart)
Fabricio Araujo

0

요즘 (적어도 Java의 경우) 조만간 모든 프로그램이 조만간 웹 서비스 (SOAP 또는 Ajax 또는 둘 다)를 추가하는 것처럼 보입니다. 따라서 일반적으로 그렇습니다.하지만 더 나은 정신적 은유를 원한다면 웹 서비스 프론트 엔드가 명령 줄보다 가능성이 높습니다.


0

사물을 보는 다른 방법이 있습니다. 명령 행이 유일한 방법이라고 가정하는 대신, 음성 제어를 대신 사용할 수 있다고 가정하지 않겠습니까? 그러면 완전히 다른 패러다임이 필요합니다.

Jobs가 Apple을 인수하기 전에 매우 정교한 음성 제어 메커니즘을 탐색했습니다. 애플은 시리 (Siri)와 같은 것들을 위해 이것을 제압했다.

한숨.

대중적이고 명백한 것이 항상 "최고"인 것은 아닙니다.


명령 줄의 주요 이유 중 하나는 주로 소프트웨어 기능을 테스트하고 스크립팅 할 수 있기 때문입니다. 소프트웨어를 단위 테스트하거나 배치 스크립트를 실행하기 위해 음성의 오디오 클립을 녹음하기에는 약간 어색하거나 디스크가 거칠어 질 수 있습니다.

0

이것은 일반적으로 좋은 생각입니다.

비 유적으로 사람들은 이것을 RESTful 디자인의 한 형태로 생각할 수 있습니다. .... 그 자체로는 전형적인 (G) UI가 계정 생성과 같은 복잡한 다단계 트랜잭션을 포함 할 수 있기 때문에 아닙니다.

Better that one stays away from multi-stage complexity through shopping-cart-like models for transactional setup.

브라우저에서 드래그 앤 드롭 UI 비유를 한 번 프로그래밍했습니다. UX가 자연스럽게 느껴지도록 백엔드에서 매우 복잡한 상호 작용 규칙 사이트를 API로 만들어이 문제를 해결했으며 GUI는 작업시 이벤트를 생성하는 전체 앱이었습니다. 모듈은 이러한 이벤트를 포착하고 타이머에서이를 'API 호출'(네트워크 효율성을 위해)으로 묶었습니다.

결과는 완전히 RESTful 핵심 시스템이었습니다. 두 번째 결론은 비즈니스 모델에 따라 제휴 프로필을 사용하여 노출 할 수있는 타사 인터페이스가 있다는 것입니다.


-1

한 가지 장점은 사용자 관점에서 UI의 흐름에 대해 생각해야한다는 것입니다. (무엇을 달성하려고합니까? 어떤 컨텍스트를 설정해야합니까? 해당 컨텍스트가 주어지면 어떻게 목표를 달성합니까?)

"은행 계좌 만들기"와 "MS 워드 문서 쓰기"에는 큰 차이가 있습니다. CLI를 작성하지 않더라도 필요한 "CLI 컨텍스트"를 고려하기 위해 값을 추가 할 수 있습니다. 모델은 비즈니스 객체 모델에만있는 것이 아닙니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.