2010-02-26 4 views
3

저는 실시간 MIDI 응용 프로그램을 구현하는 작업을 스스로했습니다. 지금까지 작성한 다른 모든 소프트웨어와 마찬가지로 코딩을 시작했습니다. Jack Audio Connection Kit 및 해당 클라이언트의 전송 상태를 제어 할 수있는 작은 GUI (GTK2) 응용 프로그램을 구현했습니다.실시간 응용 프로그램 설계를위한 디자인 패턴을 이해하지 못하는 두뇌

필자는 전에 실시간 응용 프로그램을 작성한 적이 없으며 하나의 멀티 스레드 프로그램 만 작성했습니다. 이 두 가지 세부 사항은 내가 지금까지 작성한 모든 소프트웨어가 나를 먼저 설계 할 필요가 없기 때문에이 문제를 해결하는 데 큰 도움이됩니다. 나는 가끔씩 일을하기 위해 펜과 종이 만 필요할 뿐이었다.

그러나이 프로젝트는 코딩을 진행하지 않을 것입니다. 그러나 저는 소프트웨어 디자인에 관해서는 아는 것이 없지만, 저는 스스로 가르쳤습니다 (1990 년 중반에 2 년 컴퓨터 학습 과정을 할인했습니다). 나는 항상 단계적으로 일했고, 뭔가 일하는 것을 얻고 그 위에 구축했다.

내 연구 중에 모델 뷰 컨트롤러 패턴을 보았지만 세부 사항을 생각하기가 정말 어렵다는 것을 알았고 문제를 찾지 않고도 모든 기반을 찾을 수없는 기초를 찾을 수 없습니다 .

이 블록을 지나치려면 조언이 필요합니다. 나는 내 생각의 기차가 느슨한 산만을 발견하는 것을 멈출 필요가있다. 이것은 혼란 중 하나입니다. 이 블록을 지나가려면 어떻게해야합니까?

+0

디자인은 언어에 구애받지 않아야하지만, 나는 당신이 무엇을 할 것인가에 대한 좀 더 자세한 내용이 도움이 될 수 있다고 생각합니다. 이 객체 지향적인가 아닌가? MVC가 특정 문제에 적용될 수 있습니까? –

+0

@ p.marino : 현재 C++은 약간 녹슬었고 (어쨌든 그렇게 크지는 않았습니다.) C로 시작했습니다. 나는 모듈화 된 방식으로 C를 쓰는 경향이있다. 그러나 C++로 전환하여 클래스 기능 중 일부를 활용할 수도 있지만 일반적으로 더 C 스타일의 방식을 사용합니다. –

+0

@ p.marino : MVC가 적용 가능한지 잘 모르겠습니다. 이는 또한 문제의 일부이거나, 익숙하지 않은 디자인 패턴을 평가하는 방법 또는 문제와 관련이 있습니까? 이것은 내가 시험해보고있는 저녁이다라고 우스운 소리를 내고있다! –

답변

3

매우 광범위한 용어로 "소프트웨어 설계"는 일련의 모듈에서 문제를 분해하고 각 모듈의 책임과 각 모듈이 다른 모듈과 통신하는 방법을 지정하는 프로세스입니다 (if 조금도).

이 활동을 진행하는 데는 여러 가지 방법이 있습니다. 이것이 이것을 처음 시도하는 것을 고려할 때 가능한 한 간단하게 종이 시트와 펜을 잡으십시오.

첫 번째 단계 : 새 응용 프로그램이 실행할 수 있어야하는 작업 목록을 기록하십시오. 그런 다음 논리적으로 속한다고 생각되는 다른 세트의 작업을 그룹화하십시오.

각 하위 집합에 대해 이름을 찾고 빈 시트 (하위 집합에 대해)에 쓰고 모듈이 수행해야 할 데이터 유형 및 다른 사람들과 교환하는 방법을 조금 자세하게 설명합니다. 각 모듈은 "모듈 디자인 용지"

다른 빈 시트에는 각 하위 세트의 상자를 그려서 적절한 이름으로 레이블을 지정하고 한 상자에서 다른 상자로 화살표를 그려보십시오. 각 화살표에는 이름과 다른 모듈을 호출하는 모듈 중 하나를 나타냅니다. 이것을 당신의 모듈 "인터페이스 설계 용지"라고 부르 자.

모듈 설명을 다른 모듈에 제공해야하는 인터페이스로 다시 점검하고, 원래 작업 목록을 변경해야하는지, 그리고 이것이 관리하는 데이터에 어떻게 영향을 미치는지 확인하십시오.

모듈이 너무 복잡하거나 큰 경우 반복적으로 모듈을 세분 할 수 있습니다. 모듈을 하위 모듈로 분리하면 또 다른 인터페이스 설계 문서를 그려야하며 하위 모듈의 합계가 원래 모듈에 대해 구상 한 모든 작업을 수행 할 수 있어야하고 나머지 모듈의 요청에 응답 할 수 있어야합니다. 시스템.

자세한 내용은 CRC cards도 참조하십시오.

+0

+1 좋은 설명. 아마도 TDD와 User Stories를 믹스에 추가 할 수 있습니다. –

+0

