問題タブ [class-design]

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.

0 投票する
2 に答える
694 参照

c++ - 継承の 2 つ以上のレベルの非仮想インターフェイスのイディオム?

非仮想インターフェイスのイディオムは、仮想メソッドが非パブリック カスタマイズ ポイントであり、パブリック メソッドが非仮想であり、基本クラスがカスタマイズ ポイントの呼び出し方法を常に制御できるようにする方法を説明します。

これはエレガントなイディオムであり、私はそれを使用するのが好きですが、派生クラスがそれ自体が基底クラスである場合、どのように機能しますか?

0 投票する
7 に答える
894 参照

c++ - クラス設計とIDE:非メンバーの非フレンド関数は本当に価値がありますか?

SutterとAlexandrescuは、 「非メンバーの非フレンド関数を作成することを好む」というタイトルの(そうでない場合は)優れた本C ++ Coding Standardsのアイテム44で、クラスのメンバーに本当にアクセスする必要がある関数のみをそのクラスのメンバーにすることを推奨しています。メンバー関数のみを使用して記述できる他のすべての操作は、クラスの一部であってはなりません。彼らは非会員であり、非友人でなければなりません。議論は次のとおりです。

  • クラスの内部にアクセスする必要のあるコードが少ないため、カプセル化が促進されます。
  • 一部の関数がメンバーであるかどうかを毎回推測する必要がないため、関数テンプレートの作成が容易になります。
  • クラスを小さく保つため、テストと保守が容易になります。

これらの引数には値がありますが、大きな欠点があります。IDEがこれらの関数を見つけるのに役立ちません。ある種のオブジェクトがあり、そのオブジェクトで使用できる操作を確認したい場合は、「pMysteriousObject->」と入力してメンバー関数のリストを取得することはできなくなります。

クリーンなデザインを維持することは、最終的にはプログラミング作業を楽にすることです。しかし、これは実際に私のものをはるかに難しくします。

だから私はそれが本当にトラブルの価値があるのだろうかと思っています。どのように対処しますか?

0 投票する
8 に答える
579 参照

class-design - クラス構造パターンの質問です。何を選べばいいですか?

(もしあれば) 暗黙の仮定や制限、および設計の違いは何ですか:

A) これ:

B) 対これ:

特定のプロジェクトに依存することはわかっていますが、上記のクラスが小さなフレームワークの一部である場合はどうなりますか? 最初のクラスは状態を維持し、ステップをより自然に分離できますが、2番目のクラスは doWork() が呼び出されるたびに Worker が渡されるため、外部呼び出し元との「リアルタイム通信」がより自然に保証されます。

上記の 2 つの方法のどちらかを選択するための推奨される使用方法や一般的な方法はありますか? ありがとう。

0 投票する
6 に答える
629 参照

oop - OO とレイヤード。「オブジェクト指向の純粋性」と物事の遂行のバランスを取る

私はOOを信じていますが、「OO準拠」のためだけに不適切な設計/実装を使用する必要があるほどではありません。

では、Servet/EJB/DataContainer レイヤード アーキテクチャを処理する方法は次のとおりです。

  • サーブレットはリクエストを受け取り、「ビジネス レイヤー」を呼び出します (セッション EJB など)。
  • ビジネス層は、データベースから DataContainers を見つけ、それらを操作してビジネス ロジックを実装します。
  • DataContainers には実際のコードは含まれず、データベースに対応する get/set のみが含まれます。

このアプローチには魅力があります。DataContainers は何をするかが明確で、データがどこから来るかを非常に簡単に知ることができます。

オブジェクト指向ではないことは別として、これにより、名前を付けたり整理したりするのが難しい不明確なビジネス層クラスが発生します。

もっと「オブジェクト指向」になろうとしていたとしても(たとえば、これらのメソッドのいくつかを DataConatiners に入れるなど)、これらの操作のいくつかは複数のデータ セットに対して動作します。

DataContainers をビジネス ロジックで汚染することなく、ビジネス レイヤーが混乱を招くような手続き型にならないようにするにはどうすればよいでしょうか?

  • validateUserName名前のみで動作するため、ユーザーは必要ありません。別のクラスに入る可能性があると思いますが、別の手続き型「uti」型クラスがあります
  • データ構造を永続化戦略から分離することに価値があるため、ユーザーに永続化メソッドは必要ありません。
  • 他の場所でそのロジックを再利用する必要があるかもしれないので、サーブレットにビジネス ロジックは必要ありません。
  • User クラスにあまりにも多くのことを引き込み、ビジネス ロジックの再利用を困難にし、ユーザーを永続化戦略と結びつけるため、User にビジネス ロジックは必要ありません。

この例がそれほど悪くないことはわかっていますが、10 個の DataContainers と 20 個の BizLayer オブジェクトがそれぞれいくつかのメソッドを持っていると想像してください。これらの操作の一部が、特定のデータ コンテナーに「集中」していないことを想像してください。

これが手続き上の混乱にならないようにするにはどうすればよいでしょうか。

0 投票する
7 に答える
274 参照

oop - 関連オブジェクトのモデリング

ユーザーとエリアの 2 つのデータ セットを扱うアプリケーションを設計しています。データは、サードパーティによって作成されたファイルから読み取られます。User クラスと Area クラスがあり、データは Users 配列と Areas 配列 (または使用するテクノロジに応じて、他の適切なメモリ構造) に読み込まれます。

両方のクラスには、ファイルから読み取られる一意の ID メンバーがあり、User クラスにはエリア ID の配列が含まれており、1 人のユーザーが多くのエリアに関連付けられている関係を提供します。

