8

私は Ruby を学んでいて、タイピングに関して大きな概念上の問題を抱えています。パラダイムを理解できない理由を詳しく説明させてください。

Ruby で行うように、コードを簡潔にするためのメソッド チェーンを使用しているとします。チェーン内の各メソッド呼び出しの戻り値の型を正確に把握する必要があります。そうしないと、次のリンクで使用できるメソッドを知ることができません。毎回メソッドのドキュメントを確認する必要がありますか?? 私は、この常に実行されているチュートリアル演習に取り組んでいます。コーディング中に自分が何を扱っているかを正確に知るのではなく、コードを実行するために、参照、推測、実行、失敗、修正、繰り返しのプロセスに行き詰まっているようです。これは、直観性という Ruby の約束に反しています。

サードパーティのライブラリを使用しているとします。もう一度、どの型がパラメーターを渡すことが許可されているかを知る必要があります。そうしないと失敗します。コードを見ることはできますが、メソッドが期待する型のコメントや宣言がある場合とない場合があります。メソッドに基づくコードは、型ではなくオブジェクトで使用できることを理解しています。しかし、パラメータとして渡すものはすべて、ライブラリが期待するすべてのメソッドを持っていることを確認する必要があるため、型チェックを行う必要があります。文字列、ハッシュ、クラスなどを与えることが期待されているかどうかを知るために、すべてがインターフェイスで適切に文書化されていることを願って祈る必要がありますか?

メソッドのソースを見ると、呼び出されているメソッドのリストを取得し、期待される型を推測できますが、分析を実行する必要があります。

Ruby とダックタイピング: 契約による設計は不可能?

上記のスタックオーバーフローの質問での議論は、「従わなければならないプロセスがある」以外には何も答えておらず、それらのプロセスは標準的ではないようです。従うべきプロセスについては誰もが異なる意見を持っており、言語には強制ゼロ。メソッドの検証? テスト駆動設計? 文書化された API? 厳密なメソッド命名規則? 標準とは何か、誰がそれを指示するのか? 私は何に従いますか?これらのガイドラインはこの懸念を解決しますかhttps://stackoverflow.com/questions/616037/ruby-coding-style-guidelines ? 役立つ編集者はいますか?

概念的にも私には利点がありません。呼び出されるメソッドに必要なメソッドを知る必要があるため、何かをコーディングするときに入力していることに関係なく. 文書化することにしない限り、言語や他の誰かに明示的に通知していません。次に、コーディング中ではなく、実行時にすべての型チェックを行うことになります。私はPHPとPythonのプログラミングを行ったことがありますが、そこでも理解できません。

何が欠けているか、理解していませんか? このパラダイムを理解するのを手伝ってください。

4

3 に答える 3

2

厳密に型指定された言語 (C++、Java、C# など) の設計上の選択により、メソッドに渡される型とメソッドによって返される型の厳密な宣言が強制されることを考慮してください。これは、これらの言語が引数が正しいことを検証するように設計されているためです (これらの言語はコンパイルされているため、この作業はコンパイル時に実行できます)。ただし、一部の質問は実行時にしか回答できません。たとえば、C++ には RTTI (Run Time Type Interpreter) があり、型の保証を調べて強制します。しかし、開発者は、構文、セマンティクス、およびコンパイラに導かれて、これらの型の制約に従うコードを作成します。

Ruby は、動的な引数の型を取り、動的な型を返すという柔軟性を提供します。この自由により、より一般的なコード (STL および一般的なプログラミングに関する Stepanov を参照) を記述できるようになり、豊富な一連のイントロスペクション メソッド (is_a?、instance_of?、respond_to?、kind_of?、is_array? など) が提供されます。動的に使用できます。Ruby では一般的なメソッドを記述できますが、コントラクトによって設計を明示的に強制し、選択した手段によってコントラクトの失敗を処理することもできます。

確かに、メソッドを連鎖させるときは注意が必要ですが、Ruby を学ぶことは新しいキーワードの数だけではありません。Ruby は複数のパラダイムをサポートしています。手続き型、オブジェクト指向、汎用、関数型のプログラムを作成できます。あなたが今いるサイクルは、Ruby について学べばすぐに改善されます。

おそらく、あなたの懸念は、強く型付けされた言語 (C++、Java、C# など) への偏見から生じています。ダックタイピングは別のアプローチです。あなたは違うと思います。ダックタイピングとは、オブジェクトが のように見える場合、 のように動作する場合、それは であることを意味します。Ruby ではすべて (ほとんど) がオブジェクトであるため、すべてがポリモーフィックです。

テンプレートを検討してください (C++ にはテンプレートがあり、C# にはテンプレートがあり、Java にはテンプレートがあり、C にはマクロがあります)。アルゴリズムを構築し、選択した型のインスタンスをコンパイラに生成させます。ジェネリックと契約による設計を行っているわけではありませんが、ジェネリックの能力を認識すると、記述するコードが減り、より多くのコードが生成されます。

その他気になる点など、

  • サードパーティのライブラリ (gem) は、あなたが恐れているほど使いにくいものではありません
  • 文書化された API? Rdoc およびhttp://www.ruby-doc.org/を参照してください。
  • Rdocドキュメントは(通常)ライブラリ用に提供されています
  • コーディング ガイドライン - 初心者向けの単純な gem のソースを参照してください。
  • 命名規則 - スネークケースとキャメルケースはどちらも人気があります

提案 - 心を開いてオンライン チュートリアルに取り組み、チュートリアルを実行すると ( http://rubymonk.com/learning/books/が適しています)、より焦点を絞った質問が得られます。

于 2013-10-03T18:10:17.810 に答える