프로그램 코드와 그래픽 인터페이스 코드를 다른 클래스에 패키지화하는 것이 모범 사례로 간주되는 이유는 무엇입니까?


15

따라서 선생님은 프로그램 코드와 그래픽 인터페이스 코드를 같은 클래스로 캡슐화하지 말고 완전히 독립적으로 유지하는 것이 매우 중요하다고 말합니다. 현재 그리드가있는 아이폰 게임을 만들고 있습니다. 나에게 같은 "그리드"클래스에서 그래픽 그리드와 기술 코드를 만드는 것이 훨씬 더 합리적입니다. 다른 프로그래머가 이것에 눈살을 찌릅니까? 그래픽 인터페이스와 코드를 독립적으로 유지하는 것이 정말로 중요합니까? 그렇지 않으면 어떤 문제가 발생합니까?

감사합니다!

편집 : 고마워요! 프로젝트를 먼저 작성한 다음 코드를 복사하여 우려 디자인의 분리를 형성하는 것이 좋을까요? 나는 이것이 목적을 완전히 잃을 수도 있다는 것을 알고 있지만 연습처럼 ... 다음에이 디자인 패턴을 처음부터 적용 할 수 있습니까?

답변:


17

교사가 말하는 개념은 우려의 분리라는 것입니다.

프로그램을 완성한 다음 Android로 포팅하기로 결정한 경우 상황에 맞게 설명하십시오. 그리드 로직을 별도로 유지하는 것보다 훨씬 더 많은 코드를 다시 작성해야합니다.

인터페이스 컨트롤은 말한 내용을 그리는 데에만 관심이 있고, 그리드 로직은 그리는 방법이 아니라 모눈에있는 내용에만 관심이 있어야합니다.

도움이 되셨습니까?


고마워요. 문제는 클래스에서 둘 다 캡슐화 할 때 최종 제품을 시각화하는 것이 훨씬 쉽다는 것입니다. 이것이 "문제의 분리"를 따르지 않는 정당한 이유입니까? 아니면 절대적으로 필요하며 적절한 프로그래머라고 부를 수 없습니다 : p?

이 분리의 긍정적 인 효과는 예를 들어 GUI를 교체하기로 선택한 경우 게임 로직을 다시 작성할 필요가 없다는 것입니다.

@John-디자인을 시각화해야하는 경우 사양 문서를 작성하십시오. 설명 할 수 있으면 게임 인터페이스 자체에서 그래픽 인터페이스 코드를 분리 할 수 ​​있습니다.
Ramhound

3
또한 그리드 코드를 쉽게 테스트 할 수 있습니다. GUI 테스트는 (환경에서 발생할 수있는 혼란스러운 문제로 인해) 고통스럽기 때문에 GUI가 테스트 가능한 것보다 얇은 "분명히 올바른"레이어가되도록하는 것은 큰 승리입니다. (다시, 이것은 우려의 분리입니다.)
Donal Fellows

1
@ 존 : 우리 중 일부는 수행함으로써 가장 잘 배웁니다. 이 프로젝트가 크지 않다고 가정하면 단일 클래스로 작성하여 iPhone에서 작동하도록하십시오. 이제 "고통 지점"을 추적하면서 Android로 이식하십시오. 마지막으로 Russ C가 제안한대로 다시 작성하십시오. 논리와 표현의 분리가 왜 필요한지 알게 될 것입니다.
피터 로웰

4

코드를보다 쉽게 ​​변경 하려면 . 내일 그리드를 사용하지 않고 목록을 사용하려면 어떻게해야합니까? GUI가 논리와 분리되면 쉽게 수행 할 수 있습니다.

그 외에도 더 재사용 가능한 코드를 작성하게 됩니다. GUI에 기술 코드가 없으면 재사용 할 수도 있습니다. 모든 옵션을 사용하여 멋진 그리드를 한 번 만들어 다른 프로젝트에서 사용할 수 있습니다. GUI와 기술 코드를 혼합하면이 작업을 수행 할 수 없습니다.

또한 읽기 쉬운 코드를 제공합니다. 그리드가 GUI 기능 만 수행하는 경우 코드 를 이해 하거나 변경하기 가 더 쉽습니다 .


3

코드가 논리적 작업으로 분리되는 관심사 분리에 대한 객체 지향 프로그래밍의 일반적인 접근 방식 . 처음에는 더 많은 작업처럼 보일 수 있습니다. 그러나 프로젝트가 성장함에 따라 코드를보다 쉽게 ​​추적하고 관리 할 수 ​​있습니다.

