2017-10-31 12 views
2

파이썬에서 kotlin으로 변환하여 해당 패키지를 사용하는 시스템을 마이그레이션 할 수있는 패키지가 있습니다.kotlin, 기본 클래스 생성자에 매개 변수를 전달하는 것을 단순화하는 방법은 무엇입니까?

패키지 내에는 모든 변형 또는 공통 기본 클래스의 '변종'인 일련의 클래스가 있습니다.

코드의 대부분은 상당한 수의 선택적 매개 변수가있는 기본 클래스에 있습니다. 그래서 생각해

개방 클래스 BaseTree을 (발 높이 : 지능 = 10, 발 뿌리를 : 부울 = TRUE, // ...... 더 많은!

class FruitTree(val fruitSize, height:Int=10, roots:Boolean=true, 
    // now need all possible parameters for any possible instance 
    ):BaseTree(height=height, roots=roots //... yet another variation of same list 

을 코드는 실제로 나무 아니다 이 개념을 전달하는 간단한 방법이라고 생각했습니다. 기본 클래스에는 약 20 개의 매개 변수가 있고 하위 클래스에는 약 10 개가 있으며 각 하위 클래스는 기본 클래스의 매개 변수 목록과 동일한 두 가지 변형을 효과적으로 반복해야합니다. 매개 변수 목록이 변경되는 경우 실제 악몽이 발생합니다!

Java 배경의 사람들은 "20 매개 변수가 너무 많습니다"라고 말할 수도 있습니다. 이것은 옵션 매개 변수이며,이 디자인 측면에 영향을주는 언어 기능입니다. 20 개의 필수 매개 변수가 미친 것이지만 10 개 또는 20 개의 선택적 매개 변수가 드문 경우가 아니므로 sqlalchemy Table을 확인하십시오.

파이썬에서, 당신은 당신이 할 수있는 기본 클래스 생성자를 호출합니다 :

def __init__(self, special, *args, **kwargs): 
    super().__init(*args, **kwargs) # pass all parameters except special to base constructor 

사람이 기술을 알고 있나요, 다른 방법을 사용하여이 매개 변수 목록을 반복하지 않도록하기 위해 (아마도 인터페이스 또는 뭔가를 사용하고 계십니까?) 각 하위 클래스에 대해 반복해서?

답변

0

이 사용 사례를 단순화하는 디자인 패턴이 없습니다.

최상의 솔루션 : 자바와 비슷한 접근 방식을 사용하도록 코드를 리팩터링합니다. 선택적 매개 변수 대신 속성을 사용합니다.

유스 케이스 설명 : 수많은 선택적 매개 변수가있는 널리 사용되는 클래스 또는 메소드는 Java에서는 실용적이지 않으며 kotlin은 Java 코드를 개선하는 방법으로 가장 진화되었습니다. 5 개의 선택적 매개 변수가있는 파이썬 클래스는 선택적 매개 변수없이 Java로 변환되어 5 개를 가질 수 있습니다! (그리고 5 계승은 입니다) 다른 자바 서명 ... 다른 말로하면 엉망입니다.

거대한 매개 변수 목록으로 일상적으로 인스턴스화해야하는 개체가 없기 때문에 normall python 클래스는 대부분의 호출에서 이러한 선택적 매개 변수를 지정하지 않아도되고 클래스 매개 변수가 예외 상황에 해당 할 때만 클래스 용으로 발전합니다. 실제 사용 사례는 많은 수의 선택적 매개 변수를 구현 한 것입니다.이 경우 3 개 이상의 선택적 매개 변수를 사용하여 개별 개체를 인스턴스화하는 것은 매우 드뭅니다. 따라서 응용 프로그램에서 500 번 사용되는 10 개의 선택적 매개 변수가있는 클래스는 여전히 3 개의 선택적 매개 변수가 한 인스턴스에서 사용 된 최대 매개 변수가 될 것으로 기대합니다. 그러나 이것은 클래스가 재사용되는 빈도에 관계없이 Java에서 작동 할 수없는 설계 방식입니다.

자바에서는 함수가 선택적 매개 변수를 갖습니다. 즉, Java 라이브러리에서이 방법으로 인스턴스화 된 객체가 발생하지 않을 수 있습니다.

하나의 필수 인스턴스 매개 변수와 5 개의 가능한 옵션이있는 개체를 생각해보십시오. Java에서 이러한 옵션은 각각 setter에 의해 설정 될 수있는 속성이며 객체는 인스턴스화되고 setter는 관련 옵션을 설정하기 위해 호출되지만 드물게 해당 옵션에 대한 기본값을 변경해야합니다.

단점은 이러한 옵션을 생성자에서 설정할 수 없으며 변경할 수 없지만 결과 코드는 선택적 매개 변수를 줄입니다.

또 다른 접근법은 코드가 약간 다른 뉘앙스로 보일 수있을 때조차도 모든 도구를 대체하는 일련의 특수 도구를 사용하여 '스위스 육군 칼'개체를 줄이는 것입니다. 같은 테마.

kotlin의 선택적 매개 변수에 대한 지원에도 불구하고 kotlin의 상속 구조는이 기능의 무거운 사용을 위해 아직 최적화되지 않았습니다.

0

하위 클래스에 실제로 구성자의 많은 매개 변수가있는 경우> 그럴 수 없습니다. 당신은 그들 모두를 통과시켜야합니다.

하지만 (대부분)이 더 좋은 징조가 생성자/함수가 많은 매개 변수를 가지고, 없다 ...

당신은 혼자이 켜집니다. 그것은 gradle-slack 채널에서 이미 논의되었습니다. 어쩌면 장래에, 우리는 이것에 관해서 컴파일러 - 도움을 얻을 것이다. 그러나 지금 당장 당신은 스스로 인수를 전달할 필요가있다.

1

BaseTree(height, roots)과 같은 이름은 건너 뛰어도되지만 변수는 순서대로 넣을 수 있지만 파이썬은 동적 언어이기 때문에 파이썬과 같은 일을 할 수 없습니다.

Java가 변수를 수퍼 클래스에도 전달해야하는 것은 정상입니다.

FruitTree(int fruitSize, int height, boolean root) { 
    super(height, root); 
} 

기본 클래스에 약 20 매개 변수 및 약 10 서브 클래스

이 가능성이 가장 높은 수업 설계의 문제가

이 있습니다.

+0

내가 처음 sqlalchemy에 대해 생각할 수있는 인기있는 파이썬 패키지와 내가 본 첫 번째 주요 클래스 인 Table 클래스에는 말 그대로 20 개의 선택적 매개 변수가있다 (이것은 필요한 매개 변수 외에 표의 필드). 이것은 그들이 자신의 수업 설계에 문제가 있다는 것을 의미합니까? 아마도 모든 파이썬 널리 사용되는 패키지는 디자인에 문제가 있습니까? 나는 이것이 언어에서 선택적 매개 변수를 갖는 결과 인 차이라고 생각합니다. 선택적 매개 변수가없는 Java에서 예 20 매개 변수는 선택 사항 일 수 없으므로 재앙입니다. – innov8