問題タブ [god-object]
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.
vb.net - 神オブジェクトを防ぐために何をすべきか?
1 か所でしか使用されないクラス オブジェクトがある場合、プログラミングとアーキテクチャが貧弱であることはわかっています。しかし、私はまた、すべてが強力で、あまりにも多くのことを行うことができるオブジェクトを作成することについて警告されています. では、どうすればこれを分解できますか?これは私が言いたいことの例です - これは単なる例であるため、これらのことを文字通りに解釈しないでください.
とにかく、かなり複雑なオブジェクトを扱っています。このオブジェクトには多くの情報が格納され、データに対して多くの操作を実行できます。では、この物体を地球と呼びましょう。
これまでのところ十分に単純です。しかし、私はオブジェクトが実行できる可能性のある多くのことを続けることができました. そこで、物事が複雑になりすぎないようにするために、昼と夜の 2 つのオブジェクトを作成して、日中と夜間に発生する「アクティビティ」を分類しました (この 2 つは表示されていません)。これで、Planet クラスが更新されました。
現在、これら 2 つのクラス (Day と Night)は、Planet クラス以外では使用されません。これは、この「親」クラス Planet のメソッドと属性を整理する良い方法ですか? 他にどうすれば同様にきちんと整理できますか?
リファクタリングについて読んだことがありますが、これは私の場合には役に立たないと思います。次のように Planet オブジェクトを呼び出せるというアイデアが気に入っていますEarth.Night.BlowUpMoon
。
java - DI フレームワークで「神」オブジェクトから依存関係を引き出す
多くの既存のコードを持つサーブレットがあります。その一部に依存性注入を追加しようとしています。現在、私は手動でやっています:
ここでは、本とオファーのリポジトリの依存関係が、コンストラクターを介して BookPriceAdjuster に注入されます。getBookPriceAdjuster メソッドは、AdjustBookPriceHandler から継承するクラスが別の価格調整機能を提供できるようにするために存在します。
Guice のような DI フレームワークの使用を開始して、複雑な例で導入されるボイラープレート コードの一部を削減したいと考えています。ただし、このコンテキストでそれを使用する最善の方法はわかりません。
「神」オブジェクト RequestState および RequestData から関連する依存関係を引き出すバインディングを作成するにはどうすればよいですか? それとも、この時点でフレームワークを使用することは、同じように複雑で厄介でしょうか?
c# - カテゴリまたは部分クラス: 「神のオブジェクト」コードの臭いを解決するためのパターン?
クラスが大きすぎて扱いにくくなります。Objective-C では、カテゴリを使用してクラスを分割したくなりますが、カテゴリは、がらくたでいっぱいの家を部屋に分割するだけではないでしょうか? 同じ質問が C# の部分クラスにも当てはまると思います。
「クラスが大きすぎる」コードのにおいを解決するために、どのような条件下でカテゴリを使用できますか? それが正しくなく、クラスを本当に「再構築するか、小さなクラスに分割する」必要があるのはいつですか?
model-view-controller - ファットモデルとスキニーコントローラーは、神のモデルを作成するように聞こえます
私は、特にファットモデルとスキニーコントローラーアプローチを提唱する多くのブログを読んでいます。Railsキャンプ。その結果、ルーターは基本的に、どのコントローラーでどのメソッドを呼び出すかを把握しているだけであり、コントローラーのメソッドはすべて、モデルの対応するメソッドを呼び出してからビューを表示するだけです。だから私はここで私が理解していない2つの懸念があります:
- コントローラーとルーターは、ルートに基づいて神のようなモデルでメソッドを呼び出す以外は、実際にはそれほど異なるタスクを実行していません。
- モデルはやりすぎです。メールの送信、関係の作成、他のモデルの削除と変更、タスクのキューイングなど。基本的に、データのモデリングと処理に関係するかどうかに関係なく、すべてを実行することになっている神のようなオブジェクトがあります。
どこに線を引きますか?これはただ神のパターンに陥っているのではありませんか?
c++ - 2Dゲーム開発「神クラス」
SFML API を使用して C++ で 2D ゲームを開発していますが、クラスの設計に問題があります。ウィンドウを処理する必要がある「ゲーム」というメイン クラスが 1 つあるため、SRP (Single Responsibility Principle) に違反していると思います。メイン ゲーム ループを含むメソッドが含まれています。今問題です。Player、Menu、SplashScreen など、5 つ以上のクラスのオブジェクト (コンポジション) が含まれています。そんな「神」クラスを作るのはいい考えだと思いますか?私が学べるオープンソースの C++ 2D ゲームを知っていますか? 前もって感謝します。
c# - 神オブジェクトを分割するためのインターフェース継承?
私はかなり大きな製品に取り組んでいます。.Net 1.0はまだ開発中なので、品質の悪いコードがたくさんあり、単体テストを念頭に置いて作成されていないため、開発が続けられています。現在、品質を改善し、各機能のテストとバグ修正を実装しようとしています。私たちが今抱えている最大の問題の1つは、依存関係地獄と神オブジェクトです。特に悪い神オブジェクトが1つありますSession
。基本的に、プログラムの現在のセッションに関連するものはすべてこのオブジェクトに含まれます。他にもいくつかの神オブジェクトがあります。
とにかく、Resharperを使用してそれらからインターフェースを抽出することにより、この神オブジェクトを「モック可能」にしました。ただし、これでもテストは困難です。ほとんどの場合、作成したコードを調べて、100の異なるメソッドとプロパティから実際にモックアウトする必要があるものを理解する必要があるためです。
このクラスへの参照は文字通り数千とは言わないまでも数百あるため、このクラスを分割するだけでは今のところ問題外です。
私はインターフェイスを持っているので(そしてほとんどすべてのコードがインターフェイスを使用するようにリファクタリングされています)、興味深いアイデアがありました。ISession
インターフェイスを他のインターフェイスから継承させた場合はどうなりますか。
たとえば、次のようなものがある場合:
このように、ISessionを使用する既存のコードを更新する必要はなく、実際の実装を更新する必要もありません。ただし、新しいコードでは、より詳細なIFooまたはIBarインターフェイスを使用してリファクタリングを記述しますが、ISessionを渡します。
そして最終的には、これにより、実際のISessionとSessiongodのインターフェイス/オブジェクトを最終的に分割するのが簡単になると思います。
今あなたに。これは、これらの神オブジェクトに対してテストし、最終的にそれらを分割するための良い方法ですか?これは文書化されたアプローチおよび/またはデザインパターンですか?このようなことをしたことがありますか?
class - 神のクラスをどのようにリファクタリングしますか?
神オブジェクトをリファクタリングする最良の方法を知っている人はいますか?
メソッドの結合が高いため、いくつかの小さなクラスに分割するほど単純ではありません。1つのメソッドを引き出すと、通常、他のすべてのメソッドを引き出すことになります。
javascript - JavascriptのMonolithic Godオブジェクトはパフォーマンスの問題ですか?
方法は次のとおりです。
window
私は最近、標準の問題として、プロパティまたは再帰サブプロパティとして、を実行するために必要なすべての関数と変数を含む単一のグローバルに利用可能な (つまり、それ自体が のプロパティである) オブジェクトを維持する webapp プロジェクトに参加しました。アプリケーション — すべてのウィジェットのステートフル インジケーター、初期化エイリアス、一般的な DOM 操作メソッドなど、すべて. 簡略化した疑似コードで説明しようと思いますが、それは私の懸念事項である、これがサイクロピーンであるという点に反しています。基本的に、カプセル化されているものは何もありません。単一の粒状コンポーネントはすべて、どこからでも読み取りまたは変更できます。
私が望む方法:
私の最近の仕事では、私は上級または唯一の Javascript 開発者だったので、目立たないコード ブロックのスコープを設定し、細かいプリミティブを変数として保持するために、関数を使用するスタイルで書くことができました。スコープ。このパターンを使用すると、デフォルトですべてがその実行スコープにロックされ、API を公開する必要がある場合に、慎重に選択されたいくつかの getter/setter 関数が返されることがあります。
…一般的なレベルでは、B は A よりもパフォーマンスが高いですか?
コードをスタイル A からスタイル B への機能的同等性にリファクタリングすることは膨大な作業であるため、私の主張に対して意味のある実用的なテストを行うことはできませんが、モノリシックな神オブジェクトのアンチパターンは、スコープ付きの機能的スタイルと比較して既知のパフォーマンス モンスターです。 ? 読みやすさ、コードの安全性、関心の分離のために、私は B を主張します...しかし、すべてを常にメモリに保持し、ルックアップチェーンをクロールするなどして、何かにアクセスするための本質的にパフォーマンスが集中する演習になると思います、または少なくともガベージコレクションを非常に困難なタスクにします。
game-engine - 開発者が神クラス/オブジェクトの作成を回避できるように、ゲームの保存はどのように実装されていますか?
昨日、ビデオゲームをプレイしていたときに突然質問がありましたが、ゲームのセーブメカニズムはどのように実装されていますか?
ほとんどの場合、保存にはゲームのすべてのデータが必要です。この場合、プログラマーは、すべての単一のゲームデータを参照する神オブジェクトを作成する必要はありませんか?
ゲーム開発そのものではなくソフトウェア設計に基づいた回答が欲しいので、ゲーム開発ではなくSOに質問を投稿します。