작업 목록은 내가 가지고있는 문제의 유형을 보여줍니다.한편으로는 사용자가 수행하고 경험할 작업이 있으며, 다른 한편으로는이 사용자 경험을 얻기 위해 프로그래머가 필요로하는 작업이 있습니다. 나는이 두 작업을 분리하는 데 어려움을 겪고 있거나 다른 방법을 사용하고있다. 이러한 작업을 설명하기 위해 추상화 수준을 유지하기가 어렵다. –

+0

물론 일부는 사용자가 수행하지만 ... 사용자는 메뉴에서 선택하거나 버튼을 눌러 이들을 수행해야하며 단추는 모듈 중 하나에 대한 인터페이스를 호출해야합니다. 내가 "인터페이스"라고 말하면 나는 GUI에 초점을 맞추지 않고 다양한 모듈이 서로를 위해 할 수있는 일을 집중적으로 다룹니다. 그들이 제공하는 "서비스"는 전체 애플리케이션에 제공됩니다. –

0

한 가지 방법은 요구 사항을 논의하고 디자인 패턴과 소프트웨어를 디자인하는 데 익숙한 사람과 디자인을 매우 매끄럽게 스케치하는 것입니다. 이 과정에서 적용된 디자인 패턴의 개념을 토론 할 수 있습니다.

3

이 질문에 대해 이미 작성된 답변은 훌륭하지만 실시간 소프트웨어 개발의 가장 독특한 부분 인 실시간 기술 요구 사항에 대해서는 언급하지 않았습니다.

소프트웨어가 얼마나 신속하게 대응해야하는지, 얼마나 많은 메모리가 들어 있는지, 부팅 속도가 얼마나 빠른지, 실행 파일의 용량이 얼마나되는지 알아야합니다. 일반 PC를 사용하는 경우 메모리 요구량이 그다지 중요하지 않을 수도 있지만 실행 속도 요구 사항은 대상 플랫폼이 무엇이든 중요합니다.

고급 기술 요구 사항이 "사용자가 만족할만큼 충분히 뛰어남"이라면 낮은 수준의 기술 요구 사항에 대해 걱정할 필요가 있습니다. 기본적으로 대상 컴퓨터, 대상 OS, 타사 라이브러리에서 처리 할 수 ​​있습니다.

이미 저수준 코드를 작성한 것 같습니다. 하드웨어/OS/라이브러리 인터페이스 코드의 나머지 부분을 작성하고 오류 조건과 행복한 경로 모두를 위해 각 부분을 작성하는 것이 좋습니다. 이렇게하면 코드가 각 인터페이스를 어떻게 처리해야하는지 훨씬 더 잘 알 수 있습니다. (예 :이 유틸리티 호출의 시간 초과로 인해 응용 프로그램이 다시 부팅됩니다! 호출하기 전에 시간 초과를 줄이거 나 더 나은 오류 검사가 가능한지 확인하는 것이 좋습니다.)

마지막으로,

while(program_running) 
{ 
    // This period needs to be long enough for you to do your work 
    // but short enough that your user doesn't think your program 
    // is choppy. Anything better than 50 Hz is usually good enough 
    // for an application with a human interface. 
    wait_for_short_period() 
    check_interfaces_for_new_data() 
    update_model() // or state machine 
    update_outbound_interface() // the speaker, monitor, whatever 
} 

이 (대신 대기의주기적인 콜백)에 차이가 있습니다,하지만 일반적인 생각입니다 : 대부분의 실시간 소프트웨어는 루프 뭔가 그래서 등 기록됩니다.

+0

흥미로운 대답. 내 질문 이후로 더 많은 정보를 찾았습니다. 대상 플랫폼은 Linux이며, 앱이 JACK을 사용하기 때문에 Linux 커널은 Real Time Pre-emption 패치 커널 (Ingo Molnár RT 패치)이되어야합니다. RT 스레드는 JACK에 의해 제공됩니다 - 응용 프로그램은 JACK에 대한 콜백을 제공합니다. 콜백은 file i/o, gui code, malloc/free, printf 등의 블로킹 시스템 호출을 호출해서는 안됩니다. 또한 일정한 실행 시간을 권장합니다. 그래서 기간은 JACK에 의해 정해지며, JACK이해야 할 일이 있다면, 내 애플 리케이션이 더 잘 해낸다! –

+0

자, 그럼. 요구 사항을 염두에두고 적절한시기 (요구 사항에 따라 자동, 매주, 매월)에 요구 사항과 비교하여 실적을 점검하십시오. 파일 I/O, GUI 또는 화면 I/O가 없으면 응용 프로그램을 디버깅하는 것이 어려울 수 있습니다. 일반적으로 실시간 코드는 대상 환경을 시뮬레이션하는 환경에서 개발되고 디버깅됩니다. 당신이 그런 것을 가진다면 그것을 사용하십시오. 그렇지 않은 경우 테스트 케이스를 목표와 매우 유사한 방식으로 코드에 푸시하는 자체 솔루션을 만들어야 할 수 있습니다. – thebretness

+0

나열된 제한은 JACK이 실시간으로 사용할 수 있도록 내 앱에서 제공하는 콜백에만 적용됩니다. 내 앱의 나머지 부분은 좋아하는 것을 할 수 있습니다 ;-) –