2009-06-02 2 views
3

내가 가진 :기존 객체 지향 API에서 콘솔 응용 프로그램을 만드는 방법은 무엇입니까?

  • 기존의 객체 지향 네이티브 코드 API이 API와 함께 작동 (비 GUI)
  • GUI 응용 프로그램

목표 : 사용자를 할 수 있습니다 추가 콘솔 응용 프로그램을 만들려면 명령을 입력하여 워크 플로 집합 (위의 GUI 응용 프로그램과 유사)을 수행합니다. 이 응용 프로그램은 "stateful"이어야합니다. 사용 가능한 명령과 결과는 이전에 발행 한 명령에 따라 다릅니다.

문제 : "나는 바퀴를 재발견하고 싶지 않습니다." 앱을 제작하고 '어휘'를 정의하기위한 기존 패턴이 있습니까? 현재, 헬퍼와 커맨드 파서를 "처음부터"작성하는 것이 가장 좋은 방법이라고 생각합니다.

P. 내 API가 .Net에 있으면 PowerShell의 방향을 살펴볼 것이지만 API가 크고 .Net으로 래핑하는 것은 시간이 많이 걸립니다.

답변

1

명령 줄을 시작하려면 먼저 바퀴를 다시 만들지 마십시오. 명령을 구문 분석하기 위해 많은 옵션이 있습니다.

자바에는 필요한 모든 것을 제공하는 Commons CLI이 있습니다. .NET CLI port도 있습니다.

InfiniteRed은 Ruby에서이 작업을 수행하는 방법이 a good writeup입니다.

구현에 관한 한 올바른 생각을 가지고 있습니다. 그러나 여기 바퀴를 재발 명하지 마십시오. Command 개체의 작업을 캡슐화하고 Chain of Responsibility 패턴을 사용합니다. Commons Chain이 잘 작동합니다. .NET Chain port도 있습니다.

이러한 프레임 워크를 사용할 수없는 경우 구현 방법을 살펴보십시오. 또한 이러한 옵션 중 일부를 사용하여 interop을 수행하는 데 문제가있는 경우 Ruby는 이러한 유형의 작업을 수행하는 데있어 훌륭한 스위스 군용 칼입니다. 상대적으로 이식성이 뛰어나고 코드는 실제로 깨끗하고 유지하기 쉽습니다.

업데이트 : JCommander도 재미있어합니다.

+0

Chain of Responsibility는 집과 매우 가깝습니다. 감사합니다! –

+0

아마도 그게 전부라고 생각합니다. 필요한 모든 상태를 체인 실행 컨텍스트에 밀어 넣으십시오. – cwash

1

COM 인터페이스가 있습니까? PowerShell은 COM, WMI 또는 .NET을 완벽하게 스크립팅 할 수 있습니다. 당신은 심지어 순수한 스크립트로 런타임 p/invoke 호출을 할 수 있습니다; 프로토 타입을 작성하는 데 훨씬 적은 시간이 소요됩니다. 디자인을 고형화 한 후에는 속도를 위해 나중에 네이티브 Cmdlet으로 래핑 할 수 있습니다.

-Oisin

+0

'API 상태에 따라 사용 가능한 명령 변경'사용 사례가 로그인 셸과 같은 상태 표시 등 환경에서 작동하는 데 적합하지 않은 것으로 보입니다. PowerShell의 능력에 대한 내 인상입니다. cmdlets가 상태 저장소와 상호 작용할 수 있습니까? –

+0

내 생각은 정확하게. 나는 강력하게 API 개체를 만드는 것을 고려할 것이다. 가장 빠른 방법이기도합니다. – skamradt

+0

@Tetsujin powershell은 동적으로 매개 변수 개념을 가지고 있습니다. 동적 매개 변수 개념은 전적으로 백킹 스토어 상태 (일반적으로 공급자로 캡슐화 됨)에 따라 기존 명령에서 조건부로 사용할 수 있습니다. 예를 들어 -Wait 스위치는 파일 시스템 공급자가 Get-Content cmdlet에 추가합니다.이 스위치는 해당 공급자의 현재 경로 및/또는 내부 상태를 조건으로 할 수 있습니다. – x0n

1

당신이 그물을 사용하게 할 경우, 아마도 당신이 Mono.Options 라이브러리 @ 좀 걸릴 수 있습니다 : http://tirania.org/blog/archive/2008/Oct-14.html

"Mono.Options 아름다운 명령 라인 분석입니다 라이브러리입니다. 작고, 간결하고 사용하기 쉬운 기쁨, 그리고 강력한 기능을 모두 갖추고 있습니다. "

+0

닷넷을 사용하지 않더라도 패턴으로 좋습니다! –

3

설명하는 사용 패턴은 인터프리터 언어의 일반적인 상호 작용 방식 인 REPL (Read-Eval-Print 루프)처럼 들립니다.

실제로 명령 언어와 해석기를 설명하는 것처럼 보입니다. 따라서 API에 대한 기존 바인딩과 일치하는 패턴을 도메인에서 검사하는 것이 좋습니다.

0

나는 xOn의 대답에 강력히 동의하지만, 호출 사이에 상태를 유지하기 위해 단지 하나의 인스턴스 com 객체로 만든 다음 AddRef를 호출하는 "login"함수와 Release를 호출하는 "logoff"함수를 작성하십시오. 그렇게하면 개체가 호출간에 달라 붙을 것입니다. 유일한 위험은 여러 로그인을 사용하는 동일한 상자에서 여러 번 실행되므로 ...이를 위해 함정에 빠지기를 원할 것입니다.

필요한 상태에 따라 다르지 않고 디스크 파일이나 데이터베이스로 쉽게 스트리밍 할 수있는 경우 다중 인스턴스 com 객체가 더 잘 동작하고 addref 또는 release 호출이 필요하지 않습니다.

1

SIP 또는 SWIG과 같은 자동 도구를 사용하여 API를 감싸고 파이썬 모듈로 가져 와서 ipython 세션으로 가져오고 명령 줄에서 개체를 처리하십시오. 작업 완료.

이 실패 할 경우 중 하나 때문일 수 있습니다 :

  • 귀하의 개체/API 자동 포장 (그러나 일반적으로 wrappable 상태로 그들을 얻기의 과정을 개선하는 것을 의미)에 적합하지 않습니다.
  • 파이썬은 실제로 ipython 개선 사항을 사용하여 명령 줄을 염두에 두었던 것이 아닙니다.
관련 문제