要件は非常に単純です。

  • ユーザー一覧
  • エリア一覧
  • 指定エリア利用者一覧
  • 特定利用者エリア一覧

私が最初に考えたのは、データを 2 つの配列に残しておき、要件ごとに、必要に応じて一方または両方の配列に問い合わせる別の方法を用意することでした。これは簡単に実装できますが、必ずしも最善の方法であるとは確信していません。

次に、User クラスに「Get Areas」メソッドを配置し、Area クラスに「Get Users」メンバーを配置することを考えました。これは、たとえば、Area オブジェクトを持っている段階にある場合に便利です。プロパティによるユーザーですが、Area クラスの「Get Users」メソッドは、Users 配列をどのように認識し、アクセスできるのでしょうか。

私はこれまで何度もこの問題を抱えてきましたが、決定的な解決策を思い付くことはありませんでした。多分私はそれを実際よりも複雑にしています。この種のデザインに役立つヒント、URL、または書籍を提供してくれる人はいますか?

更新: 時間を割いてヒントを残していただき、ありがとうございます。コメントをお待ちしております。

この問題の根本は多対多の関係にあることに同意します。それがリレーショナルデータベースでどのようにモデル化されるかを理解しています。それは非常に簡単です。

私が受け取るデータは第三者からのバイナリ ファイルの形式であるため、これらの構造を制御することはできませんが、読み込むときに最適な方法で保存できます。穴がありますが、それを読み取ってデータベースに保存すると、プログラムはデータベースにクエリを実行して結果を取得する必要があると思いました。大量のデータではないので、メモリ構造に格納することで必要なものを取り出すことができると考えました。

0 投票する
4 に答える
2214 参照

class-design - 大きく肥大化したクラスを小さなクラスに分割するにはどうすればよいですか?

私は大規模な「マネージャー」クラスを持っていますが、それはやりすぎだと思いますが、それをより論理的なユニットに分割する方法がわかりません。

一般的に言えば、クラスは基本的に次のメソッドで構成されます。

Manager クラスは私のビジネス ロジックの一部であり、すべてのエンティティのすべての CRUD 操作を含むデータ アクセス レベルで別の「Manager」クラスのインスタンスを含みます。

私はデータ アクセス レイヤーからさまざまなエンティティを取得しているため、データ エンティティをビジネス エンティティに変換するために Manager クラスの外部にコンバーターを配置しています。

マネージャー クラスの理由は、単体テストを行うときに、各 "マネージャー" クラスをモックアウトできるようにしたかったからです。各マネージャー クラスは 1000 以上の loc になり、それぞれに 40 ~ 50 のメソッドが含まれています。私はそれらが非常に肥大化していると考えており、すべてのデータ アクセス ロジックを 1 つのクラスに入れるのは厄介だと感じています。どうすればいいですか?

それらを分割するにはどうすればよいですか?使用すべき特定のデザインパターンはありますか?

0 投票する
6 に答える
4617 参照

design-patterns - アルゴリズムをクラスにカプセル化する

アルゴリズムをクラスにカプセル化することはどのように (一般的ではない) のだろうか? より具体的には、相互に共通のパラメーターを転送するいくつかの個別の関数を使用する代わりに、次のようにします。

共通パラメーターをクラスにカプセル化し、コンストラクターですべての作業を行います。

関数の引数を介して共通のパラメーターと中間結果を転送する必要がないことは非常に実用的だと思われます..しかし、この「パターン」が広く使用されているのを見たことがありません..考えられる欠点は何ですか?

0 投票する
6 に答える
1391 参照

c++ - クラス内のポインタを含むガベージ、C ++

Borland BuilderC++を使用しています。メモリリークがあり、作成したこのクラスが原因である必要があることはわかっていますが、修正方法がわかりません。私のコードを見てください-どんなアイデアでも大歓迎です!

.hファイルは次のとおりです。

そして、ここにいくつかの.cppファイルがあります:

mainでクラスを使用する場合、基本的にはポインタを作成するだけです。

ここで、corners-> locationは別のクラスの文字列であり、t[5]とt[6]は両方とも文字列です。問題は、imageLocationに期待されるものが含まれておらず、多くの場合、ゴミだけが含まれていることです。私はメモリリークとポインタについてたくさん読んだことがありますが、私はまだプログラミングに非常に慣れておらず、そのいくつかは非常に混乱しています。どんな提案も素晴らしいでしょう!

0 投票する
8 に答える
345 参照

design-patterns - クラスデータの責任

私は「注文書」クラスを持っています。単一の発注書に関する情報が含まれています。データベース メソッド用の DAO クラスがあります。

注文書をロードして更新するメソッドの責任はどこにありますか?

PurchaseOrder クラスに、DAO クラスを直接使用する '.update'、'insert'、'delete'、および '.load' メソッドがあるか、または PurchaseOrder クラスが DAO メソッドを認識せず、これらを管理する POController クラスを持っている必要があります。相互作用?

ユーザーは、一度に 1 つの PurchaseOrder のみを処理します。

ありがとう!

0 投票する
6 に答える
1893 参照

c++ - プライベート/パブリックメンバーとしてベクトルを使用したクラスデザイン?

コンテナクラスまたは他のクラスをプライベートまたはパブリックメンバーとしてクラス内に配置するための最良の方法は何ですか?

要件:

1.クラス内のVector<someclass>

2.ベクトルの追加とカウントが必要なインターフェイス