2015-01-08 2 views
2

어쩌면 누군가가 코드를 작성하는 것이 더 낫다는 것을 알 수 있습니다 (CPU 또는 GPU에 대해 가장 적은 메모리, 가장 빠른 방법).JAVA 다중 생성자와 IF의 상속 비교

첫 번째 방법 : 여러 생성자가있는 모든 인스턴스에 대해 하나의 클래스를 작성하고 어떤 매개 변수가 있는지 "IF"검사를합니까? 예 :

class SomeClass 
{ 
    Parameter a; 
    Parameter b; 
    Parameter c; 

    SomeClass(Parameter a) 
    { 
    this.a=a; 
    } 

SomeClass(Parameter a,Parameter b) 
    { 
    this(a); 
    this.b=b; 
    } 

    SomeClass(Parameter a,Parameter b,Parameter c) 
    { 
    this(a,b); 
    this.c=c; 
    } 

public void method() 
{ 
if(a!=null && b!=null && c!=null) 
DO IN ONE WAY 
if(a!=null && b!=null && c==null) 
DO IN ANOTHER WAY 
if(a!=null && b!=null && c==null) 
DO IN ANOTHER WAY 
if(a!=null && b==null && c==null) 
DO IN ANOTHER WAY 
... 
    } 
} 

두번째 방법 : 당신이 더 많은 매개 변수를 사용할 필요가있을 때 는 부모 클래스마다 inherid 상위 클래스를 확장합니다. 예 :

class SomeClass 
    { 
     protected Parameter a; 

     SomeClass(Parameter a) 
     { 
     this.a=a; 
     } 
     public void method() 
     {USE a parameter} 
    } 

    class SomeClass2 extends SomeClass 
    { 
     protected Parameter b; 

     SomeClass2(Parameter a,Parameter b) 
     { 
     super(a); 
     this.b=b; 
     } 
     public void method() 
     {USE a and b parameter} 
    } 

어떤 방법이 더 좋고 왜 그런지 말해 주시겠습니까?

+1

좋은 독서 책 로버트 마틴의 "클린 코드"가 될 것이라고는 ... http://codereview.stackexchange.com/](http://codereview [에 요청 .stackexchange.com /) – Jens

+0

이것이 http://codereview.stackexchange.com에서 더 잘 논의되는지 아닌지는 잘 모르겠습니다. –

+2

차이점은 매우 작으므로 성능을 기준으로 결정하지 않아야합니다. 어떤 코드가 더 읽기 쉽고 확장 가능하며 일반적으로 더 합리적인 지에 따라 결정해야합니다. – Eran

답변

1

심지어 세 번째 방법 제안 할 것이다 :

interface SomeClass 
{ 
    public void method(); 
} 

class SomeClassWithOneParameter implements SomeClass 
{ 
    private Parameter a; 

    SomeClassWithOneParameter(Parameter a) 
    { 
    this.a=a; 
    } 
    public void method() 
    {USE a parameter} 
} 

class SomeClassWithTwoParameters implements SomeClass 
{ 
    private Parameter a; 
    private Parameter b; 

    SomeClassWithOneParameter(Parameter a,Parameter b) 
    { 
    this.a=a; 
    this.b=b; 
    } 
    public void method() 
    {USE a and b parameter} 
} 

지금 당신이 특정 구현에서 추상적 인 코드에 공장 같은 패턴을 사용할 수 있습니다 상속

class SomeClassFactory 
{ 
    public SomeClass createSomeClassWithOneParam(Parameter a) 
    { 
     return new SomeClassWithOneParameter(a); 
    } 

    public SomeClass createSomeClassWithTwoParams(Parameter a, Parameter b) 
    { 
     return new SomeClassWithTwoParameters(a, b); 
    } 

} 

문제는 점입니다 가장 힘든 커플 링. 상상해보십시오. 언젠가 매개 변수 만있는 클래스가 쓸모 없게된다고 상상해보십시오 ... 다른 클래스가 모두 의존하기 때문에 리팩토링을해야만합니다. 매개 변수 c 만있는 클래스, 왜 매개 변수 a를 가진 클래스에서 상속합니까? 가장 일반적인 공통 분모는 필드 (사례 매개 변수의 경우)를 기반으로해서는 안되지만 기능면에서 보면 method()입니다.

당신이 제안하는 상속 트리의 유일한 장점은 클래스의 다른 구현에서 매개 변수 정의가 반복되는 것을 피하는 것입니다. 그러나 성능 차이는 없으므로 코드를 조금만 수정하면 인터페이스 패턴을 사용하는 것보다 유연성이 떨어집니다.

제안하는 첫 번째 방법입니다. 너무 많은 이유로 수정 될 수있는 큰 수업을 마칠 수있는 문제가 있습니다. 팀에서 일하면 잠재적으로 각 요구 사항에 따라 모든 사람이 수정해야하는 클래스가 될 수 있습니다. 따라서 mantainability와 가독성에 영향을 미칩니다. 이런 종류의 질문이 더