問題タブ [cohesion]
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 - プログラム設計を支援する
私は現在、プレイヤーが異なる部屋の間を移動したり、アイテムを手に取って使用したり、食べ物を食べたりできる、シンプルなコンソールベースのゲームを作成しています。ゲームの現在の状態では、それについてです。
私が助けを必要としているのは:
私のゲームに適した「イベント」クラスを作成します。私がそれを機能させたいのは、すべてのアイテムと部屋をイベントに関連付けることができるようにすることです。
私はこれに慣れていないので、この種の手順に関連する読み物、または以下の点を考慮してクラスを設定するのに最適な方法、または単にこの種を攻撃する方法についての提案をいただければ幸いです。問題の(クラスの設定方法を決定するのに問題がある)。
さまざまな種類のイベントを作成できるようにしたいと思います。たとえば、次のようになります。
テキストを出力してから、プレーヤーに質問します。プレイヤーが正解した場合は、何かをしてください。
テキストを出力し、プレーヤーのインベントリからアイテムを削除してから、プレーヤーを別の部屋に移動します。
私が避けようとしていること:
ゲームの全体的なポイントは、優れたクラスデザインを実践することです。したがって、責任駆動設計、凝集度、結合度などが重要な側面です。したがって、私はそれが可能な限り単純で、再利用可能で、独立していることを望んでいます。
アイテムまたはルームがEventクラスの特定のメソッドを呼び出すだけになるように、すべてのイベントをハードコーディングする必要があります。
私が今考えていること:
たとえば、次を使用して新しいイベントを作成(および関連付ける)できるように、いくつかのサブクラスを作成します。itemObject.setEvent(new Event(new Question( "introText"、 "outroText"、 "correctAnswer")));
さらに情報が必要な場合はお知らせください。ありがとう!
c# - オブジェクトがデータベースに保存できると、クラスの凝集力が損なわれますか?
オブジェクト指向設計の観点から言えば、それ自体をデータベースに保存する機能をオブジェクトに与えると、クラスのCOHESIONが台無しになると思いますか?
想像:
この製品pをデータベースに保存する方が、次のように行う方がよいと思いますか。
または次のような方法で:
どう思いますか?
design-patterns - ロガーを利用するのに最もまとまりのある場所はどこですか?
私は Java を使用してタスク マネージャー プログラムを作成し、現時点で単一の UI 実装を作成しました。現在、プログラムには 3 つのレイヤーがあります。ユース ケース コントローラーを介してドメイン層と対話するプレゼンテーション層、および最後に永続化に使用される技術サービス層。この時点で、タスクの追加、タスクのステータスの編集など、ユーザーが実行できるアクションがいくつかあります。このスキームでのロガーの目的は、ユーザーが実行したすべてのアクションを追跡することです。そのため、ロガーを呼び出してコマンドを書き込むことができる場所がいくつかあります。これはひどい設計上の決定になるため、プレゼンテーション レイヤーでのログ記録は行いません。そのため、コマンド インターフェイス (元に戻す/やり直し機能を実装する目的ですべてのコマンドの実行を処理するために実装された) のコントローラーが残されます。 )、
コントローラーは、UI レイヤーとドメイン間の接点として機能するため、これには比較的適切なオプションだと思います。したがって、すべての重要なコマンドは最終的にコントローラーを通過し、すべての重要なメソッドがログに記録されていることを簡単に確認できます。 . コントローラーでこれを実行しない理由は、凝集度が低下し、カップリングが増加し、コントローラーが肥大化する可能性があるためです。
具体的なコマンドも、ログに必要なすべての情報を持っているため、別の潜在的な場所です。これにより、コマンドの凝集性が低下し、結合が増加します。また、ドメイン オブジェクトに対してアクションを実行するためにコマンド インターフェイスを使用しないと、ログが失われます。
最後に、これにより、ロガーを下位レベルのドメイン オブジェクト メソッドに実装することになります。プログラムが使用されていて、必要なすべての情報が利用可能な場合、ログは常に発生するため、これは適切な候補です。唯一の欠点は、ロガー コマンドが下位レベルのドメイン オブジェクトにまばらに分散され、正しいメソッドがすべてログに記録されていることを確認することが難しくなることです。
この種の決定について議論を進めたいと思います。皆様のコメントをお待ちしております。
java - 結合/凝集度
このフォーラムには結合度と凝集度の例を含む多くの良い例がありますが、私はそれをコードに完全に適用するのに苦労しています。コード内で変更が必要な可能性のある部分を特定できます。Javaの専門家なら誰でも私のコードを見て、どの側面が良いか悪いかを説明してくれるでしょうか。自分で変えてもかまいません。多くの人がお互いに意見を異にしているようで、どの原則に従うべきかを実際に理解するのは難しいと感じています...
python - 「より良い」練習はどれですか?Python でオブジェクト参照またはオブジェクト メソッド参照を渡す
私は Python で小さなコードを書いていますが、他の人がこれについてどう思うか興味があります。
それぞれにいくつかのメソッドを持ついくつかのクラスがあり、何が「より良い」かを判断しようとしています: メソッド呼び出しを介してオブジェクトを渡すか、オブジェクトからのメソッドが 1 つだけ必要な場合にメソッド呼び出しを介してメソッドを渡すか。基本的に、これを行う必要があります:
またはこれ
私の見方では、2 番目のクラスは、操作と他のクラスの間の結合がさらに緩い結合/より強い結束を促進するため、間違いなく「優れている」と言えます。オブジェクトから単一のメソッドのみが必要な場合のこのアプローチに対する賛否両論を知りたいです。
編集:明らかに動揺していたので、OOP の文言を削除しました。私は主に、疎結合と高い結束について言及していました。
java - コミュニケーションの結束
モジュールには結合と結合があります。わかった。機能的結束とコミュニケーション結束があります。機能的凝集とは、機能によってグループ化することです。わかった。通信の結束は、入出力データによるグループ化です..うーん..いいえ。通信の結束とは何かを説明したり、例を提供したりできますか (任意の言語ですが、Java が望ましい)。
design-patterns - オブジェクトの結合
クラスA、B、およびCのそれぞれdoA()、doB()、およびdoC()のメソッドがあると仮定します。
私が間違っていない限り、doA() メソッドはクラス A に属している必要があります。クラス A から実行する必要があります。A の責任を負うメソッド doA() がクラス B に存在する場合、クラス A は B のサービスに結合されています。 . これはまた、凝集度が低く、結合度が高いことを表しています。
私の推論は正しいですか?
c# - メソッドの凝集性
DB に保存される永続オブジェクトがあります (挿入、更新、削除)。このロジックを 1 つのメソッドに結合する方が良いですか? 保存するか、結合のために 3 つの別々のメソッドを用意しますか?
java - ビジネス ロジック クラスの抽象化
ライブラリからメソッドを呼び出すときは、その名前が意味することを正確に実行することを期待します。
- つながりを返す
- 失敗した場合にエラーを報告する
- 期待以上のことをしない
「ライブラリコード」を書くとき、デカップリング、凝集、抽象化の原則に固執するのは非常に簡単です。これらを守らないことは、ほとんどの場合、設計上のエラーを意味します。
しかし、ビジネス ロジックの場合、いくつかの問題が発生し、おそらく視点を変更する必要があります。ビジネス ロジック レベルでは、次のように言います。
構成ファイルを読み取り、見つからない場合はデフォルトを使用し、接続し、チェックを行い、ユーザーに通知する必要がある警告を決定します。たとえば、データベースのバージョンがクライアントよりも古いという事実です。ソフトウェア。
メソッドはまとまりがなければならないので、これらすべてを行うべきではないと言い、これを厳密に適用すると、1 行だけの connect メソッドになってしまいます。
つまりconnect
、ビジネス クラス Session のメソッドは、基になるクラスに折りたたまれます。
そして、残りのタスクは?ファイルを読んで、データベースのバージョンなどを確認しますか?
ビジネスコードをすべてのロジックを実行する「大きなメソッド」に延期しています。
そして、これはまさに私のポイントです。
ビジネス ロジックのコンテキストで結合と分離の原則を適用すると、タスクを小さなサブタスクに細分化することができず、すべての作業を行う大きな "モノリシック" メソッドがいくつかあり、読みにくくなります。
低レベルのライブラリ (Driver.getConnection()) の優れた原則 (結束、抽象化) は、ビジネス ロジックにはまったく不十分です。
私のアイデアは次のとおりです。
- 結束は、まったく新しい概念に置き換えなければなりません
- 結束は特定のポイントまで「引き伸ばされる」必要があります
そして、私は2番目が好きなので、私の質問はその点は何ですか.