따라서 그리드를 표시하는 코드와 해당 그리드에 표시 될 수있는 데이터를 처리하는 코드를 분리하는 것이 좋습니다.



0

다른 답변을 작성하고 예제를 제공하려면 논리 / 데이터를 그리드에 삽입하거나 그 반대로 할 수 있어야합니다.

그리드 컨트롤은 Render메소드 또는 메소드 를 노출 할 수 있습니다 DataBind.

class GridControl
{
    public Render(GridData data) { ... }
}

또는

class GridControl
{
    public DataBind(GridData data) { ... }
}

그런 다음 논리 장치는 GridControl을 사용하여 데이터 객체를 바인딩하거나 데이터 객체가 변경 될 때마다 데이터 객체로 렌더를 수동으로 호출 할 수 있습니다.

GridLogic에는 GridControl에 대한 참조도 있어야하므로 발생하는 모든 입력 / 이벤트에 바인딩 할 수 있습니다.

데이터 바인딩의 기본 개념은 그리드 컨트롤이 변경 사항에 대한 데이터를 감시하고 렌더링 기능을 노출하면 로직 유닛이 컨트롤을 수동으로 다시 렌더링한다는 의미에서 자체 렌더링됩니다.

이런 식으로 논리를 분할하고 그리드를 올리면 아무 것도 깨지 않고 서로 쉽게 변경할 수 있습니다. ListControl모든 논리를 다시 쓰지 않고도 그리드 대신 데이터를 목록으로 표시하기 위해 a와 같은 새로운 컨트롤 을 작성할 수도 있습니다.


0

MVC 아키텍처를 살펴 보는 것이 좋습니다 .

그것은 당신이 언급 한 개념을 개선 한 것입니다 (프로그램 코드와 그래픽 인터페이스의 분리). MVC는 Model-View-Controller를 나타냅니다. 여기서 모델은 데이터이고,보기는 그래픽 인터페이스 코드이고 COntroller는 데이터를 처리하는 코드입니다.

이 방법으로 프로그램의 세 부분을 만들었습니다. 각 부품은 다른 두 부품을 변경하지 않고도 교체 할 수 있습니다.


0

앞으로 발생할 수있는 변화의 종류에 따라 다릅니다. 최소화하려는 것은 각 단일 기능 변경을 올바르게 구현하는 데 필요한 수동 코드 변경 수입니다.

MVC가이기는 곳은 변경 사항이 V 부분 또는 "보기"에 국한된 경우입니다.

내 경험상 변경 사항이 세 부분 모두에 영향을 줄 가능성이 훨씬 높 으므로 분리 하지 않으면 더 좋습니다 . 내가 의미하는 바를 보여주기 위해, 나는 오랫동안 동적 대화 ( Dynamic Dialogs ) 라고하는 기술을 사용 했다. "사용자가 이름을 편집 할 수있게하고 XYZ가 완료되면 XYZ를 완료 할 때"와 같은 새로운 요구 사항이 단일 블록으로 소스 코드에 입력된다. 본문:

if(deTextEdit(&sName)){
  // do XYZ
}

여러 개의 개별 편집 대신, 편집 필드가 존재하도록 지정하고, 고유 식별자를 구성하고, 모델 변수에 바인딩하고, 로스트 포커스 이벤트 핸들러에 링크합니다.

해당 링크로 이동하면 더 복잡한 예가 표시됩니다.

기본적으로 아이디어는 코드를 도메인 특정 언어로 전환하여 목적을 달성하기 위해 편집 횟수를 최소화하는 것입니다. 그렇게하려는 이유는 노력을 줄일뿐 아니라 하나 이상의 편집 내용을 잊어 버리거나 잘못 코딩하여 버그를 도입 할 기회를 줄이는 것입니다. 또한 소스 코드의 크기를 대략 1 배 줄입니다.

무료가 아닙니다. 프로그래머를위한 일회성 학습 곡선을 소개합니다.


0

그래픽 인터페이스는 시스템에 따라 다르지만 게임 코어는 실행되는 시스템과 완전히 독립적 인 알고리즘입니다. 두 개의 Appart를 유지하면 한 서브 시스템의 변경 사항이 다른 서브 시스템의 작동 방식에 영향을 미치지 않기 때문에 프로그램을보다 쉽게 ​​유지 보수, 테스트 및 디버그 할 수 있습니다. 이식성에 신경 쓰지 않아도 프로그램의 견고성과 유지 관리에 관심이 있습니다.

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