タグ付けされた質問 「design」

ソフトウェア設計による問題の解決とソリューションの計画に関する質問。

2
MVP(監視コントローラー)ビューはモデルを更新しますか?
私はMVPについて、特にコントローラーの監督について読んでいます。ビューをモデルとどのようにやり取りするかは、頭を抱え込むのが難しい点の1つです。 プレゼンターがモデルを更新する必要があり、ビューがモデルから読み取ることは私の理解でした。プレゼンターは、インターフェイスを介してビューを更新することもできます。これに関するマーティンファウラーの記事は、まさにそれを示しているようです(http://martinfowler.com/eaaDev/SupervisingPresenter.html)。 ただし、他の記事/ブログは、モデルを直接更新するビューを示しています(https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other-分離表示パターン/)。 これらは単なるパターンであることを知っているので、さまざまな実装がありますが、モデルを更新するビューは、必要以上に多くのことを行っているようです。 たとえば、名前と電話番号を含む人物クラスがあったとします。ビューには、この名前と番号、および個人の名前と番号を変更するための送信ボタンを表示できます。送信ボタンをクリックすると、ビューではなくプレゼンターで更新が処理されると思います。ただし、私が参照した記事は、ビューがモデルを直接更新できることを提案しています。 それで、ビューはモデルを更新する必要がありますか?それとも、プレゼンターだけが処理する必要がありますか? 編集: MSDN記事のコード: public class PersonalDataView : UserControl, IPersonalDataView { protected TextBox _firstNameTextBox; public void SetPersonalData(PersonalData data) { _firstNameTextBox.Value = data.FirstName; } public void UpdatePersonalData(PersonalData data) { data.FirstName = _firstNameTextBox.Value; } }

3
設計:データベースの変更が原因で下位互換性が失われないようにする方法
これは私のシナリオです、私はこのインターフェースを持っています: public interface hitTheDataBase { public void insertMe(String [] values); public void modifyMe(String [] values); public DataTable selectMe(); } そして、私はインターフェースを実装するこれらの2つのクラスを持っています: public Class hitSqlServer implements hitTheDatabase { public void insertMe(String [] values) { executes insert into table_in_sqlServerBD (col1, col2) values(values[0], values[1]) } public void modifyMe(String [] values) { executes update table_in_sqlServerBD …

2
ファイルからのオブジェクトの読み取り、SRPの違反?
C ++で物理シミュレーションプログラムを書いています。私はOOPとC ++の初心者です。 私のプログラムでは、入力ファイルのデータに基づいていくつかのオブジェクトを初期化する必要があります。 たとえば、架空の入力ファイル: # Wind turbine input file: number_of_blades = 2 hub_height = 120 # Airfoil data: airfoil1 = { chord = 2, shape = naca0012} airfoil2 = { chord = 3, shape = naca0016} この例では、TurbineクラスとAirfoilクラスがあるとします。翼オブジェクトは翼弦と形状を知る必要があり、タービンオブジェクトは翼の高さと数を知る必要があります。 各オブジェクトが入力ファイルから自分自身を構築できるように、これを行う必要がありますか? 例えば: class Turbine { public: Turbine(File input_file); // reads input file …

3
コードの重複や不明確なパラメーターの通過を回避するためのクライアントAPIのリファクタリング
APIを開発する必要があります。APIの機能は、サーバーによって公開されているサービスを呼び出すリクエストです。 最初、APIは次のように機能しました。 class Server: def firstRequest(self, arg1, arg2): # block of code A async = Async() async.callFirstRequest(arg1, arg2) # block of code B def secondRequest(self, argA, argB, argC): # block of code A (identical to that of firstRequest) async = Async() async.callSecondRequest(argA, argB, argC) # block of code B (identical …

1
Windows 10アプリサービスはエンタープライズ環境でのみ役立ちますか?
マイクロソフトがユニバーサルWindowsプラットフォーム(UWP)向けに導入した機能の1つ、つまりアプリサービスに従っています。これで、アプリはバックグラウンドタスクの形式でサービスを提供できるようになり、他のアプリから呼び出されてタスクを実行できるようになりました。これは、デバイス上のWebサービスのようなものです。 開発者が、自分自身または他の開発者からのサービスを他のアプリに提供することを目的としたアプリサービスを提供するアプリケーションを作成するとします。アプリが常にシステムに存在することを保証する方法がないため、開発者がアプリサービスを使用する必要がある場合、開発者は何ができますか? すべてのアプリにサービス機能を実装すると、目的が達成されず、他のアプリがインストールされていない場合に機能しないアプリを構築することは悪い決断のように思えます。それでは、アプリサービスは管理されたエンタープライズ環境のみを対象としており、一般の人々を対象としていませんか?

2
メモリにデータの複数のビューを保存するにはどうすればよいですか?
たくさんのモジュールがあります。これらのモジュールを、完全で重複しないさまざまなカテゴリに分類できます。例えば、3つのように表すことができるIDを持つカテゴリ、Animal、Vegetable、およびMineral。さらに、これらのカテゴリをサブカテゴリに分類します。サブカテゴリも、明確で完全であり、重複しません。例えば、のように表すことができるIDS Mammal、Reptile、Legume、Root、Rock、Gem。最後に、これらのカテゴリの下に、モジュール自体が存在し、例えばCat、Dog、Iguana、Bean、Quartz、Emerald、など これが私の一般的な使用例です: すべてのモジュールでさまざまなメソッドを呼び出す必要があります。 すべてのモジュールのすべてのデータの現在の状態のフラットスナップショットを取得する必要があります。 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールでさまざまなメソッドを呼び出す必要があります。 既知のIDに基づいて、特定のモジュールでさまざまなメソッドを呼び出す必要があります。 これは、「何かをする」または「自分についてのデータを教えて」のいずれかです。 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールに関する集約データを保存する必要があります。 このデータをどのように保存すればよいですか? 他のいくつかの関連する事実: カテゴリは実行時に確立されます そのため、最下位レベルのモジュールは共通のインターフェースを共有します。 いったん設定されると、それらはその特定の実行で変更されません-それらは設定ファイルのデータに基づいています。 これが私が現在していることです: を含むクラスがありますMap<Category, CategoryDataStructure>。このクラスは、要件#2で使用するためのデータの個別のCollection<Module> ビューも保持します。 CategoryDataStructureを介して、メソッドコールをチェーンに送信するチェーンされた委譲メソッドがありますSubCategoryDataStructure。 CategoryDataStructure 要件#5で使用される集計データも格納します。 それは機能しますが、正直なところかなり扱いにくいです。全体はステートフル/ミュータブルであり、変更が困難です。新しい動作を追加したい場合は、多くの場所に追加する必要があります。現在、データ構造自体にも多くのビジネスロジックがあります。委任方法。また、親データ構造は、特定のモジュールと必要に応じてその親データ構造、および必要に応じてその親のデータ構造を作成するために、多くのビジネスロジックを実行する必要があります。 どういうわけか、データ管理ロジックをデータ構造自体から切り離そうとしていますが、ネストが複雑なためです。ここに私が検討してきた他のいくつかのオプションがあります: シンプルなを作成し、Map<Category, Map<Subcategory, Module>>すべてのコードを配置して、その状態を別のクラスに保持します。これを行う際の私の懸念は要件#1と#2です。同じデータを表す2つの異なるデータ構造があるので、ビューの一貫性を保つのは困難です。 すべてをフラットなデータ構造で実行し、特定のカテゴリまたはサブカテゴリを探す場合は、構造全体をループします。

3
C ++ヘッダーファイルの設計:APIの定義と同じですか?
私はC ++で大規模なソフトウェア開発をするのが初めてで、デザインの側面について疑問に思っていました。 私はこの質問を読んでいて、全体として、定数の定義やその他の些細な問題を乗り越えたら、C ++ヘッダーファイルは単なるAPI定義だと思いました。 それらは、他のプログラマー(または他のモジュールからの自分)が使用できるもの(クラス、パブリック関数)を定義しますが、プライベートクラスまたは関数を定義することはできません。それは、ヘッダーファイルが抽象化(インターフェイス...)を定義し、ソースファイルがそれを実装するようなものです。ソースファイルがコンパイルされると、実装の詳細は隠され、モジュールが実行できることを定義する公開されているヘッダーが残ります。 ヘッダーとソースファイルの分離に関するこの見方は、通常の説明よりもはるかに理解しやすく、理解しやすいと感じXXXました。未公開のソースファイル?」 ヘッダーファイルのメンタルモデルはおおよそ正しいですか?私は何を取りこぼしたか ?

3
ソケットを介して接続された複数の小さなプログラムと1つの大きなプログラム
私はいくつかのセンサーからの読み取りとそれらのセンサーからのデータの融合を含むプロジェクトの始まりです。全体として、USBを介して接続された4つのセンサーと、同じくUSBを介して接続されたWebカメラがあります。 私の同僚の1人は、プログラムを小さな部分に分割し、それらをネットワーク経由で通信させることがいかに素晴らしいかについて非常に声高に言っています。彼は、各センサー(またはカメラ)の実行可能ファイルを用意し、次に他のユーザーと通信する中央制御アプリケーションを用意する必要があることを示唆しています。 私は直感的にこの考えが好きではありません。問題の同僚は、そのアプローチを使用し、追跡およびデバッグが困難な問題の終わりのない別のプロジェクトに取り組みました。 それは非常にステートフルなデザインのようではなく、ややエレガントではないように思えます。各センサーを処理するためのライブラリを作成し、別のスレッドで実行したいと考えています。 また、実行する必要がある計算により、1000Hz近くで別のシステムの更新が提供されることも指摘しておく必要があります。ネットワーク通信の層を追加すると、潜在的なボトルネックが追加されるように見えます。 これに関する他の人々の意見、そしておそらくこの種の実践に関するいくつかの参考文献を聞きたいと思います。
8 design 

3
主キーにハッシュを使用することは良い考えですか?
オーストリアの電子IDカードは、いわゆるセクタ識別子に依存しています。たとえば、病院では、大まかに次のように計算される、その人のセクターIDを取得することで、その人を識別できます。 sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant それは良い考えですか?どんなに小さくても、衝突の可能性は危険だと思います。 ハッシュテーブルでは、衝突が発生した場合、同等性を確立する別の方法がありますが、主キーでは、同一の2つを使用することはできません。これは複合キーで回避できますが、一意のセクター識別子のポイントが失われます。 それをしても大丈夫ですか、それがいつか壊れることなくそのようにする方法はありますか?

1
懸念の分離の維持
私は最初のC#アプリを作成していますが、問題の分離に少し問題があります。コンセプトは理解していますが、正しくやっているのかわかりません。私の質問を説明する簡単な例としてこれを持っています。ゲームなどのアプリには、プログラムやゲームなどのメインループを実行するメインクラスがあります。私の質問は、このクラスのクラスのすべてのインスタンスへのすべての参照を維持し、それがそれらが相互作用する唯一の方法にすることですか? たとえば、プレーヤー、カード、ボードを使用したカードゲームです。プレーヤーがカードをボードに置きたいが、PlayerクラスにはカードのList <>しかなく、ゲームボードについて何もわからないとしましょう。ただし、メインのGameクラスは、プレーヤー、カード、およびゲームボードについて知っています。ボードにカードを配置するのがゲームクラス次第なのか、それとも、プレーヤーのアクションであるため、それはプレーヤークラス内にあるべきであるということの方が理にかなっています。 例: public class Game{ private GameBoard gameBoard; private Player[] players; public Game(){ gameBoard = new GameBoard(10,10); Player player1 = new Player(); Player player2 = new Player(); players = {player1, player2}; } // Create method here? public void PlayerPlaceCard(int x, int y, int cardIndex){ gameBoard.grid[1,1] = player1.cards[cardIndex]; } …
8 design 

3
設計パターン-戦略ごとのDLL
私は通常、次の方法でアプリケーションを設計していることに気づきました。 必要なサブシステムのインターフェースを含む1つのDLL。たとえば、Company.Framework.Persistence.dll。 上記のサブシステムの各戦略(または実装)ごとに1つの新しいDLL 。例えば: Company.Framework.Persistence.MSSQL.dll Company.Framework.Persistence.MySQL.dll Company.Framework.Persistence.FileSystem.dll これにより、多くのプロジェクトで非常に大きなソリューションが得られますが、一方で、消費者は自分のニーズに適したDLLを選択する機会が与えられます。 と呼ばれる単一のDLLがある場合Company.Framework.Persistence.dll、消費者は彼が決して使用しない可能性がある多くの戦略をロードする必要があります。DLLをモジュール化すると、この問題を解決できます。 これは良い習慣ですか?この設計には欠点がありますか?

5
大規模なデータセットに対するきめの細かい検索
1日あたり約400万件のレコードがあり、オンラインで7年間の価値を維持する必要があるため、検索できるようにする必要がある102億件のレコードを調べています。ユーザーは、検索がUIに十分な速さで、3〜5秒になることを期待しています 私の制御が及ばないため、既製のデータベースソリューションを使用することはできません。これは、データベースを別のチームに渡して管理する必要があるためです(質問しないでください)。つまり、ハードウェアを最適化する機能を失い、彼らはデータベースのための万能サービスを提供し、GBによって(内部で)課金されるソフトウェア。私は私がポイントを作ることを示唆するコメントを受け取るつもりだと確信しています、私はすでに持っており、経営陣は彼らが私に何をするように求めているかはばかげています。 私はソリューションの要としてLuceneを使用することを検討してきました。タイプ別および日別にパーティション化された実際のデータをフラットファイルに保存します。次に、Luceneドキュメントを使用して、検索対象のいくつかのフィールドにインデックスを付けます。唯一の「Stored」フィールドはレコードのIDです(そのため、フラットファイルから読み取ることができます)。 私は正確にLuceneまたはハードドライブにこだわっていませんが、私の理解によれば、インデックスを検索するための最初のIO /シーク時間があります。その後、すべてのLuceneドキュメントIDがあるとき、さらにIOが発生するドキュメントを読みます/ seeking時間、それから私はフラットフラットから実際のレコードを読みます...データセットのサイズを考えると、これは非常に速くなるとは想像できませんが、これは少し心配ですか? Luceneの最大ドキュメントサイズはインデックスあたり21億です。そのため、ここでは複数のインデックスが必要になります。 このアプローチは、一見すると、うまくいくように見えますか? 保存しているデータはイベントアクションデータです。ほとんどのクエリは、イベントIDでグループ化し、特定のイベントの最後のイベントアクションの詳細を取得します。一部のクエリは、大規模なセットイベントとそれらの個々のイベントアクションを分析します。

2
Java Systemクラスの実装
Java Systemクラスには、さまざまなデータメンバーとそこに存在するのに最適なメソッドが含まれています。例えば: System.in (variable) System.err (variable) System.out (variable) System.exit(int) System.gc() System.getSecurityManager() など、しかし、私がそこにいることを理解していない方法があります: System.arraycopy(Object, int, Object, int int) 1つの配列を別の配列にコピーすると、Arraysクラスに属しているように感じます。ドキュメントから以下: このクラスには、配列を操作するためのさまざまなメソッド(ソートや検索など)が含まれています。このクラスには、配列をリストとして表示できる静的ファクトリーも含まれています。 配列を操作する方法は、この結論を私に指摘するものです。ある配列を別の配列にコピーすることは、確かに配列操作ですよね? 私の質問はそう:なぜあるarraycopy()でSystem? 初期のJava Systemクラス実装の遺物ですか?このメソッドは非推奨としてマークされていないため、少し迷っています。さらに、JavaのcamelCase標準に準拠していないため、初期のライブラリ設計の遺物であるという考えに立ち返ります。
8 java  design 

4
小さなクラスにリファクタリングする前に大きなクラスを分析する最良の方法は?
序文 大規模なスパゲッティコードクラスをリファクタリングする方法を探しているのではありません。そのトピックは他の質問で取り上げられています。 質問 4000行を超え、2000行を超える単一の巨大な更新メソッドを持つ別の同僚が作成したクラスファイルを理解するための手法を探しています。 結局、私はこのクラスのユニットテストを構築し、DRYと単一責任原則に従う多くの小さなクラスにリファクタリングしたいと考えています。 このタスクをどのように管理およびアプローチできますか?最終的には、クラス内で発生するイベントの図を描き、次に抽象化機能に進むことができるようになりたいのですが、クラスの責任と依存関係が何であるかをトップダウンで把握するのに苦労しています。 編集:人々が入力パラメーターに関連するトピックをすでにカバーしている回答では、この情報は初心者向けです。 この場合、クラスのメインメソッドには入力パラメーターがなく、停止するように指示されるまでwhileループが実行されます。コンストラクターもパラメーターを取りません。 これにより、クラス、その要件、および依存関係の混乱が増します。クラスは、静的メソッド、シングルトンを介して他のクラスへの参照を取得し、すでに参照しているクラスを介して到達します。

5
2つのデータベースアーキテクチャ:運用と歴史
私は珍しいデータベース構造について考え、誰かが以前にそれを使用しているのを見たことがあるのではないかと思いました。基本的に2つのデータベースを使用しています。 最初のデータベースは、現在有効なデータのみを保持します 2番目のデータベースは、最初のデータベースで入力、更新、または削除されたすべての履歴を保持します シナリオ 私は、発生するすべてをログに記録する必要があり、データが頻繁に変更されるプロジェクトに取り組んでいます。 例(実際のものではない) サッカーリーグのデータベース設計を行う必要があります。このリーグには選手とチームがあります。プレイヤーはしばしばチームを切り替えます。 最初の要件:データベースは、次の試合をプレイするために必要な情報を保持する必要があります。これは、すべてのプレーヤー、チーム、および各プレーヤーが現在所属しているチームのリストを意味します。 2番目の要件:データベースは、統計の生成に使用する履歴値を保持する必要があります。これは、チームに所属していたすべてのプレーヤーのリスト、またはプレーヤーが参加していたすべてのチームのリストを意味します。 問題 これらの2つの要件は、互いに正反対です。同じデータベースですべてを実行しようとしましたが、意味がありません。最初の要件は「次の試合のプレー」のみを対象とし、2番目の要件は「統計の生成」のみを対象とします。 同じデータベースですべてを行うために、明らかなソフト削除を使用して情報を削除/更新する一種の「挿入のみ」のデータベースを使用しました... 最初は簡単な作業のように見えましたが、プレーヤー、チーム、および各プレーヤーの現在のチームのリストを保持することは、突然、かなり難しくなります。次の一致を再生するために必要なアプリケーションロジックはすでに十分に複雑ですが、データベースは非常に役に立たない設計になり、アプリケーションは次の一致を再生するためにすべてのクエリに「削除済み」チェックを追加する必要があります。 「チームのすべてのプレーヤーが私に来てください」と叫ぶコーチになりたいですか?それから2000人のプレーヤーがあなたのところに来ます。その時点で、おそらく、「このチームで削除されていないすべてのプレイヤーが私のところにやって来ます」と叫ぶでしょう(この愚かなデザインについては誓います)。 私の結論 なぜすべてを同じデータベースに入れる必要があるのか​​不思議に思いました。多くの列(time_created、who_created_it、time_deleted、who_deleted_it)を追加しない限り、ソフト削除はすべてをログに記録するのに不十分なだけでなく、すべてを複雑にします。データベースの設計が複雑になり、アプリケーションの設計も複雑になります。 また、これら2つの要件は、分割できない1つのアプリケーションの一部として受け取りますが、これは2つの完全に異なるアプリケーションであると考え続けています。なぜ一緒にすべてをしようとしているのですか? そのとき、データベースを2つに分割することを考えました。次の試合をプレイするためにのみ使用され、現在有効な情報のみが含まれる運用データベースと、作成、削除、および誰が行ったかについて、これまで存在していたすべての情報を保持する履歴データベース。 目標は、2番目のデータベース(履歴)にできるだけ多くの情報を保持しながら、最初のデータベース(運用)とアプリケーションをできるだけシンプルに保つことです。 ご質問 以前にそのデザインを見たことがありますか?名前はありますか? 私が見逃している明らかな落とし穴はありますか? 編集2015-03-16 現在のアーキテクチャ 基本的に、アーキテクチャ全体を2ステップのプロセスと考えることができます。 ステップ1 : アプリケーションが実行中で、ユーザーがいくつかのアクションを実行しています イベントが発生するたびに、イベントテーブルに自動的に記録されます(監査ソリューション)。 次に、運用データベースの正しい行が更新されます ステップ2 : ジョブがイベントテーブルの最新の挿入を読み取り、この新しいデータを履歴データベースに挿入します。 ユーザーは履歴データベースを照会して、必要な情報を取得します。 イベントテーブルから、いつでも情報を再構築できます。問題は、このイベントテーブルが簡単にクエリできないことです。これは、履歴データベースが機能する場所です。必要なものを正確に取得しやすい方法でデータを提示する。 すべてを同じテーブルに入れるときの追加の問題 各クエリで「削除されている」チェックの複雑さが増すことについては、すでに懸念を表明しています。しかし、別の問題があります:整合性。 外部キーと制約を多用して、データベースのデータがいつでも有効であることを確認しています。 例を見てみましょう: 制約:チームごとにゴールキーパーは1人だけです。 チームごとにゴールキーパーが1人だけかどうかをチェックする一意のインデックスを追加するのは簡単です。しかし、ゴールキーパーを変更するとどうなりますか。以前の1つについての情報を保持する必要がありますが、同じチームに2つのゴールキーパーがいます。1つはアクティブで、もう1つは非アクティブであり、制約と矛盾します。 確かに制約にチェックを追加するのは簡単ですが、管理および検討する必要があるもう1つのことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.