2014-02-12 2 views
0

나는 재미있는 프로그래밍 문제를 겪어왔다. 일부 컨텍스트 내 질문에 도움이되는 ... 현재 내가 게임 즉 Material.DIRT, Material.WATER, Material.CLOTH에 필요한 모든 자료를 보유 할 재료 Emum를 사용하는 게임을 쓰고 있어요서브 클래스가 많은 우아한 코드?

그러나 가능한 한 코드를 수정하고 누군가가 게임을 확장하여 그렇게 할 수있는 새로운 자료를 추가해야하는 능력을 갖고 싶습니다. 따라서 현재의 Enum 시스템이 고장 나서 Class/Subclass 시스템으로 전환하려고 시도했습니다. 나는 이것을하기위한 두 가지 방법을 발견했다. 그것들은 장단점을 가지고 아래에 설명되어있다.

사례 1 - 추상 머티리얼 클래스와 서브 클래 싱을 가짐. 따라서 모든 자료는 자료를 확장합니다. 이것은 우리가 이제는 물질을 같이 그룹화 할 수 있다는 점에서 유리합니다. 즉, Fabric이 Material을 확장 한 다음 Wool과 Cotton 등이이를 확장 할 수 있습니다. 이것의 문제는 모든 물질에 대해 클래스가 존재해야하며 각 물질에 대한 매개 변수가 거의 없어서 낭비처럼 느껴집니다. 1000 개의 자료가 있다면 거기에는 사실상 아무것도없는 1000 개의 클래스가 있습니다. 나는 익명의 클래스를 사용함으로써 이것을 줄일 수 있었지만 이제는 코드가 하나의 자료를 다른 자료와 구별 할 수있는 방법이 없다. 케이스 2의 주요 문제점 인 이드 시스템을 사용할 수 있습니다.

케이스 1의 질문은 다음과 같습니다. 보다 우아한 방법이 있습니까?

사례 2 - 단일 Material 클래스가 있고 각각의 새 재료를이 클래스의 인스턴스로 인스턴스화하여 각 재료를 다른 ID/이름으로 정의합니다. 이렇게하면 많은 글을 절약 할 수 있으며 자료를 구분할 수 있습니다. 이것에 대한 문제는 이제 id 시스템을 가지고 있습니다.이 시스템을 기반으로하는 것은 무엇입니까? 문자열, ints? 코드에서 하드 코드 된 문자열과 int를 사용하지 않는 복잡한 자유 시스템을 항상 갖고 싶어서이 질문을드립니다. 이것이 조판에 대한 걱정이 없으므로 열거 형을 좋아하는 이유입니다. 또 다른 문제는 새로운 자료를 추가하려는 사용자가 다른 사용자와 충돌하는 ID를 가질 수 있다는 것입니다.

케이스 2에 대한 내 질문 : 인스턴스를 고유하고 일관되게 구별 할 수있는 완벽한 방법이 있습니까 (모든 런타임마다 동일합니까?).

읽어 주셔서 감사합니다. 이 작업을 수행하는 최선의 방법이나 방법에 대한 도움이나 방법이 가장 높이 평가됩니다.

편집 : 일부 자료에는 관련 메서드 및 동작이있을 수 있습니다. 일부 행동은 특정 자료에만 고유 할 수 있으며 일부는 "그룹"과 유사합니다.

+1

'인터페이스 재질'을 사용하려면'String materialName()'을 반환해야합니다. 'interface'는 또한'Material' -'getStrength()'등등의 다양한 동작을 반환 할 것을 요구할 수 있습니다. 그리고'enum'이 당신의 내부 자료를위한'interface'를 구현하게합니다. 원하는 경우 다른 사용자는 자체 구현을 제공 할 수 있습니다. –

+1

저는 제 자신의 프로젝트 (요소 RPG 설정을 위해 여러 요소의 요소와 조합 자녀)를 위해 사례 1을 사용했습니다. 열거 형 및 다양한 다른 방법 (인터페이스 등)을 시도했지만 아무도 잘 작동하지 않았습니다. 다른 접근 방법은 아래 Elazar가 말하는 것입니다. – Gorbles

+0

편집에 더하여 Visitor Pattern을 사용하여 머티리얼의 속성에 액세스하는 것이 좋습니다. 이렇게하면 동작을 직접 노출 할 필요가 없으며 동작을 전환하기 위해 다형성을 활용할 수 있습니다. 이렇게하려면'CASE 1 '을 사용하고'인터페이스'뒤에 모든 것을 숨겨야합니다.Visitor Pattern을 사용하면 자료를 구분할 필요가 없으므로 ID가 필요 없으며 관련 'accept'메소드를 재정의하여 익명 클래스를 사용하여 행동을 변경할 수 있습니다. –

답변

2

일부 DSL (기본적으로 간단한 표)으로 작성된 모든 자료가 포함 된 구성 파일을 사용하십시오.

+1

다른 재료는 다형성이있는 곳에서 다른 _behaviours_를 가질 수 있다고 생각합니다. 그렇다면이 솔루션은 구현하기가 까다 롭습니다 (Drules?). –

+0

이것은 구현에 따라 다르지만 게임의 자료와 같은 간단한 것들에 대한 행동을 테이블에 쉽게 인코딩 할 수 있다고 생각합니다. – Elazar

+1

동의하고 +1을받습니다. 그러나 OP가 일종의 Visitor Pattern을 원한다면 (이는 이해할 수 있습니다. 예를 들어, 의류 품목이 여러 가지 재료로 만들어지고 절단되거나 일부가 잡히는 경우) 이것이 번거로워집니다. –

관련 문제