動的言語では「動的」が多すぎる可能性がありますか?
-
18-09-2019 - |
質問
ここ数か月間、私は Java から Groovy に移行してきましたが、それがもたらす多くのメリットを実感しています。コード、クロージャ、ビルダー、MOP が減り、最終的には Grails のようなフレームワークが可能になり、テスト作成時のモックが容易になります。
しかし、私のコードは十分に魅力的ではないと同僚から「非難」されました。つまり、私は依然としてパラメーターとフィールドの型を宣言しており、ダックタイピングなどの代わりに継承とポリモーフィズムを使用する傾向があります。このような状況では、単に動的かどうかだけではないように思えます。静的だけでなく動的でもあるオブジェクト指向パラダイムの一種のジレンマ。そのような場合でも、私は依然として OO を好む傾向があります。OO パラダイムは、コード構造を抽象化し、特定の現実世界の概念に関連付けることを可能にするという基本的な前提に大きな価値があると感じています。
そこで、助けが必要な具体的な質問を以下に示します。
パラメータやフィールドなどの型を宣言する必要がありますか?
単純なメソッドで済む場合、コードのブロックをクロージャとして宣言する必要がありますか?
ポリモーフィックな動的ディスパッチの代わりにダック タイピングを使用する必要があるのはどのような場合ですか。たとえば、groovy では、animal."$action"() または def Animal; を実行できます。Animal.action() の代わりに Animal Animal = new Dog();動物.アクション()。オープンクローズ原則の文脈で最初の問題はわかりますが、OO スタイルのポリモーフィズムを好む他の理由はありますか?
Groovy でインターフェイスを使用する必要があるのはいつか (使用する場合)?
書ききれなかった同様のジレンマが他にもいくつかあると思います。また、これらの質問は Groovy だけでなく、他の動的言語にも当てはまると思います。あなたの意見は何ですか?
解決
0.1。私は私のパラメータ、フィールド、などのための型を宣言する必要がありますか?
私は、公開API、他の開発者が多くを消費する、または私はIntelliJのからいくつかの追加のオートコンプリートのサポートをご希望されるものの一部として使用されるクラスで型を宣言傾向があります。そうしないと私は物事を 'DEF' ます。
0.2。私は簡単な方法で行いますクロージャとして、コードのブロックを宣言するべきでしょうか?
それは私が変数として周りに渡すことを計画して何かしない限り、私はメソッドを使用します。 「FOO。&バー」法の間接参照演算子があるにもかかわらず、ほとんどの開発者は、このことを知っていないと、彼らはそれを越え実行したときに、それによって混乱しています。それは説明の目的のためにそれ自身のメソッドに入れるのではなく、より大きな方法に残ることは明らかであるコードの小片だとき、私はまた、クロージャを使用します。
0.3。とき私は、多型ダイナミックディスパッチするのではなく、ダックタイピングを使用する必要があります。たとえば、グルーヴィーで私は動物を行うことができます「$アクション」()またはDEF動物。 animal.action()、代わり動物の動物=新しい犬()。 animal.action()。私は、オープン・クローズの原則のコンテキストで最初に問題はなく、OOスタイルの多型を好むために、他の理由を見ることができますか?
私だけの動物を使用しています。「$アクション」()形式のメソッド名が変化するので、私は(ほとんどの場合、重いメタプログラミング時)、コードの実行パスに基づいて、間接のレベルを必要とするとき。私は動物の動物=新しい犬を()を使用します。 animal.action()私は、自動補完とIDEのヘルプをしたい、またはドキュメントのレベルが(と明らかまたは制約であるかもしれない余分なverbosenessによって傷つけない)コードをわかりやすくするのに便利です。
0.4。 (これまでの場合)とき、私はグルーヴィーでのインターフェイスを使用する必要がありますか?
私は非常に稀にそれらを使用していません。私は、または可能性マーカーインターフェイスとしてメタプログラミングの観点から、他のクラスの1セットを区別しやすくするために、主に公共のAPIコールの予想フィールドのドキュメントとしてそれらを使用して見ることができました。彼らはJavaであるよりも、グルーヴィーであまり便利です。
他のヒント
これは、常に人気の意見ではありませんが、私は、より明示的なことを考えると、あなたのコードをすることができ、より良いクリアします。
私は
...あなたは何が起こっているだけで推測のままの構造を嫌います私はRubyで年間働いたとは全くそれを好きではなかったです。私はちょうど私が本当にきれいで、明示的なものを維持したいことを言っているとRubyが目標としてそれを持っていたことを感じていなかった、それが優れた場所を持っていないことは言わないよ。
私は確実に把握なかったことの一つ - あなたが全体の開発スピードに一致しないんタイピングの量。これは、上(繰り返されるコードの多くの複雑なコードベースが非常に遅い開発のためになりますが、単にあなたが重複を排除することなく、入力する内容低減することは無用である、と長い入力し、明確に、より明示的なコードは一般的に高速であることを行っていることは事実です簡潔な、よりカジュアルな言語で書かれた同じコードよりもプロジェクトの長さ)ます。
あなたはそのタイピングが開発スピードとは関係ありません信じていない場合は、、次回はあなたが(デバッグやテストを含む)を過ごした人日によってコードと除算の行数をカウントプロジェクトをリリース。言い換えれば、どのくらいのコードが入力された日。あなたは結果が非常に少ない数であることを見つけることができます - 実際にコードを入力すると、任意のソフトウェアプロジェクトのごく一部です。
。私はあなたが何かをする最も簡単な方法を好む、と状況がそれを要求した場合にのみgroovier機能に頼る必要があるのGroovyと思います。おそらく、あなたの同僚は、彼らの新しい発見の力で少し酔っている(あなた自身がこれらのツールのためにあなた自身を疑問視すべき多くのことを到達見つけた場合、マクロを書くか、Clojureの中でマルチメソッドを作成するときのように。)あなたの慎重なアプローチは、私には罰金です、 。 (これが初めてではないでしょう。)
Groovyのような柔軟な言語を持つの良いところは、あなたがあなたがそれらを必要なときに頼るために、より強力な選択肢を持って知っている好むようにあなたは、慎重なアプローチを始めることができます。あなたは、「おそらく仕事ができる最も簡単な事を。」知っている
具体的にはインタフェースを介しダックタイピングを好むし、パラメータの種類と悩まないことは、それは良いことかもしれないように、それは非常に簡単にテストにモックを供給することがありそうです。
これは、人々が慣れているものにダウンしています。私はJavaで快適だから型declerationsとメソッド呼び出しを使用するようにしたいです。私が書くコードは、高度なGroovyの機能を使用するには十分な理由がありますしない限り、私は通常のJavaコードに近いそれを維持するように、アウトずっとダイナミックプログラミングの経験を持つ人々によって維持されなければなりません。 ITは、Groovyの特定の機能は、一般的に使用されなければならない時に説明しようとコーディング標準を作成する必要があり、あなたのグループのように聞こえます。
オブジェクト指向言語の2つの主要な種類があります。
の言語は、そのようなC ++やJavaなどの Simulaの67 の家族、静的に型付けされた変数、コンパイラおよびリンカー、およびメソッドのvtableを好むます。
の言語は、そのようなRubyなどのスモールトークの家族、動的型付けの変数、解釈、およびメッセージパッシング関数ポインタのテーブルの代わりにを好むます。
両方のオブジェクト指向ですが、非常に異なるが、オブジェクト指向の概念にとります。
YES
-
NO
あなたはこの質問には本当の答えはありません実現していますか?