問題タブ [object-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 投票する
8 に答える
744 参照

oop - 状態が不変の場合、静的クラスは適切ですか?

WebsterDictionary単語を取り、その定義を返すことができる関数を持つ単純なクラスが呼び出されたとしましょう。おそらく、定義を受け取って単語を返す別の関数があるでしょう。このクラスは、多くのクライアントによって常に使用されています。

検索を容易にするために、クラスには、単語とそれに関連付けられた定義を格納するメモリ内辞書であるメンバー変数が含まれています。ディクショナリは一度初期化されると決して変更できないと仮定します。ディクショナリは定数であり、インスタンス間で変化しません。

これは静的クラスの良い候補ですか? 静的クラスはステートレスであるべきだと読んでいます...しかし、このクラスには状態(メモリ内辞書)がありますよね?

編集:また、これが静的クラスになった場合、コンストラクターがなくなるため、いつ辞書を初期化しますか? 静的メソッドの 1 つが呼び出されるたびに、Dictionary への参照が null かどうかを確認する必要がありますか?

ありがとう。

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

c# - Linq から SQL へのマッピング オブジェクトの設計に関するアドバイス

タイトルと次のテキストが明確であることを願っています。正しい用語にあまり詳しくないので、間違っている場合は修正してください。初めてLinq ORMを使用していますが、以下に対処する方法を考えています。

2 つの DB テーブルがあるとします。

Linq コード ジェネレーターは、一連のエンティティ クラスを生成します。

次に、これらの Linq クラスをラップする独自のクラスとインターフェイスを作成します。

ここまでは順調ですね。

これで、ユーザーの電話を簡単に見つけることができますPhones.Where(p => p.User = user)が、API の利用者は、データを取得するために独自の Linq クエリを作成する必要はないはずです。そのため、このクエリを関数またはプロパティのどこかにラップする必要があります。

問題は、この例で Phones プロパティを IUser に追加するかどうかです。

言い換えれば、私のインターフェイスは具体的に私のデータベース オブジェクトをモデル化する必要がありますか (この場合、Phones は IUser に属しません)、または実際には、ユーザーに概念的に関連付けられている関数とプロパティのセットを提供するだけです (この場合、それはですか)?

どちらのビューにも欠点があるようですが、問題に対する標準的なアプローチがあるかどうか疑問に思っています。または、あなたが共有できる一般的な知恵の言葉.

私の最初の考えは、拡張メソッドを使用することでしたが、実際にはこの場合は機能しません。

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

c# - オブジェクトの設計: 「コレクション クラス」を整理/構造化する方法

現在、作成済みのクラスをどのように編成/構造化するべきかを理解するのに苦労しています。クラスは次のことを行います。

  1. コンストラクターでの入力として、ログのコレクションを受け取ります
  2. コンストラクターでは、ビジネス ロジックを実装する一連のアルゴリズムを使用して、ログを検証およびフィルター処理します。
  3. すべてのフィルタリングと検証が完了すると、有効でフィルタリングされたログのコレクション (リスト) が返されます。これは、UI でグラフィカルにユーザーに表示できます。

ここに私がやっていることを説明するいくつかの単純化されたコードがあります:

ただし、このコレクションにアクセスするには、次のことを行う必要があります。

その他の重要な入力事項:

  1. これらのフィルタリングされたコレクションのうち、アプリケーションに存在するのは 1 つだけだと思います (したがって、それを静的クラスにする必要がありますか? それともシングルトンにする必要がありますか?)
  2. オブジェクトの作成におけるテスト容易性と柔軟性は重要です (おそらく、テスト容易性のためにこれをインスタンス化されたクラスにしておくべきでしょうか?)
  3. 実際の変数名は非常に長く、実際のデータに到達するまでに 60 ~ 80 文字かかるため、可能であればログの逆参照を簡素化したいと考えています。
  4. このクラスをシンプルに保つための私の試みは、このクラスの唯一の目的が、この検証済みデータのコレクションを作成することであるということです。

ここに「完璧な」解決策がないことはわかっていますが、この設計で自分のスキルを向上させようとしているので、そのためのアドバイスをいただければ幸いです。前もって感謝します。


編集:

すべての回答者のおかげで、Dynami Le-Savard と Heinzi の両方が、私が最終的に使用することになったアプローチ (拡張メソッド) を特定しました。最終的に MyLogsFilter 静的クラスを作成しました

そして、コードでこれの読み取り専用コレクションを作成するには、次のようにします

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

c# - 一般的な構造を持つC#クラスの設計

これは単純なことかもしれませんが、私の頭はそれを包み込むことを拒否しているので、その場合は常に外の景色が役に立ちます!

患者のパラメータ登録を実装するために、オブジェクト階層を設計する必要があります。これは特定の日に行われ、患者に関するさまざまなパラメータ(血圧、心拍数など)を収集します。これらのパラメーター登録の値は、文字列、整数、浮動小数点数、さらにはGUID(ルックアップリストの場合)など、さまざまなタイプにすることができます。

だから私たちは持っています:

更新:提案のおかげで、モデルは次のようにモーフィングされました。

これは確かに少し簡単ですが、ParameterRegistrationのIListが抽象ParameterRegistrationValueオブジェクトを指しているので、実際の値を(サブオブジェクトに格納されているため)どのように取得できるのでしょうか。

たぶん、一般的なこと全体は、結局のところ完全に進む方法ではありません:s

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

php - PHPOOPの質問

PHP 5.3のオブジェクトに特定の定数またはプロパティを含めることを要求することは可能ですか?PHPのインターフェースモデルについて少し読んだところ、抽象的なパブリックメソッドでしか機能しないようです。したがって、私が求めているのは、オブジェクトAとオブジェクトBの2つのオブジェクトを作成する方法があるかどうかです。オブジェクトBがオブジェクトAを拡張する場合は、特定の定数または変数が含まれている必要があります。このタイプのアーキテクチャをどのように設計しますか?ありがとう。

0 投票する
3 に答える
1175 参照

java - ByteArrayOutputStreamのパブリックインターフェイスの設計の正当性?

多くのJava標準ライブラリとサードパーティライブラリがあり、それらのパブリックAPIには、への書き込みまたはからの読み取りのためのメソッドがありますStream。一例として、処理された画像のコンテンツを書き込むことがありますjavax.imageio.ImageIO.write()OutputStreamもう1つの例は、結果のpdfを書き込むためのiTextpdf処理ライブラリです。OutputStream3番目の例はAmazonS3JavaAPIで、これはInputStreamそれを読み取り、S3ストレージにファイルを作成します。

これらの2つを組み合わせたい場合、問題が発生します。たとえば、結果をにプッシュするためBufferedImageに使用する必要がある画像があります。ただし、S3で必要なため、AmazonS3にプッシュする直接的な方法はありません。 これを解決する方法はいくつかありますが、この質問の主題はの使用法です。ImageIO.writeOutputStreamInputStream
ByteArrayOutputStream

背後にある考え方は、出力ストリームに書き込みたい人が配列に書き込み、読み取りたい人が配列を読み取るように、ByteArrayOutputStreamラップされた中間バイト配列を使用することです。Input/Output Stream

私の疑問は、たとえば、バイト配列に直接アクセスできるをByteArrayOutputStream提供するために、バイト配列をコピーせずにバイト配列へのアクセスを許可しない理由です。InputStreamこれにアクセスする唯一の方法は、を呼び出すことです。これtoByteArray()により、内部配列(標準配列)のコピーが作成されます。つまり、私の画像の例では、メモリに画像の3つのコピーがあります。

  • 最初は実際のBufferedImage
  • 2番目はとの内部arrayですOutputStream
  • 3つ目toByteArray()は、を作成できるように作成 されたコピーInputStreamです。

この設計はどのように正当化されますか?

  • 実装を隠しますか?を提供するだけgetInputStream()で、実装は非表示のままになります。
  • マルチスレッド?ByteArrayOutputStreamとにかく複数のスレッドによるアクセスには適していないので、これはできません。

ByteArrayOutputStreamさらに、 Apacheのcommons-ioライブラリ(内部実装が異なる)によって提供される、の2番目のフレーバーがあります。ただし、どちらもまったく同じパブリックインターフェイスを備えているため、バイト配列をコピーせずにアクセスする方法はありません。

0 投票する
3 に答える
1427 参照

c# - C# でデータベースの外部キーをモデル化する

カレンダーアプリを作成しています。Appointment テーブルと Person テーブルがあります。この 2 つは、各テーブルの PersonID フィールドによってリンクされています。

私の質問は、基になる .Net Appointment オブジェクトに PersonName のプロパティが含まれている必要があり、データベース ビュー (またはテーブルを結合するストアド プロシージャ) からオブジェクトを入力する必要があるか、Appointment クラスに People クラスを含める方が正しいかということです。 ? 答えが後者の場合、データベースから Appointment/Person オブジェクトを設定する最良の方法は何ですか?

0 投票する
1 に答える
483 参照

javascript - オブジェクトを作成するときに名前の衝突を回避する方法

JavaScriptでは、ある種のextend関数を使用してオブジェクトを作成できます。

たとえば、一連のパブリックメソッド(、、、、、など)を公開するクラスがあるとobservableします。getpushsetincrementget

この場合、observableはEventEmitterでもあるため、パブリックメソッドのセット(、、、など)も公開されemitます。onremoveListener

これらのクラスは両方とも、状態を格納する内部アンダースコアプレフィックス付きプロパティを持っています。eventemitterは_events、イベントハンドラーと監視可能な用途_state_id保存し、状態とIDを保存するために使用します。

さて、このようなオブジェクトコンポジションを使用してモデルを作成すると

Observableすでに_state内部プロパティを使用しており、名前の衝突が発生しているため、これにより問題が発生します。

ミックスインが安全に機能するために、どのオブジェクトがどの内部プロパティに依存しているかを「知る必要がある」だけでは醜いと思います。

同じ内部プロパティ名を使用する2つのオブジェクトが混在しないようにするにはどうすればよいですか?

理想的には、これはES6のプライベート名で解決されますが、まだそれを行うことはできず、パフォーマンスを損なうことなくそれらをエミュレートすることはできません。パフォーマンスに大きなペナルティがないES6名エミュレーションを提供できない限り、これらのソリューションには興味がありません。

別の方法はクロージャを使用することbindですが、そうすると、すべてのインスタンスの関数を再作成することになり、パフォーマンスが大幅に低下します。もう1つの方法は、内部プロパティを__eventEmitter_eventsおよびとして名前空間化すること__observable_stateです。それは単に醜く、名前空間の衝突の可能性を減らします、それはそれを削除しません。

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

vb.net - vb.net - 継承されたクラスのオブジェクト集約

私はいくつかのオブジェクトの構成で遊んでいます。

私は2つのクラス(ノートとタスク)を持っています。タスクは拡張メモであるため、Task クラスは Note クラスから派生します。

Property Child as list (of note)メモまたはタスクを既存のメモまたはタスクに追加できるため、各メモにはプロパティがあります (したがって、この「子」メモはタスクまたはメモである可能性があります)。

すなわち。

最後の子メモ オブジェクトは実際にはタスクですが、この集計を機能させるにはどうすればよいですか? メモでもタスクでもかまいませんが、基本クラスまたは拡張クラスの機能をリリースしたいと思います。

私がすぐに考えたのは、各オブジェクトにはタスクのリストとメモのリストが必要であるということでしたが、もっと洗練された解決策があるように感じました。

誰もこれについて何か考えがありますか?

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

c++ - (コンストラクターで)それを含むクラスへのポインターを渡すことは悪い設計であり、もしそうなら、解決策は何ですか

よく私は次のようなコードに遭遇します

これが行われる理由は、m_memberがそれを含むクラスからメンバー関数を呼び出すことができるようにするためです...別名

個人的には哀れなデザイン(「親愛なる子供、クラスのカプセル化に何をしているのか知っていますか」)だと思うので嫌いですが、一般的にこの動作は悪いので、もしそうなら、この種の回避方法を知りたいです。設計。

編集:イニシャライザーリストでこれに焦点を当てないでください、それがctor本体にあるとしましょう。