大規模なコードベースの離れた部分の間にデータフローを追加しやすくすることはできますか?


10

大規模なシステムに変更を加えるとき、機能の一部が別の部分からデータを取得する必要があるという問題にしばしば直面しますが、それらは深く分岐した呼び出しツリーの異なる部分にあり、イベントリスナー、遅延呼び出しを経由している可能性があります。このようにして、簡単な変更ですばやく膨らませることができます。

Yossi Kreininのブログ投稿(http://www.yosefk.com/blog/i-want-a-struct-linker.html)からの引用:

あなたはあなたがたくさん渡すいくつかの種類のデータ構造を持っています。すぐに、構造に関して最も価値のあるものは、それが保持するデータではありませんが、制御の毛のような流れを通してずっと利用できるという事実です。

グローバル変数は、コードを遠く離れたコードに「叫び」させる1つの古典的な方法ですが、問題があることがわかっています。動的スコープ変数はより制限された方法ですが、同様に問題があります。

この問題を解決することを目的としたプログラミング言語の研究はありますか?静的チェック、簡単な単体テスト、その他の機能を備えたまま、予期しないデータフローを大規模なコードベースに簡単に追加できますか?


質問の言い回し方単一のプロセスでのデータフローがあり、プロセス間通信はないと思います。では、標準のイベント送信者/リスナーメカニズムでは解決できない問題はどのようなものだと思いますか?
Doc Brown、

不自然な例:システムの奥深くに、ユーザーにテキストメッセージを送信するコードがあるとします。また、メッセージのテキストがユーザーのタイムゾーンの現在の時刻に依存するという新しい要件が発生します。コールスタックは次のようになります。ユーザーのタイムゾーンを認識するコードが、メッセージテキストを生成するメソッドを呼び出すメソッドを呼び出します(... 15回繰り返す)。これは、下向きの通信のみを含むため、私の標準による単純な例ですが、それでも、15のメソッドのシグネチャを変更して、些細な変更を加える必要があります。
Vladimir Slepnev 2013

そうですね、データフローを明示的にモデル化し、データフローからコンポーネントを分離することが役立つと思います。ドイツのソフトウェアエンジニアは、このトピックについて多くを書いています。ほとんどの記事はドイツ語です。ここでは、彼の英語のエントリの記事は次のとおりです。geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/...
ドク・ブラウン

シングルトンの内部APIが役立つと思います。アプリケーション全体からアクセスでき、すべてのデータ取得ロジックをカプセル化します。
superM 2013

回答:


1

あなたはCDI(Context Dependency Injection)AKA IoC(Inversion of Control)を参照しています。Java JSFやSpring Frameworkはその一例です。ASP.NET MVCには、Unityのようなプラグインがあります。JavaScriptは、多くの最新のJSフレームワークで見られるインジェクション動作を持つRequireJSのようなライブラリーを使用して構造を編成し始めています。これは、ローカルアプリケーションとリモートアプリケーションを接続するためのものです。

ネットワーク間で疎結合を実現するために、企業はSOAP、REST、AJAX、またはRPCを使用した通常のリモートメソッド呼び出しでWebサービスを使用することを好みます。Javaでは、JAX-WSまたは.NET WCFを使用して分散サービスを構築できます。次に、クライアントとして、任意の言語またはプラットフォームからサービスバスまたは「データフロー」にそれらを並べます。Ruby、Python、Scala、Java、C#など。

疎結合を使用すると、問題を分割して克服することができます。多くの場合、サービスはデータをプルするためのデータベースへのエントリーポイントです。はしごを踏み出すと、Message Queueという獣がいます。その道は、エンタープライズおよびインフラストラクチャタイプのフレームワークにつながります。

ただし、プロジェクトがネットワークを要求しない場合、単一のアプリケーション内で大量のデータが流れるように設計されたScala、Akka、NodeJSなどの言語があります。また、複雑なプロジェクトのために、前述のテクノロジーの一部またはすべてとも連携します。たとえば、ScalaをJAX-RS RESTサービスで使用して、データソースから「グローバルデータ」の種類をプルしたり、IoC内部配線用のSpringを使用したりできます。JBoss、.NET、およびMuleESBのようなGUIツールには、多くのビジネス実行フレームワークまたはワークフローフレームワークもあります。開発中、EclipseとNetbeansを使用すると、視覚的なフローチャート画面でサービスをドラッグアンドドロップできます。

最後に、JavaにはまだシングルトンBeanがあります。実行時にメソッドを調整するには、プロキシまたはリフレクションフレームワークを使用します。しかし正直なところ、それは1999年のことです。

私の意見では、ユーザーのタイムゾーンに基づいてユーザーにメッセージを送信するためにそのように多くの呼び出しを行っている場合、ユーザーに表示されるのと同じ効果を実現するための2ステップの方法がおそらくあります。しかし、そうです、CDIフレームワークは、あなたが言及した柔軟な能力のすべてをそれらに与えるコートのような既存の言語によって身に着けられています。私はそれを私のプログラムの潜在意識と呼び、汚い仕事をシームレスに処理します。


メッセージキューはやりすぎかもしれませんが、メッセージングは​​、イベントを全面的に発生させるのに最適な方法です。Javaはメッセージ駆動型Bean(MDB)を使用しており、これによりプログラムは互いに「会話」を送受信できます。この方法で非同期ボーナスを実行できます。
Senor開発者

ポインタをありがとう!依存性注入や同様のパターンをサポートするために言語がゼロから設計された場合、その言語はどのように見えるのか、私には間違いなく不思議に思います。
Vladimir Slepnev 2013

0

これを大規模に行う最も簡単な方法は、実際にはある種のデータカプセル化APIを使用することです。これは、NoSQLストアであるか、カプセル化されたRDBMSである可能性があります(または、実際には、同じアプリケーション内の異なる時間と場所の両方に存在する可能性があります-長期間RDBMSを処理できない理由はありません。ストレージと短期的な状態制御を処理するNoSQL db)。それは、一連のシングルトンオブジェクトである場合もあります。

データ構造は、ある程度管理された方法で、ある種の中立空間で利用できるようになります。これは、LedgerSMBで採用するアプローチです(ただし、本質的に隠されているシングルトンのセミグローバル変数がいくつかありますが、これらは管理されます。変数の管理が少し簡単になったため、オブジェクトを直接隠しましたが、その後、 4つすべて)。

もちろん、どのアプローチにもトレードオフがあり、それらのトレードオフを回避することはできません。重要なのは、トレードオフ(管理vsパフォーマンスvsコードのクリーン度vs潜在的なコーディングの落とし穴)を調べ、アプリケーションに最適なものに基づいて決定することです。


答えてくれてありがとう!プログラミング言語の研究がこの問題に役立つと私には思えます。たとえば、コードが一部のデータをグローバルデータベースまたはスタッシュされたシングルトンから読み取る場合、どのデータが必要かについて静的/宣言的な保証がある可能性があります。
Vladimir Slepnev 2013年

-1

言葉を使う(または引用する)場合

hairy flow of control

それから私はあなたのコードが本当に混乱していると思います。すぐに落としてください。懸念事項のモジュール化/分離を使用する場合、「制御のヘアフロー」などはありません。あなたのコードは単純さを欠いているだけで、これはグローバル変数を参照したという事実からも推測できます:-)。


なぜ反対票か。引用には、私の見解を正確にサポートするイントロダクションがありませんでした。名前を付けないでください) "
user127749

2
これは実際には質問に対する回答ではありません。おそらくそれが反対票の理由です
Daniel

次に、質問を言い換えます。ソフトウェア設計の最も基本的な原則の1つであるKISS(単純に、愚かにしておく)に違反するコードの混乱を元に戻す魔法のトリックはありますか?トリックは魔法ではありません、それは彼がすべてのそれほど明白ではない詳細を知っているので取り替えることができないプログラマです(長期的には会社を殺すでしょう)、またはコードベースを再構築することです。残念ながら、多くの企業は最初は適切なコード設計を気にしていないか、結果を理解していないため、少なくとも1回はコードを書き換える必要があり、多くは何度も何度も書き換える必要があります...
user127749
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.