問題タブ [cyclic-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaパッケージ間のすべての循環参照は悪いですか?
私はしばらくの間、Sonar コード品質管理プラットフォームを使用してきましたが、ほとんどの場合、コード ベースの隠れた設計上の欠陥を明らかにするのに非常に役立ちます。
しかし、ヘルプよりも厄介なルールが 1 つあります。それは、「循環パッケージ参照」違反のチェックです。
パッケージ間のこのような依存関係がどこで悪いのかを完全に理解していると思います。たとえば、典型的な 3 層のプレゼンテーション/サービス/パーシステンス レイヤー設計では、ほとんどの場合、データベース処理コードに UI 関連クラスへの参照を持たせることはお勧めできません。「違反」と呼んでも問題ありません。
しかし、IDE ライクなアプリケーションの設計など、他のケースを考えてみましょう。たとえば、アプリケーションのビューを参照するメソッドをApplication
定義するインターフェイスを含むメイン パッケージがあるとします。List<View> Application.getViews()
ただし、View
インターフェイスにApplication getApplication()
親アプリケーションを参照するメソッドがある場合 (これは非常に一般的な設計だと思います)、各インターフェイスがそれぞれ 、com.myapp.ui
、および で区切られていれば、循環参照が導入されcom.myapp.ui.view
ます。
もちろん、View
インターフェイスを に挿入しcom.myapp.ui
てサイクルを断ち切ることもできます。しかし、ビューに関連するさまざまな API が にある場合、それらの多くは、、などcom.myapp.ui.view
の別の抽象 APIです。管理目的でそれらを別のパッケージに保持する方が賢明ではないかと思います。AbstractView
ContentView
AbstractContentView
com.myapp.ui.action
そして、上記のアプリケーションには、 、 などのような他の多くの同様のケースがあると考えてください。それらをすべてそこに入れると、パッケージcom.myapp.ui.perspective
が本当に混雑します。com.myapp.ui
では、このような状況に対処するためにどのようなアプローチをお勧めしますか? 本当にすべての循環パッケージ参照は悪いことですか? または、彼らと一緒に暮らす必要がある場合、問題のある実際のサイクルのみをチェックするように Sonar をどのように設定しますか?
scala - オブジェクトの値の初期化順序: 循環/再帰オブジェクトを適切にセットアップする方法は?
次のコード
情報にアクセスする順序が次の場合、機能します。
出力は期待どおりです。
本当にそこにある列: Tenant_id としての真の
Tenant.id、Tenant_name としての Tenant.name
列
ただし、順序が逆の場合は失敗します。
この場合、出力は
実際に存在する列: Node_id として真の
Node.id、Node_tenantId として Node.tenantId、Node_nodeId として Node.nodeId、Node_name として Node.name
列が実際に存在: false
列 List(null, null)スレッド「メイン」での例外 java.lang.NullPointerException
Scala 2.10.1 を使用
背景情報:
- オブジェクト定義は、RDBMS の論理データ モデルを記述します。
- テーブルはその列 (子) を認識し、各列は自分のテーブル (親) を認識します
- 外部キー列には、親テーブルの主キー列を説明するオプションのプロパティがあります
- この関係は再帰的です (ノード テーブルは再帰的です)。
- テーブルと列の個々の定数が必要です。
- できればvarは避けたい
言語仕様のセクションを見つけました (5.4)
オブジェクト定義によって定義された値は遅延してインスタンス化されることに注意してください。
これは、実際にセットアップできるようにするために必要です。「値」(プロパティ)とは対照的に、「値」はオブジェクト全体を意味すると思います。
とにかく、列プロパティのインスタンスは明らかに作成されていますが、その要素はまだ「具体化」されていません。これは、2 回目の実行の出力に表示されます。
初期の定義を使用して解決しようとしましたが、この場合、コンパイラはobject を含む不正な循環参照を訴えるため、これはコンパイルされません:
だから私の質問は:
- なぜ失敗するのですか?
- 列プロパティはどの状態ですか (リストは存在しますが、要素は null です)。
- これを正しく設定するにはどうすればよいですか?または、循環/再帰的な性質のため、回避策として定義された順序で具体化する必要がありますか?
更新/解決策
0__ の回答に基づく: 解決策は、 columns プロパティを遅延として宣言し、抽象 valをdefに変更することで構成されます。
columns プロパティの状態について: scalac のコマンド ライン オプションに-Xcheckinitを指定すると、追加の実行時チェックが追加されます。この場合、次のエラーが表示されます。
原因: scala.UninitializedFieldError: 未初期化フィールド: RecursiveObjects.scala: 35
それ以外の場合、このエラーは黙って無視されるため、リストには null のみが含まれます。
javascript - コード内で円形オブジェクトを見つける
ページにコンテンツをロードするために jQuery を使用してスクリプトを作成しています。実行時には何も起こりません。Firebug コンソールを調べると、次のエラーが表示されます。
コードは次のとおりです (<Head> 内に配置):
ここでヒントを使用しました: JavaScript で循環参照を検出して修正しましたが、循環関係が見つかりませんでした!!!
私の命を救うための任意のポイントは、非常に高く評価されます.
- カムラン
c++ - C++ の循環継承依存
次の各ステートメントには、対応するヘッダー ファイルの周りにガードが含まれています。
C は B を拡張し、B をサブクラス化して A へのポインタを取得できるようにしますが、A には B のサブクラスであるいくつかのフィールドがあります。
私の現在の解決策は、B を void 配列に格納し、実行時の型情報に基づいて正しいオブジェクトを返すテンプレート メソッドを使用することです。しかし、C が A, Ahead Of Time(Compile time)にリンクする必要がある場合でも、A が C フィールドを持つ方法があるかどうかを知りたいです。
オブジェクト指向プログラミングのコースをいくつか受講しましたが (ほとんどが Java でした)、特に C++ に焦点を当てたコースはありませんでした。
これはおそらく一般的な問題であり、この質問はおそらく既にここで尋ねられ、回答されていますが、そのような解決策を見つけるためにどのキーワードを使用すればよいかわかりません.
ああ
Bh
チャンネル
私が使用した他の OOP 言語は、そのような問題を舞台裏で解決するだけで、C++ ではビルド順序が正しい必要があります。この質問と漠然と似ている他の質問への回答をいくつか見ましたが、それらはちょっと不明確でした。回答を簡潔にしてください。
c++ - 循環参照は悪い習慣ですか?
EntityManager、Entity、およびComponentの3 つのクラスがあるとします。
Entity にはコンポーネント (ポインター) の配列があり、これらの各コンポーネントには、カプセル化する Entity へのポインターであるフィールドがあります。
EntityManagerにはエンティティの配列があり、各エンティティにはカプセル化されたEntityManagerへのポインタがあります。
この設計の理由は、データの信頼性にあります。コンポーネントはカプセル化エンティティのフィールドにアクセスする必要があり、一部のコンポーネントは他のエンティティのフィールド (エンティティ マネージャへのポインタ) に依存します。
この「周期的な」設計は悪い習慣ですか? デザインを考え直すべきですか?