動的言語はアジャイル開発にとって不利ですか?


12

私が読んだアジャイル開発から、コードをダイアグラムにリファクタリングまたはリバースエンジニアリングすることがよくあります。もちろんそれ以上のものがありますが、これら2つの方法に依存するプラクティスを考慮すると、動的に型付けされた言語は不利になりますか?

静的に型付けされた言語は、リファクタリングとリバースエンジニアリングをはるかに容易にするようです。

動的に型付けされた言語では不可能ではないにしても、リファクタリングまたは(自動化された)リバースエンジニアリングは困難ですか?現実のプロジェクトは、アジャイル手法のための動的に型付けされた言語の使用について何を教えていますか?


5
コードを図にリバースエンジニアリングしますか?なぜアジャイルでそれをするのですか?
CaffGeek

7
アジャイルとは、「最初にコードを作成し、後でドキュメントを作成する」という意味ではありません。
ロボット

@CaffGeek:推奨される本の中には、ホワイトボードに図を描いてからコーディングし、最終的に次の会議のために図にリバースエンジニアリングすることを推奨する本があります。
ジェレヌク

1
この質問のタグとテキストから強く型付けされたものを削除すべきだと思います。質問は、静的対動的であり、強く対弱くないということのようです。
ウィンストンイーバート

@WinstonEwert-いいですね、タグをdynamic-typingandに変更しましたstatic-typing
-Carson63000

回答:


11

動的言語は理論的には不利であり、他のすべてが等しいのは、コードの動作方法(制約の内容)に関する指定が少ないため、リファクタリングが自動的に行われず、発生した問題も自動的に検出できないためです。 。

しかし、他のすべては同等ではありません。最も人気のある動的言語は、非常にコンパクトでありながら理解しやすいコードを可能にします。これにより、一般的に開発が高速になり、リファクタリングで変更される可能性のあるロジックが視覚的に見つけやすくなります。したがって、動的言語で作業することの相対的な利点の一部を失う可能性がありますが、特にリファクタリングを手作業で行うことを計画している場合は特に、先に出てくる可能性があります。

一方、動的言語と本質的に同じ利点を持つ静的に型付けされた言語が存在します(つまり、コンパクトでわかりやすい-型はほとんど推測されますが、非常に多くあります):Haskellはおそらく主な例ですが、OCaML / F#、Scala、その他もこのカテゴリに属します。残念ながら、最も一般的な静的型付け言語よりも使用頻度が低いため、それらのツールセット(リファクタリングなど)はそれほど豊富ではありません。

結論として、私はあなたがほとんどの言語でアジャイルな方法論で適切にやると思う。実践がまだ理論に追いついていないので、明確な勝者がいるとは言いません。


この回答は、質問のキーポイントに最もよく対応していると思います:)また、アジャイル開発のための安全なリファクタリングとリバースエンジニアリングの重要性について詳しく説明していただけますか?私はそれが非常に重要な役割を果たすと思っていましたか?たぶんそれは思ったよりも少なく、ダイナミクス言語のツールで十分です。
ジェレヌク

1
@Gerenuk-アジャイル開発(特に動的言語)の十分な経験がなく、信頼できる答えを出すことができません。リファクタリングの側面は強調されない、同じままになりますか?プロセスの他の一般的な側面(テスト駆動開発など)は、リファクタリングがうまくいかなかった場所を特定するのに役立ちます。たとえば、設計段階でもう少し努力すれば、必要ないかもしれません。リファクタリングします。特定のテクニックの1つはキーだとは思いません。ツールのフルセットを手元に置いて、頻繁に、また共同で展開することです。
レックスカー

13

自動リファクタリングは、動的に型指定された言語であるSmalltalkで発明されました。いいえ、動的に型付けされた言語で自動リファクタリングを行うことは不可能ではありません。それがどれほど難しいかは、タイピングの訓練以外の他の要因により大きく左右されます。C ++とJavaはどちらも静的に型指定されていますが、リファクタリングツールは実際にはJavaにのみ存在します。内省とシンプルな構文を備えたSmalltalkは、リファクタリングツールの非常に優れた候補です。

