ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

4
このコード構造は何らかの点で有益ですか?
私は最近、Java Webアプリケーションプロジェクトに夢中になり、このタイプの形式に従う多くのクラスに遭遇しました。 public class MyThingy { private final int p1; private final String p2; … public MyThingy (int p1, String p2, …) { this.p1 = p1; this.p2 = p2; … } public static void doSomething(int p1, String p2, …) throws Throwable { final MyThingy myThingy = new MyThingy(p1, p2, …); …

1
モデルは使用せず、ビューモデルのみ
私は新しいMVC 5プロジェクトをゼロから始めています。私はEF 6(Database First)とIdentity 2.0を使用しています。 私のソリューションは、3つの異なるプロジェクトで構成されています。データ(.edmxと私のDBコンテキストがある場合)、リソース(ローカライズ目的)、およびWeb(Webプロジェクト自体)です。 デフォルトでは、すべてのビューにViewModelsを使用しています。新しいビューを作成するたびに、最初に行うのはViewModelを追加することです(ViewModelがそれらのビューに接続されている場合、それらをすべて同じファイルに保持します。たとえば、AccountViewModelに保持するユーザーアカウントに関連するすべてのViewModelを保持します)。 。これまでのところ、これにより状況が非常にシンプルになり、以前に抱えていたいくつかの問題が解決されました。 しかし、私は疑問に思っています、モデルを使用することはまったく意味がありますか?現在使用しているのはIdentityの1つだけです。これはデフォルトで作成され、Identityに固有で必要なApplicationUserとApplicationDbContextが含まれています。それ以外は、すべてViewModelsです。 データプロジェクトは、アプリケーションの「モデル」と見なされますか?したがって、私は実際にモデルを使用しています。それは、Web \ Modelsに保持する一連のクラスではなく、「モデル」(エンティティによって作成されたBLオブジェクト)が格納される別個のプロジェクトです。そう思いますが、よくわかりません。 これは正しいアプローチですか、それとも将来的に問題が発生する可能性がありますか?これはWebプログラミングへの私の最初の取り組みなので、アドバイスをいただければ幸いです。
8 c#  .net  mvc  asp.net  asp.net-mvc 

1
AST形状を定量的に比較する
同様のソースコードプログラム(C、C ++、Go、またはGCCでコンパイルされたもの)の抽象構文ツリーの形状をどのように比較できますか? 私は推測するソースコードの盗用検出は、そのような技術を使用しますが、私はそれと呼ばれることだろうかの見当がつかない... たとえば、統一を使用してASTを比較できますが、それはブール値の回答しか提供しません。数値の「距離」、またはある種の数値ベクトル(たとえば、機械学習や分類アルゴリズム、またはその他のビッグデータのものに後でフィードされる)を提供するいくつかの手法を探しています。 大規模なソースコードセットでのビッグデータや機械学習アプローチへの言及も歓迎します。 (このように広範またはあいまいな質問で申し訳ありません。使用する用語がわかりません) 2つのASTまたはプログラムを単純に比較したくありません。大量のプログラム(Debianディストリビューションのソースコードの半分など)を処理し、その中に同様のルーチンを見つけたいと思っています。私はすでにMELTを使用してGCC内部表現(Gimple)に取り組んでいるため、それを活用したいので、いくつかのメトリック(どれか?循環的複雑度はおそらく十分ではない)をデータベースなどに保存し、比較して処理します... 補遺:MOSSシステムと紙について発見されましたが、構文の形はまったく気にしていないようです。ツリーの編集距離も調べます。 ソースコードの類似性を探すことについて(JérémieSalvucciに感謝)Michel Chilowi​​czの博士論文(2010年11月フランス語)も発見

1
大きな静的初期化子はコードの匂いですか?
SimpleExpandableListAdapterAndroidで拡張しています。Androidのアダプターは、コンストラクターにかなり複雑な引数が多数あり、セッターやビルダーがないため、あまりうまく実装されていないと思います。私のクラスでは、これらの引数のほとんどは呼び出し元のクラスに依存していないため、内部的に構築したいと思います。ただし、引数はネストされたListsであり、プログラムで構築する必要がある整数と文字列の配列です。 superコンストラクタの前に何もsuper呼び出すことができず、呼び出しが戻る前にインスタンスメソッドを呼び出すことができないため、現在、呼び出しから呼び出す静的メソッドがいくつかありsuperます。 super(getContext(), initGroupData(), groupLayout, initGroupFrom(), initGroupTo(), initChildData(), childLayout, initChildFrom(), initChildTo()); これを処理する方法は3つあります。今と同じように静的メソッドを呼び出す、おそらくこれらの同じメソッドを呼び出して静的変数を初期化して静的変数を初期化する大きな静的イニシャライザを使用するsuperか、これらのメソッドをすべてビルダーにカプセル化します。 今はビルダーに傾いていると思いますが、これを処理するためのより良い方法があるかどうか疑問に思っています。

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ました。未公開のソースファイル?」 ヘッダーファイルのメンタルモデルはおおよそ正しいですか?私は何を取りこぼしたか ?

2
合成されたオブジェクトへのポインタを返すことはカプセル化に違反しますか
他のオブジェクトを集約するオブジェクトを作成する場合、パススルー関数を使用して内部オブジェクトへのインターフェイスを公開するのではなく、内部オブジェクトへのアクセスを許可したいと思います。 たとえば、2つのオブジェクトがあるとします。 class Engine; using EnginePtr = unique_ptr<Engine>; class Engine { public: Engine( int size ) : mySize( 1 ) { setSize( size ); } int getSize() const { return mySize; } void setSize( const int size ) { mySize = size; } void doStuff() const { /* do stuff …

4
ページ上のREST API呼び出しが多すぎますか?
高度にモジュール化された小さなコンポーネントを使用して設計されたWebアプリ(この場合はAngularJSディレクティブを使用しますが、WebComponents、ReactJSコンポーネント、またはその他のテクノロジと同じくらい簡単にできます)。多くの場合、コンポーネントには、初期化時またはユーザーの操作時に非同期REST API呼び出しがあります。この設計により、ページごとに多くのAPI呼び出し(20以上の場合もあります)が発生しています。このデザインに問題はありますか?シングルトンとして機能するより大きなクライアント側サービスにAPI呼び出しを圧縮することを提案している人もいます。したがって、ページがそのデータの一部しか使用しない場合でも、10回のAPI呼び出しは1回に削減される可能性があります。赤い旗、またはこのデザインの問題はありますか?どちらを優先すべきですか?
8 rest  api  async 

5
内部APIへの変更が他のプロジェクトを壊すのを防ぐ方法は?
20〜30の独立したモジュール/ソリューションがあります。これらのそれぞれには、クラス、コンポーネントなどが異なる7〜10のプロジェクトがあります。これらはすべて社内で使用されます。 私たちの問題は、1つのモジュールに変更を加える場合、このコードにアクセスしている他のすべてのモジュールを確実に更新する必要があることです。コードベースが異なるため、これを知るのは困難です。 APIのすべての外部使用がどこにあるかをどのように文書化できますか?あるいは、小さな変更が他のモジュールを壊すのを防ぎますか?

3
複雑さを隠すレイヤーの実装
私が取り組んでいるプロジェクトの依存関係の一部として、いくつかのコアサービスを使用しています。私たちが大きな変更を加えることができないこれらのサービスは、大きな混乱です。呼び出すメソッドに応じて、パラメーター(および戻り値)を別のエンコーディング、ロケール、タイムゾーンに変換する必要があります。 これらのパラメーターは独自のコードの複数の場所で生成されるため、これらの変換は複数の場所で実行されます。私たちがそれらを私たちの側に渡す前に、それらを生成するときがあります。コアサービスでメソッドを呼び出す直前。混乱がコード全体に広がっているので、それを分離するためのレイヤーを導入したいと思います。 私の質問は、そのための最良のアプローチは何ですか。最初は、使用する必要がある各サービス/メソッドに対応するサービス/メソッドを作成することを考えました。これらのメソッドは、単に変換を実行し、コアサービスに委任し、戻り値の変換を実行します。しかし、これはどういうわけか扱いにくいようです。 その後、アノテーションを使用することを考えましたが、使用方法は完全にはわかりません。そして、私が理解しているように、理想的には、呼び出されたメソッドに注釈を付ける必要があります。たとえば、パラメーターを@converToUtcで注釈し、注釈の実装で変換を行うことができます。これは正しいです?もちろん、これは私たちのコードではなく、現在私たち以外のプロジェクトでこれらのメソッドを使用しているコードを壊すので、これは難しいことです。 この状況に最適なアプローチは何ですか?

1
ハードウェアアクセラレータのGUIデータはGPUに保持されますか
ほとんどのハードウェアアクセラレーションGUIライブラリがどのように機能するかについて、いくつかの調査を行っています。ここでは、実際にはそれらのレンダリングバックエンドのみに関心があります。私は、自分自身をある種のサイドプロジェクトとして書き、書くための最良の方法を理解しようとしています。ここでは、過度に凝った機能ではなく、究極のパフォーマンスを目指しています。プリミティブ、テキスト、アニメーションを描けるようになりたいです。 私が知っているいくつかの優れたライブラリーは、Qt、Skia、およびCairoです(ただし、HWAの状況が何であるかはわかりません)。私はまた、きちんとしたフォローがあるように見える小さなライブラリーであるNanoVGを見ました。私はNanoVGでまともなパフォーマンスを達成することができませんでした... 私を驚かせた唯一のことは、これらのライブラリすべてが「ペイント」の概念を利用しているようであり、各プリミティブ形状が最初から何度も描かれているように見えることです。つまり、APIからは、形状がGPUで「オブジェクト」として作成されたかのように表示されず、用語が何であれ、そこに残されて「自動」でレンダリングされるわけではありません。言い換えると、それらは、いくつかの大きなループで再描画されるためにGPUのメモリに残されません。詳しく説明すると、描画する必要がある各ie長方形に対して、その長方形をレンダリングするためだけにOpenGL状態全体が設定され、その後再び破棄されるようです。これらのレンダリングされた形状は、少なくとも最終的な宛先でレンダリングされているように見えますが、GPUはシーン全体を構成できます。 これらのライブラリが機能することを期待していた方法は、実際にシーン全体をGPUに保存することです(恐ろしい用語を除きます)。たとえば、プリミティブは三角測量されてメモリに残され、その後、複雑なプロセスを使用してシーンのメインレンダリングループが作成されます。さらに、属性を更新したり、プリミティブを削除または追加するためのメカニズムが配置されます。これはかなり漠然とした説明ですが、あなたはアイデアを理解していると思います。 私が今聞きたいのは、「保存」アプローチと比較して「ペイント」アプローチにパフォーマンス上の利点があるかどうかです(ここでも、これらに適切な名前があるかどうかわかりません...)。おそらく、ある種の複雑なキャッシングメカニズムですか?それとも、これで作業する方がはるかに簡単ですか? 「保存」アプローチではGPUでより多くのメモリを使用する可能性がありますが、「ペイント」アプローチに必要なすべてのOpenGL呼び出しはそれほど高価ではありませんか?レンダリングされた形状をキャッシュすることでこれを補正できるかもしれないと思いますが、GPUは、特に通信を考慮して、CPUに比べてこのような一度限りの(またはあまり規則的でない)ラスタライゼーションを実行するときに非常に大きなメリットを提供しますオーバーヘッド?また、この通信のオーバーヘッドは、フレームごとに描画を行わなければならないときに、アニメーションに深刻な問題を引き起こしませんか? NanoVGに内部キャッシングメカニズムがないことは確かであり、これがかなり劣ったパフォーマンスの原因であると思います。一方、Qtは優れたパフォーマンスを持っているように見えるので、正しく動作しているはずです。グーグルもスキアを上手く利用できるようだ。 PS。私はあらゆる種類の専門家ではなく、つい最近OpenGLを学び始めました。 編集:私が考えたもう1つの可能性は、おそらく「描画」アプローチが純粋にメモリの利点のために必要であると考えられたということですか?私が思うのは、これらのすべてのライブラリはもちろん別の時代に始まったものであり、組み込みプラットフォームもターゲットにしているため、GPUメモリはターゲット(ed)プラットフォームでは不足している可能性があり、使用量は可能な限り少ないためです。パフォーマンスよりも重要です。繰り返しになりますが、このような状況では、通信オーバーヘッドがCPUを上回っていることを考えると、フレームごとのGPUラスタライゼーションがCPUよりも優れているとは確信できません。 さらに、http://blog.qt.io/blog/2010/01/06/qt-graphics-and-performance-opengl/を読んだところ、Qtは実行時にプリペイントされたセグメントのシェーダーコードを実行時に「ペイント」する前にブレンドし、次に、OGLコンパイラーが実行時にコードを適切にインライン化することを期待しています。これは、OGLの初期化オーバーヘッドがさらに増えるように思えます...
8 gui  qt  opengl  gpu 

1
DataMapperパターンのどのアプローチが複数のテーブルまたは結合されたテーブルに適していますか?
通常、Data Mapperは1つの特定のテーブルのデータをマップします。(理論的には、ストレージとドメインオブジェクトの間で通信する必要がありますが、私の場合は不可能なので、テーブルと直接通信しています。) Table1Mappper> Table1 ただし、そのテーブルで別のテーブルからデータを結合する必要がある場合は、1つのテーブルからのマッピングのみを想定していたデータマッパーのスコープを拡張します。 Table1Mapper> Table1:inner-join:Table2 Table2がTable2Mapperデータをマップする独自のマッパーを持っていれば、もっと良いのではないでしょうか? 考えた場合Yes、Table1Mapperからレコードのリストを表示し、後でTable2Mapperを使用して、結合されるはずだったデータを取得したい場合は、ループでクエリを実行することになりますが、どちらも適切ではありません。 この方法について、どのような洞察がありますか? 別の方法は、サブテーブルを処理するようにマッパーを変更することですか? class Table1Mapper { public main_table = 'table1'; public sub_table1 = 'table2'; } これは問題ないと思いますが、マッパー全体のスコープがアプリケーション内の1つの特定のエンティティを処理するまでのみです。たとえばpostとpost_author。しかし、postおよびのようにスコープが異なる場合、gallery上記は理想的なデータマッパーを提供しません。これを説明するには class PostMapper { public table_name = 'tbl_post'; public gallery_table_name = 'tbl_gallery'; } 正しくありませんか?ただし、1つのクエリで1つの投稿のギャラリーを取得する必要があります。ループでクエリのオーバーヘッドを追加することは、優れたソリューションパフォーマンスではないためです。 このようなケースを処理するより良い方法がある場合、DataMapperパターンまたは他のパターンでこれを解決する正しい方法は何だと思いますか?

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

3
サービスレイヤーのあるリポジトリパターン-分離が多すぎますか?
リポジトリパターンを使用するMVCサイトがあります。MVCスタイルを十分に使用しているようには思えないので、その一部を再構築する準備をしています。しかし、私もそれを実行したいので、フロントエンドが変更された場合は、交換しやすくなります。 これが私が現在持っているものです モデル-一部のモデルには、エンティティ/クラスが直接含まれています。(ログインモデルにはCustomerクラスが含まれます。これは、Customerテーブル/リポジトリクラスと直接相関しています)ビュー-ビューの一部にリポジトリクエリが含まれています-つまり _customerRepo.Query().FirstOrDefault(c => c.Login == User.Identity.Name); コントローラー-ここではそれほど大きな問題ではありません。コントローラーはいくつかのレポクエリを呼び出します。一部のコントローラーはいくつかのサービスを使用してレポを呼び出します-すなわち _customerService.GetAllCustomers() 呼び出す _customerRepo.Query().All(); これが私の考えです。 1)モデルには、ビューに表示する必要があるデータのみを含める必要があります。Customerテーブル/オブジェクトのすべてのプロパティがビューに表示されている場合でも、ビューがデータベースアーキテクチャまたはバックエンドオブジェクトについて何も認識しないように、それらを独自のモデル/クラスに書き直す必要があります。 2)ビューはモデルオブジェクトにのみアクセスする必要があります 3)(そして、これは私がとるべき道に苦労しているところです) a)コントローラー(またはMVC側のどこか)は、repo / servicesから返されたオブジェクトデータを変換してモデルに変換するコードである必要があります。このコードをモデルコンストラクターに配置できると想定していますが、検証エラーがある場合に備えて、DIはデフォルトの空のコンストラクターを想定していることに気付きました b)コントローラは、データを取得するための適切な名前の付いたメソッド(つまり、_customerRepo.GetAllCustomers())でrepoインターフェースを呼び出します c)コントローラはサービス層にのみアクセスします。サービスレイヤーは、リポジトリレイヤーとやり取りする唯一のものです。 モデル、コントローラー、サービス、リポジトリのレイヤーを抽出しすぎていますか?サービスレイヤーはすべてリポジトリで実行できるため、オーバーヘッドが多すぎませんか? オブジェクト/ビジネスエンティティをモデルに変換するための推奨アプローチは何ですか?

2
レストデザイン-複数の呼び出しと1つの呼び出しですべてのデータを返す
AndroidアプリのREST APIを構築しようとしています。私が持っていると仮定usersして、テーブル(id, name, email)とsongsを持つテーブルを(id, song_name, album)、豊富なとして、それらの間の関連を参加しstreamsました(user_id, song_id, listen_count)。すべてのストリームの詳細を取得して、アプリにリストとして表示したい。リストには、曲名、アルバム名、ユーザー名、聴取数が表示されます。私は3つのもっともらしいオプションを見ます- GET/streamsすべてのリストフェッチsong_idsとをuser_ids。次に作るGETに/user/:idして/song/:id、ユーザーと曲の情報を取得するために、各ユーザと楽曲IDのために。 GET/streamsすべてのリストフェッチuser_idsとをsong_ids。次に、すべてのユーザーに関する情報を取得GETする/user?ids=<comma_separated_ids>ために1つ、すべての曲に関する情報を取得するGETためsong?ids=<comma_separated_ids>に1つ。 GET/streams1回の呼び出しですべてを取得します。何かのようなもの - [ { "user_id" : 10, "song_id" : 14, "listen_count" : 5, "user" : { "id" : 10, "name" : "bla", "email" : "bla", }, "song" : { "id" : 14, "name" : "blu", "album" : "blu" } }, …
8 rest 

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