2014-11-28 6 views
4

나는 자바와 파이썬 코드를 작성하고있다. 많은 언어에서 두 언어의 객체가 일관성없는 방법으로 호출하는 경우가 종종 있습니다. 예를 들어,이 파이썬 코드 조각을 가져 가라. 당신이 호출 할 때, 이러한 예는 모두 매우 유사하다Convention : 메서드를 작성할 때 값을 반환하거나 직접 데이터를 변경해야합니까?

class Bar(object): 
    def __init__(self, num = 0): 
     self.num = num 

    def __str__(self): 
     return str(num) 

    def addOne(self): 
     return Bar(num + 1) 

if __name__ == "__main__": 
    bar = Bar() 
    print(bar) # Outputs 0 

    bar.addOne() 
    print(bar) # Still Outputs 0 

    bar = bar.addOne() 
    print(bar) # Now Outputs 1 

하지만 푸 클래스 :

class Foo(object): 
    def __init__(self, num = 0): 
     self.num = num 

    def __str__(self): 
     return str(self.num) 

    def addOne(self): 
     self.num += 1 

if __name__ == "__main__": 
    foo = Foo() 
    print(foo) # Outputs 0 

    foo.addOne() 
    print(foo) # Outputs 1 

대 (문법은 중요하지, 그냥 방법이 데이터로 작업하는 방법을 참고) Foo.addOne()은 클래스 내부의 num 변수를 변경합니다. 그러나 Bar 클래스는 addOne() 메서드가 num 변수가 업데이트 된 새 객체를 반환합니다. 어떤시기에 어떤 상황이 바람직한지, 사람들은 무엇을 기대합니까? 그리고 이것은 언어 간 차이가 있습니까?

+0

그냥 증가 시키려면 왜 새 오브젝트를 돌려 주겠습니까? 문제는 증가 시키거나 (객체 변경) 새로운 객체가 필요합니까? 아마도 중복 객체를 피할 수 있다면 새로운 객체를 반환하지 않아도됩니다. – user1767754

+0

메서드가 전달 된 개체의 상태를 수정할 수있는 메서드 (예 : 계산 메서드에서 값을 반환 할 수있는 개체)가 컨텍스트에 있다고 가정합니다. – MadProgrammer

+0

@ user1767754 죄송합니다. 이것은 나쁜 예입니다. 실제 시스템에서는 쓸모가 없습니다. 하지만, 그것은 예입니다 – Jerfov2

답변

1

Java에는 변경 불가능한 특정 클래스가 있습니다. 개발자 (Java 개발자)도 이러한 클래스를 만들 수 있습니다. 원하는 경우에도 객체의 내부 상태를 변경할 수 없습니다 (예 : Integer 객체를 새로 만들지 않고 Integer 객체에 1을 추가 할 수없고 새 객체를 만들지 않고 "a"를 String 객체에 추가 할 수 없음). String 개체를 원한다고해도).

이제 클래스가 변경 불가능하지 않은 경우 두 가지 방법 (기존 인스턴스의 내부 상태 변경 또는 새 인스턴스 만들기)을 자유롭게 사용할 수 있습니다. 그러나 당신이 취하는 접근 방식에 상관없이, 발신자가 무엇을 기대하는지 알 수 있도록 문서화해야합니다. 이것이 Java 세계에서 적어도 내가 아는 한 작동하는 방식입니다.

+0

하지만 정수는 범위에서 임시로 생성됩니다. 그렇지 않습니까? – user1767754

+0

@ user1767754 무슨 뜻인지 이해가 안됩니다. –

0

짧은 대답 : 그러한 규칙이 없습니다. 언어로서의 Python은 객체 지향 및 기능 패러다임을 결합합니다. 저에게 개인적으로, 각각의 경우에 선택할 수있는 선택은 파이썬 개발자에게 가장 까다로운 기술입니다.

많은 질문에 답해야합니다. 당신의 객체가 어떻게 사용되어야 하는가? 스레드간에 공유됩니까? 성능이 문제가됩니까? 애플리케이션 아키텍처의 관례는 무엇입니까? 아마도 대답이 나중에 변경되어 리팩터링을위한 준비가되었을 것입니다.

파이썬은 자바보다 덜 제한적이어서 객체의 상태에 대해 어떤 보장도하지 못한다. Java처럼 낮은 수준의 성능 최적화를 수행 할 수있는 가정을 할 수 없습니다. 그래서 'mutable'/ 'immutable'이라는 정의는 파이썬 클래스를위한 단순한 관습입니다. 언어의 기술적 특징보다 우리가 그 대상을 이해하는 방법이 더 많습니다.

일반적인 경우 (또는 의심스러운 경우) POLA principle을 따르고 일반적인 패턴을 고수하는 것이 좋습니다. 예를 들어, 객체가 문자열처럼 동작하면 새 인스턴스를 반환합니다. 사전과 같은 경우 적절한 수정을 수행하십시오. 극단적 인 경우는 일반적으로 잘못되어, 좋은 Python 디자인은 두 세계의 장점을 사용합니다.