いくつかの点で、動的型付けは実際にリファクタリングを容易にします。優れたテストスイートがある場合は、リファクタリングによって問題が発生していないことを確認できます。通常、動的に型指定されたコードベースはより小さくなります。さらに、リファクタリングの影響を受けるコードは少なくなります。動的なコードベースを手動でリファクタリングするのに要する労力は、静的なコードベースよりも少なくなります。


1
では、リバースエンジニアリングについてはどうですか?Smalltalkはタイピングに関してPythonとは異なりますか?Pythonですべての型を推測して、どのメソッドが同じ名前ではなく実際に同一であるかを判断するのは難しい問題のようです。
ジェレヌク

1
Smalltalkのではありませんそのタイピングに関してでPythonの大きく異なります。それはある、しかし、大幅にに関して異なるツーリング。Smalltalkのために利用可能なツールとIDEは、より良いPythonやでもCの#、C ++およびJavaのために利用可能なものより。PythonのIDEが悪いのは、Pythonが動的に型指定されているからではなく、PythonのIDEが悪いからです。Eclipseとして知られるIDEは、かつてSmalltalkのVisualAgeと呼ばれていたことを忘れないでください。Smalltalkコミュニティには、IDEの構築に40年の経験があり、それをJavaに適用しています。
ヨルグWミットタグ

@ Gerenuk、Smalltalkのタイピングはpythonと変わりません。イントロスペクションなどの他の方法では、Smalltalkはリファクタリングにより適した機能セットを提供します。Pythonでの型推論には作業が必要ですが、完了しています。PyPyプロジェクトを参照してください。
ウィンストンイーバート

