2016-09-19 4 views
2

pythonでは、クラスのメソッドに@propertyデコレータを使用してプロパティとして使用できます。だからcar.tyres()の代わりにcar.tyresと書いてください。 car::tyresにアクセスするたびに、いくつかのメソッドが実行され、オブジェクト指向のパラダイムに従って値が返されます。この方法では、オブジェクトに情報を格納する必要はありませんが、アクセス時に計算する必要があります(メモリとCPU時間のトレードオフが可能です)。S4オブジェクトのプロパティデコレータ

私は今、Rで同様S4オブジェクトを持っていますし、これはRに良い習慣であるかどうか、これはS4オブジェクトのRで可能です

  1. だろうかと

私はRでこれを行うために、より一般的な方法は、一般的な機能tyres()を書き、その後tyres(car)を行うことであるという感覚を持っている(2)に関しては。しかし、それは私にとってOOプログラミングとは思われません。誰かが精緻化できますか?

答えて

1

私はRでこれを行うために、より一般的な方法は、一般的な機能tyres()を書き、その後tyres(car)を行うことであるという感覚を持っている(2)に関しては。

絶対に。これはRの自然な方法であり、均一なインターフェースを公開するという利点があります。

しかし、それは私にとってOOプログラミングとは思われません。

OOPは文法object.method()ではありませんが、これは一般的な認識です(この一般的な構文に従うC++、C#、Java、Pythonなどの言語が商業的に成功したためです)。実際にはOOPは、データカプセル化と、オブジェクトを互いに話すための緩やかな一連の原則です。

さまざまな言語が必要に応じてこれを別々に処理します。 R6は、オブジェクト指向にJavaのような構文を非常にきれいに模倣し、その使用法は特定のシナリオでは意味をなさないかもしれません。しかし、S3のシンタックスはオブジェクト指向ではなく、よりRに似ています。その構文は他のR関数でより簡単に構成されます。


サイドノート:モニカ「均一な呼び出し構文」の下で、foo.bar(baz)bar(foo, baz)構文間の等価性を導入する程度C++標準化委員会で荒れ狂う戦いが現在あります。

1

S4でこれを行う方法は決して見つかりませんでした。しかし、これは確かにR6オブジェクトで可能です。それはActive bindingと呼ばれます。

R6オブジェクトは、JavaおよびC++などの他のOOP言語に似て、$演算子を使用して、オブジェクトインスタンスから属性にアクセスしてメンバーメソッドを直接呼び出すことができます。これにより、S3オブジェクトとS4オブジェクトで可能なよりも、はるかに自然なOOPコードがRで使用できます。

+0

「自然なOOPコード」は、Rでは不自然なので議論の対象となります(私の見解では間違っています)。機能的な言語であるRは、そのような言語よりもOOPの見解が異なりますJavaとC++として。多くの人々が最初に似たような言語でOOPにさらされていますが、OOPの独占はありません。実際、JavaスタイルのOOPはオリジナルのOOPとほとんど共通していません。これははるかに機能的なパラダイムに従いました。 –

+0

@KonradRudolph、OK、私は同意します。 OOPはカプセル化、継承、多型性、そしてS3についてもそれらを組み込んでいます。これらの概念を特定の構文と私自身の好みと混同するために私は賢くない。 –

関連する問題