2009-03-17 6 views
3

내가 :,많은 소규모 클래스에서 코드 중복을 피하려면 어떻게해야합니까?

Class English{ 
    String name = "English"; 
    String alias = "ENG"; 
} 

Class French{ 
    String name = "French"; 
    String alias = "Fre"; 
} 

마찬가지로 다른 언어 수업 등을 English, Spanish, French라는 다른 클래스가 있습니다. Language라고

그리고 하나 더 클래스 :

Class Language{ 
    String name = ""; 
    String alias = ""; 
} 

내 언어 클래스에 스페인어/영어/프랑스어 캐스팅하려는 내 요구 사항에 따라.

Class ABC{ 

    main(){ 
     Language lan = new Language(); 
     Object obj = getObject(1); 
     if(obj instanceof English){ 
      lan.name = ((English)obj).name; 
      lan.aliasName = ((English)obj).aliasName; 
     } 
    } 

} 

10 개 언어를 사용하는 경우 10 개 언어로 동일한 코드를 작성해야합니까? 이 경우 어떻게 단일 메소드를 만들고 그 인수를 매개 변수로 전달할 수 있습니까? 이 같은 뭔가 ..

을 여기

setVariablesForLanguage(String className, Object obj) 

는 난 단지 2 변수를 보였으 나 100 개 이상의 변수를 포함합니다 내 클래스는 .. 내 실제 rewquirment 내가 그 언어 중 하나에서 내 언어 변수를 설정하려는 것입니다

답변

3

이름 또는 별칭 속성을 선언하는 추상 클래스 나 인터페이스를 사용하십시오. 인터페이스를 구현하거나 각 클래스에 대한 추상 클래스에서 파생됩니다.

이것은 "매우 비슷하게 보이는 많은 클래스"의 공통적 인 문제에 대해 작동하는 일반적인 원리입니다. 그러나 실제로 여기서 무엇이 일어나고 있습니까? 왜 영어를 여러 번 사용합니까? 여기 진짜 상태가 뭐니?

실제로 일종의 smart enum을 원하십니까?

0

왜 영어, 프랑스어 등을 모두 언어의 하위 클래스로 만들지 않습니까?

그런 다음 코드는 간단 할 것이다 :


Class ABC{ 

main(){ 

Language lan = getObject(1); 

} 

} 

편집 : 위에서 언급 한 바와 같이, 언어는 인터페이스 또는 추상 클래스와 더 잘 할 수 있습니다.

+0

위에서 사용 된 것처럼 '언어'개념의 동작은 하나의 클래스에 매핑됩니다. 각 언어는이 클래스의 인스턴스가됩니다. 각 언어에 대한 하위 클래스를 정의하면 코드 중복을 피할 수 없습니다. – xtofl

15

각각 작은 값을 갖는 여러 개의 작은 클래스를 만들고 있다면 클래스를 만들어서는 안됩니다. 언어의 지속적인 인스턴스를 만드는 것이 좋습니다. 언어 :

public static final Language ENGLISH = new Language("English", "Eng"); 
public static final Language FRENCH = new Language("French", "Fre"); 

그리고 일치하도록 언어를 지정하십시오. (실제로는 enum과 비슷하게 보이지만 한 번에 너무 많이 덤프하지는 않습니다.)

그런 다음 주 코드에서 영어, 프랑스어 등의 인스턴스인지 확인하지 마십시오. 그것은 언어의 경우 간단하게 내가, 10 개 언어를 나는 10 개 개의 다른 언어에 대한 동일한 코드를 작성해야 할 경우

Language lan = new Language(); 
Object obj = getObject(1); 
if(obj instanceof Language){ 
    lan.name = ((Language)obj).name; 
    lan.aliasName = ((Language)obj).aliasName; 
} 
+0

+1, 내가 게시하고 싶은 것 (아마도 isinstance-stuff 이외에, 내가 싫어하는 것처럼)) – Tetha

+1

원칙은 '행동이 아닌 데이터를 변경하는 서브 클래스'입니다. 동작이 변경되지 않으므로 둘 이상의 클래스가 필요하지 않습니다. –

+1

실제로 열거 형을 원하지만 기능이이 답변에서 제안한 것과 거의 같을 것입니다. –

