Ruby(またはその他の動的言語)のインターフェイスの代わりに何を使用できますか?


9

私の目標は、クラス間のコントラクトを定義することです。

私はダックタイピングとすべてが好きですが、アプリケーションの異なるレイヤー間のインターフェースを定義して、外部から呼び出すメソッドと、他のレイヤーで使用してはならないアクセサリメソッドを明確に定義したいです。

たとえば、Javaでは、get()やsave()などのメソッドを使用してPersistorインターフェースを定義してから、データベースで永続化する必要のあるすべてのメソッドを使用してJdbcPersistorクラスを定義できます。また、リモートレストサーバーに保存するための他の方法を備えた別のRestPersistorもあります。

Rubyでインターフェイスを要求するのではなく、この区別を維持するためのきちんとした方法があるかどうかを確認するだけです。私はRubyが好きですが、Rubyを使用する小規模なプロジェクトにのみ取り組みました。


これはStackOverflowに属していると思います...
thorstenmüllerJan

2
@thorstenスタックオーバーフローは、特定の実装の問題(つまり、コードに問題がある)のためのものです。一般的なプログラム設計の質問は、Programmers.SEのトピックにあります。

@Mark:訂正ありがとうございます。Rubyには具体的すぎると思いました(そしてUbertoの最後の文を見逃しました)。それで、私はFAQに関する私の知識を更新しました。(それでもここで私の方法を見つけます)
thorstenmüller'27年

+1すばらしい質問です。大量のドキュメントを作成、読み取り、および最新の状態に保つか、アンダースコアを付けた先行する内部アクセサリメソッドなど、いくつかの間抜けな規則を使用する以外に方法があるかどうかに興味があります。
Joonas Pulakka、2011年

+1ちなみに、PLTラケットは契約をサポートしており、動的です。Rubyに似たものを追加することは興味深いプロジェクトでしょう。
Larry Coleman

回答:


5

これは、C#インターフェイスおよびStackoverflowのRubyのコンテキストで回答されました:https : //stackoverflow.com/questions/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c

要約:ダックタイピングは正式なインターフェースを必要としないため、Rubyには完全に同等のものはありません。代わりに、「インターフェイス」またはコントラクトへの準拠をテストすることを検討してくださいrespond_to?


2
はい、しかしこれはコードがアクセスしてはならないメソッドにアクセスすることを妨げるものではありません
Uberto

2

一部の動的型付け言語には、インターフェースまたは同様の概念があります。たとえば、Objective-Cにはプロトコルがあります。しかし、ほとんどはそうではありません。動的言語で効果を発揮するには、静的型付け言語について知っていることを忘れ、言語の動的性質を受け入れる必要があります。動的に型付けされた言語は、通常、インターフェースの使用を避けます。


1

Perl 5では、MooseMooの両方が、特定のメソッドの実装を必要とする可能性のあるロール(または特性)を提供します。Mooseにはduck_type、必要なメソッドのセットを持つオブジェクトを宣言する型であるを定義できるランタイム型システムも付属しています。

ロールはクラス(または他のロール)自体によって実装され、インターフェースだけでなく実装と動作も提供します。ただし、それらは(少なくともMooseでは)メソッドの競合検出などの処理も​​行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.