2016-09-19 2 views
2

파이썬에서는 클래스의 메서드에 @property 데코레이터를 사용하여 속성으로 사용할 수 있습니다. 따라서 car.tyres() 대신 car.tyres이라고 적어주세요. car::tyres에 액세스 할 때마다 OO 패러다임에 따라 일부 메서드가 실행되어 값을 반환합니다. 이 방법으로 객체에 정보를 저장하지 않고 액세스시 계산할 수 있습니다 (메모리와 CPU 시간 사이에 균형을 유지할 수 있음).S4 오브젝트의 속성 데코레이터

지금은 R에서 비슷한 S4 객체를 데 이것은 R에 좋습니다 여부를이 S4 개체에 대한 R 가능하다

  1. 여부를 궁금해하고
  2. ? (2) 내가 좀 더 일반적인 방법은 R에서이 작업을 수행 할 수 있다는 느낌이에 관해서는

는 일반적인 기능 tyres()를 작성하고 다음 tyres(car)을하는 것입니다. 하지만 그건 내가 OO 프로그래밍으로 보이지 않습니다. 누군가 정교 할 수 있습니까?

답변

1

는 일반적인 기능 tyres()를 작성하고 다음 tyres(car)을하는 것입니다.

물론입니다. 이것은 R의 자연스러운 방식이며 균일 한 인터페이스를 노출하는 이점이 있습니다 .

하지만 OO 프로그래밍으로는 생각되지 않습니다.

왜 안 되니? OOP는 일반적인 인식 (C++, C#, Java 및 Python과 같은 언어가 상업적으로 성공했기 때문에이 일반적인 구문을 모두 따르기 때문에)에 대한 구문은 object.method()이 아닙니다. 실제로 OOP은 데이터를 캡슐화하고 객체가 서로 통신하도록하는 느슨한 원칙에 관한 것입니다.

다른 언어는 필요에 따라 다르게 처리합니다. R6은 객체 지향에 대한 Java와 유사한 문법을 ​​매우 깔끔하게 모방하여 특정 시나리오에서 사용법을 이해할 수 있습니다. 그러나 S3의 신택스는 객체 지향적이지 못하며 R 계열과 유사합니다. 신택스는 다른 R 기능과보다 쉽게 ​​구성됩니다.


1 사이드 참고 : 모니 커 "균일 호출 구문"아래 foo.bar(baz)bar(foo, baz) 구문 사이의 동등성을 도입 대해 C++ 표준위원회에서 맹렬한 전투가 현재있다.

1

S4에서이 작업을 수행하는 방법을 찾지 못했습니다. 그러나 이것은 R6 객체에서 가능합니다. Active binding이라고합니다.

R6 객체를 사용하면 Java 및 C++와 같은 다른 OOP 언어와 마찬가지로 $ 연산자를 사용하여 객체 인스턴스에서 직접 속성 및 호출 멤버 메서드에 액세스 할 수 있습니다. 이것은 S3 및 S4 객체보다 R에서 더 자연스러운 OOP 코드를 허용합니다. (2) 내가 좀 더 일반적인 방법은 R에서이 작업을 수행 할 수 있다는 느낌이에 관해서는

+0

"자연스러운 OOP 코드"는 R에서 부자연 스럽기 때문에 논의의 문제입니다 (내 견해로는 잘못된 것입니다). 기능적 언어 인 R은 그러한 언어보다 OOP에 대한 시각이 다릅니다. 자바와 C++. 많은 사람들이 유사한 언어를 통해 OOP에 처음 노출되지만 OOP에 대한 독점권은 없습니다.실제로 자바 스타일의 OOP는 훨씬 더 기능적인 패러다임을 따른 원래 OOP와 거의 비슷하지 않습니다. –

+0

@KonradRudolph, OK, 동의합니다. OOP는 캡슐화, 상속, 다형성 (polymorphism)에 관한 것입니다 ... 심지어 S3는 그것들을 포함합니다. 이러한 개념을 특정 구문과 내 자신의 취향과 혼동하지 않으려면 나에게 똑똑하지 않습니다. –