2

를 호출 한 후, 확인?

아니요, 실제로는 수업이 전혀 필요하지 않을 수도 있습니다.

속성이 같고 속성을 다르게 만드는 유일한 속성은 이러한 속성의 값인 경우 하나의 클래스 (언어)를 가질 수 있으며 각 언어마다 다른 값을 사용할 수 있습니다.

그렇다면 알리를 말할 때 별칭을 의미할까요?

public class Language { 

    String name; 
    String alias; 

    public Language(String aName, String anAlias) { 
     this.name = aName; 
     this.alias = anAlias; 
    } 
} 

을 그리고 그에 따라 값을 설정

이처럼있을 수 있습니다.

Language lan = new Language(); 

Object obj = getObject(1); 

if(obj instanceof English){ 

    lan.name = ((English)obj).name; 

    lan.aliasName = ((English)obj).alias; 
} 

이를 위해 : 당신이 "으로 getObject()"의 서명을 변경하는 경우

그래서, 대신 객체를 반환, 당신이에서 코드를 변경할 수 있습니다 다음 언어 자체를 반환

Language lang = getObject(1); 

그리고 그게 전부입니다. getObject 내부에서이처럼 정의 할 수 있습니다 :

public Language getObject(int id) { 
    switch(id) { 
      case 0: return new Language("English", "ENG"); 
      case 1: return new Language("French", "FRE"); 
      case 2: return new Language("Spanish", "ESP"); 
      case 3: return new Language("German", "GER"); 
      case 4: return new Language("Portuguese", "POR"); 
      .... 
      etc. 
     } 
} 

당신이 생각하는 수도로, 행동다른 때 서브 클래스 또는 다른 클래스는 이해하기. 동작이 동일하고 이 변경된 경우데이터이므로 클래스를 매개 변수화하는 것만으로 충분합니다.

최종 발언 :

필요에 따라 아마 Locale 클래스를 살펴보고 아마이 article이 무엇을 알고 읽을 수있는 것은 자바 상황 이런 종류의 가지고있다. 나는 당신의 코드가 그것을 필요로하는지, 그렇지 않으면 도움이되는지를 모른다.

+0

왜 새로운 언어 (((언어) obj) .name ((언어) obj)를 반환하지 않습니까?별칭). 그런 스위치 케이스 블록을 쓰고 코드 'n'번 복제 하는게 뭐야? –

+0

@Livepool : 저는 getObject 메소드 내부에 무엇이 있는지조차 모릅니다. 대부분 객체가 내부에 생성됩니다. 바로 Language 인스턴스를 만들 수있는 동안 왜 Object를 만들겠습니까? "Chinni"만이 알 수 있습니다. – OscarRyz

1

이 질문에 대한 완벽한 해결책은 아닙니다 (실제 솔루션이 아닐 수도 있음).하지만 제공 한 코드로 더 나아질 것이라고 생각되는 몇 가지 사항을 지적하고 싶습니다.

제공하는 코드에 대한

,이 같은 것을 쓰고 더 나을 것 : 일반적으로

abstract class Language 
{ 
    private final String name; 
    private final String alias; 

    public Language(final String m, final String a) 
    { 
     name = n; 
     alias = a; 
    } 

    public String getName() 
    { 
     return (name); 
    } 

    public String getAlias() 
    { 
     return (alias); 
    } 
} 

class English 
    extends Language 
{ 
    public English() 
    { 
     super("English", "ENG"); 
    } 
} 

class ABC 
{ 
    public static void main(final String[] argv) 
    { 
     fnal Language lang; 

     lang = getObject(1); 
    } 
} 

:

  • 당신은 가능한 한 instanceof를 많이 피해야한다.
  • 영어, 프랑스어 등의 동일한 유형의 항목이있는 경우 상위 클래스를 만들어 공통 항목을 입력해야합니다.
+1

- 변경 사항이 데이터 일 뿐이며 매개 변수 만 지정할 경우 하위 클래스를 만들지 마십시오. – OscarRyz

+0

동의합니다 - 나는 단지 제시된 코드를 고치기 만했습니다 ... – TofuBeer

관련 문제