1
@WinstonEwert「しかし、手動でリファクタリングすることができ、動的言語は実際にそれをかなり簡単にします」-いいえ、手動リファクタリングはスケーリングしません。変更のすべてをリファクタリングするためのツールのサポートリファクタリングが100%自動でなくても(下のケーススタディスニペット参照- programmers.stackexchange.com/a/166594/4334を
igouy

1
「動的プログラミングが実際にリファクタリングを容易にする」ことのほとんどすべての点は疑わしいか、非セキトゥアです。動的プログラミングとは、より包括的なテストスイートではなく、より大きなテストスイートがあることを意味します(そうでない場合は静的にキャッチされるテストが必要になるため)。「リファクタリングはより少ないコードに影響する傾向があります」(「とにかくプロジェクトは小さい」に加えて、これはおそらく動的言語の現在の収穫を考えると真実です)に対するサポートを提供しません。そして、あなたのコンパイラがあなたを助けさえしないことを意味しない限り、「手動でのリファクタリングに伴う努力」は間違っているようです!
レックスカー

8

リファクタリングは動的言語で発明されました。自動リファクタリングツールは、動的言語で発明されました。IDEは動的言語で発明されました。動的言語でいくつかのアジャイル手法が考案されました。

本当に問題は見当たりません。


「Smalltalkはタイピングに関してPythonとそれほど違いはありませんが、ツールに関しては大きく異なります。」-多分それは変化し始めている、jetbrains.com
pycharm /

3

忘れないように、「アジャイル」な働き方は、 Extreme Programming(XP)、Smalltalkプロジェクトで作成されました(Smalltalkは確かに「動的」言語としてカウントされます)。

動的に型付けされた言語で提供されるリファクタリングツールの産業利用のケーススタディを次に示します。

カーギルでは、穀物エレベーターの操作と関連する商品取引活動をサポートするために、非常に大きなSmalltalkアプリケーションが開発されました。Smalltalkクライアントアプリケーションには、385個のウィンドウと5,000以上のクラスがあります。このアプリケーションの約2,000のクラスは、初期(1993年頃)のデータアクセスフレームワークと対話しました。フレームワークは、オブジェクト属性のデータテーブル列へのマッピングを動的に実行しました。

分析の結果、動的なルックアップはクライアントの実行時間の40%を消費しましたが、不要であることがわかりました。

ビジネスクラスが明示的にコード化されたメソッドの列マッピングにオブジェクト属性を提供することを必要とする新しいデータレイヤーインターフェイスが開発されました。テストにより、このインターフェースは桁違いに高速であることが示されました。問題は、データレイヤーの2,100のビジネスクラスユーザーを変更する方法でした。

開発中の大規模なアプリケーションは、インターフェイスの変換が構築およびテストされている間、コードをフリーズできません。メイン開発ストリームからコードリポジトリの並列ブランチで変換を構築し、テストする必要がありました。変換が完全にテストされると、1回の操作でメインコードストリームに適用されました。

17,100件の変更で見つかったバグは35個未満です。すべてのバグは3週間で迅速に解決されました。

変更が手動で行われた場合、変換ルールを開発するのに235時間かかったのに対して、8,500時間かかったと推定されます。

タスクは、書き換えルールを使用して、予想される時間の3%で完了しました。これは36倍の改善です。

「アプリケーションデータレイヤーの変換」よりWill Loew-Blosser OOPSLA 2002

また- 「不可能な変更を加えるためのツール - 大きなSmalltalkプログラムを変換するためのツールの経験」


1

あなたの原則は私に正しいと思われると思った。

C#のような強く型付けされた言語は、リファクタリングを常に必要とするコードベースの良い候補です。基本的に、市場のほとんどのリファクタリングツール(Resharper、JustCodeなど)は、静的に型付けされたプログラミング言語で非常に効果的です。

現実のプロジェクトは、アジャイル手法のための動的に型付けされた言語の使用について何を教えていますか?

アジャイル/スクラムの方法論を実践している開発チームにとって、優れたリファクタリングツールのセットを装甲下に置くことは非常に役立ちます(重要な場合もあります)。そうしないと、今後のスプリントの突然の変更はすべて、変更または再設計するのが悪夢になる可能性があります。

したがって、アジャイル手法は、静的に型付けされた言語や動的な一度の利点を提供しません。それが提供するのは、強固なアプリケーションを構築するための反復的なアプローチです。


4
動的言語には、C#が存在するずっと前から、Notepadが依然として最も強力なJava IDEであったときに、自動リファクタリングツールがありました。
ヨルグWミットタグ

4
この答えは私の経験では完全にサポートされていません。動的言語は、通常より速く、より従来の静的型付けのものよりで物事を行うにしている(私がいるハスケルやMLまたはそのいつかのようなものを学ぶこと)。また、突然必要になった場合に修正するのがはるかに高速であるため、Common Lispが、自分が何をしているかを本当に知らなかったときに最高の言語であるという私の結論に至りました。また、リファクタリングはどこから始まったと思いますか?
デビッドソーンリー

1
たとえば、javascriptは動的言語ですが、Re-sharperはC#の場合と同じスリックジョブを実行しません。第二に、「動的言語は物事を行うのが遅い」とは言わなかった。
ユスボフ

IntelliJ IDEA-PyCharm-"リファクタリングの名前変更により、グローバルコードの変更を安全かつ即座に実行できます。ファイル内のローカル変更はインプレースで実行されます。リファクタリングはプレーンなPythonおよびDjangoプロジェクトで機能します。メソッド内のコード構造を改善するためのフィールド/定数およびインラインローカル、長いメソッドを分割するメソッドの抽出、スーパークラスの抽出、プッシュアップ、プルダウン、および移動によるメソッドとクラスの移動。jetbrains.com/pycharm/features/index.html
igouy

@igouy、私は答えでResharperとJustCodeに言及しています。したがって、それが参照されるコンテキストに当てはまります。
ユスボフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.