ソフトウェア工学

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

3
サービス層はすべてのdao例外をキャッチし、それらをサービス例外としてラップする必要がありますか?
Dao、サービス、コントローラーの3つのレイヤーのSpring Webアプリがあります。コントローラーはdaoを直接呼び出すことはなく、サービス層を介して呼び出します。現時点では、ほとんどの場合、処理されないdao例外(ランタイム)があると、エンドユーザーにエラーメッセージを表示するJSPによってキャッチされます。サービス層はすべてのdao例外をキャッチし、それらをサービス例外としてラップする必要がありますか? try { daoInstance.someDaoMethod(); } catch(DataAccessException dae) { throw new ServiceException("message", dae); } ServiceExceptionもランタイムであり、どちらも処理されないと仮定しましょう。ServiceExceptionの代わりにDataAccessExceptionをスローするだけの違いはありますか?私は、プレゼンテーション層がデータアクセス例外を認識すべきでないと考えました。しかし、単にそれらをラップするだけで回復不能な例外をキャッチするポイントは見当たりません。

2
DDD集計のシリアル化のベストプラクティス
DDDによると、ドメインロジックは、シリアル化、オブジェクトリレーショナルマッピングなどの技術的な問題で汚染されるべきではありません。 それでは、ゲッターとセッターを介して公開することなく、集計の状態をどのようにシリアル化またはマッピングしますか?リポジトリの実装など、多くの例を見てきましたが、実際にはすべて、マッピングのエンティティと値オブジェクトのパブリックアクセサーに依存していました。 リフレクションを使用してパブリックアクセサーを回避することもできますが、これらのドメインオブジェクトはIMOで暗黙的にシリアル化の問題に依存します。たとえば、シリアル化/マッピングの設定を調整しないと、プライベートフィールドの名前を変更したり削除したりできませんでした。そのため、代わりにドメインロジックに焦点を当てる必要があるシリアル化を検討する必要があります。 ここで従うべき最良の妥協点は何ですか?パブリックアクセサーと一緒に住んでいますが、マッピングコード以外には使用しないでください。または、明らかな何かを見逃しただけですか? 私は、DDDドメインオブジェクト(エンティティと値オブジェクトで構成される集約)の状態をシリアル化することに明確に興味があります。これは、一般的なシリアル化や、ステートレスサービスが単純なデータコンテナオブジェクトで動作するトランザクションスクリプトシナリオではありません。

7
プロトタイピングのためにGPLライブラリを一時的に使用し、将来のコードをクローズドソースにすることはできますか?
私はソフトウェアシステムのプロトタイプを作成しています。これは(少なくとも最初は)クローズドソースになります。 時間を節約するために、GPLv3でライセンスされているライブラリを使用する(つまり静的にリンクする)ことを考えているので、設計をすばやくテストできます。この段階でソフトウェアを配布した場合、ソースコードも一緒に配布する必要があります。 そうしないが、システムが動作することを確認し、配布する前にGPLライブラリを自分のコードに置き換えたらどうなりますか?結果はGPLによって「汚染」されますか? 私は、GitライブラリーをGitの履歴に保持するかどうかが、違いを生む可能性があると感じています。

6
TDDでは、最初にTestまたはInterfaceを記述する必要がありますか?
私はテストが開発を促進する必要があることを知っている限り、c#を使用してTDDを学んでいます。つまり、最初にテストに合格するために最低限のコードを書いてからリファクタリングを行ってから失敗するテストを書きます。 しかし、「実装ではなく、インターフェイスするプログラム」とも言われているため、最初にインターフェイスを記述します。ここから混乱が始まります。最初にInterfaceを書いている場合、2つのことに違反しています。 インターフェイス用に記述されたコードはtestによって駆動されません。 単純なクラスでそれを書くことができるのは、明らかに最低限のものではありません。 インターフェースのテストを書くことから始めなければなりませんか?実装なしで何をテストするのですか? この質問がそれについて愚かに残念に思えるが、私は全く混乱しています。文字通りに物事を取っているかもしれません。
23 c#  unit-testing  tdd 

2
オンライン機能を備えた単体テストクラス
オンライン機能を必要とするプライベート機能を持つクラスの機能を単体テストするとき。それをどのようにテストしますか? 例えば: public class Foo { public int methodA() { int val = goOnlineToGetVal(); return val; } private int goOnlineToGetVal() { CloudService c = new CloudService(); int oval = c.getValueFromService(); return oval; } } 機能をテストする場合、「methodA()」は「goOnlineToGetVal()」を使用しようとしますが、このテストが機能なしで実行された場合、オンラインに移行しようとします。オンラインに接続せずに、どのように100%のクラスをカバーしますか

8
同じ値を2回返さないことが保証されている関数[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 これは私が就職の面接で尋ねられた質問であり、彼らが探していた答えがわからないので、私はここの誰かがいくつかのアイデアを持っていることを望んでいます。目標は、同じ値を2回返さないことが保証されている関数を作成することです。この機能は、複数のマシンから同時にアクセスされると仮定します。 私のアイデアは、各マシンに一意のIDを割り当て、その値を一意の値ジェネレーター関数に渡すことでした。 var i = 0; function uniq(process_id, machine_id) { return (i += 1).toString() + machine_id + "-" + process_id; } これにより、2つ以上のプロセスがの同じ値を読み取った場合でもi、各戻り値にプロセスIDとマシンIDの一意の組み合わせがタグ付けされるため、競合状態からのフォールアウトが回避されます。ただし、別のマシンをオンラインにするにはIDを割り当てる必要があるため、私のインタビュアーはこの回答を好みませんでした。 だから誰もこれを解決する別の方法を考えることができますか?それは一意のIDを持つように各マシンを構成することを必要としませんか?この質問が再び出てくる場合に備えて、回答が欲しいです。ありがとう。

6
マルチスレッド:間違っていますか?
私は音楽を再生するアプリケーションに取り組んでいます。 再生中は、同時に発生する必要があるため、多くの場合、別々のスレッドで発生する必要があります。例えば、一緒に聞くことにする和音必要のノートは、それぞれがで再生する独自のスレッドが割り当てられているので(編集明確にする:。呼び出しはnote.play()、ノートの再生が完了するまでスレッドをフリーズする、と私は3を必要とする理由です別々のスレッドで同時に3つのノートを聞くことができます。) このような動作は、音楽の再生中に多くのスレッドを作成します。 たとえば、短いメロディーと短いコード進行を伴う音楽を考えてみましょう。メロディ全体を1つのスレッドで再生できますが、進行には3つのスレッドが必要です。各コードには3つの音符が含まれているためです。 したがって、進行を再生するための擬似コードは次のようになります。 void playProgression(Progression prog){ for(Chord chord : prog) for(Note note : chord) runOnNewThread( func(){ note.play(); } ); } したがって、プログレッションには4つのコードがあり、3 notes * 4 chords * 2 times24スレッドを開くよりも2回コードを再生すると仮定します。そして、これは一度だけ再生するためのものです。 実際には、実際にはうまく機能します。顕著な遅延や、これに起因するバグに気付きません。 しかし、私はこれが正しい慣行なのか、それとも根本的に間違っているのかを尋ねたかったのです。ユーザーがボタンを押すたびに非常に多くのスレッドを作成するのは妥当ですか?そうでない場合、どうすれば異なる方法で行うことができますか?

7
スクラムでコードをランダムにリファクタリングできますか
バックグラウンド 私のチームはスクラムを使用しています 現在、タスクが割り当てられていません バックログに保留中のタスクはありません 今日は私のクライアントの労働者の日です。 今日やるべきことがあまりないので、作業中のプロジェクトで見続けるコードのリファクタリングを開始したかったのですが、現在、大規模なリファクタリングを行うためのスプリントタスクは割り当てられていません。 それはでOKですスクラム私はランダムに私が持っていると書かれていないいつも私を気にすることをが、理由は他の日の割り当てのそれを修正するために、他の日の時間を持っていないこと、コードをリファクタリング開始した場合? スプリントの間に余暇がある他の日はどうですか。 私は実際に継続的なリファクタリングを行い、それを信じています。私は常にストーリーを割り当てたときに作業しているコードの一部でそれを行いますが、それが現時点で作業しているものに現在関連していない他のコードはどうですか?

2
データ検証の設計パターン
この問題に最適な設計パターンは次のとおりです。 オブジェクトAがあります。オブジェクトAは、ユーザーの要求に応じてデータベースに登録または削除できます。 データの検証は、オブジェクトの登録または削除の前に実行されます。オブジェクトを登録する前にチェックするルールのセットと、削除する別のルールのセットがあります。これらのルールの一部は、両方の操作に共通です。 これまでのところ、Chain of Responsibilityのデザインパターンが最も適していると思いますが、実装に問題があります。

2
内部使用Webサイト:SQLiteに対して説得力のある事例はありますか?
FlaskやDjangoなどの多くのWebフレームワークは、デフォルトのデータベースとしてSQLiteを使用します。 SQLiteはPythonに含まれており、管理オーバーヘッドが非常に低いため、魅力的です。 ただし、トラフィックの多い公共の本番サイトのほとんどは、mySQL、Oracle、またはpostgresqlなどのより重いデータベースを使用しています。 質問: 仮定: サイトのトラフィックは中程度であり、データベースへの同時読み取り/書き込みアクセスが発生します SQLite書き込みロックでSQLAlchemyを使用します(ただし、このコメントは少し緊張しますが) データベースにはおそらく60,000レコードが含まれます データ構造は、より重いデータベースにある高度な機能を必要としません 中程度のトラフィックの社内企業ツールとして機能するWebサイトで、SQLiteの同時実行に対して説得力のある事例はありますか?もしそうなら、どのような条件がSQLiteに並行性の問題を引き起こしますか? 一般的な恐怖/根拠のない指差しではなく、既知の特定の根本原因を探しています。

2
Mozilla Public License(MPL 2.0)vs Lesser GNU General Public License(LGPL 3.0)
私はで書かれたソフトウェアライブラリ解除したいクラスベースのオブジェクト指向プログラミング言語で(Java)のWebベースのソースコードホスティングサービス事業のフォークをすることができ、メインプロジェクトにマージプル経由(GitHubのをリクエスト)。私はウェブで調査し、ソフトウェアのライセンス方法について多くのことを考えました。(IANALの観点から)次の仮定は正しいですか? LGPLとMPLはどちらも、他のソフトウェアプロジェクト内で使用されているLGPL / MPLライセンスソフトウェアの変更の共有を促進します。変更されたライブラリのユーザーにライブラリの別のフォークをホストするように要求する代わりに、元のライブラリへの貢献を促進することができます(たとえばプル要求を介して)。 主な違いは、MPL / LGPLライセンスコードをプロジェクトにリンクする方法です。MPLソースコードファイルを直接(おそらく)プロプライエタリソフトウェアプロジェクト(にコピーすることができます静的リンク LGPLのコードをしなければならないライセンスを受けながら、)動的にリンクされた緩く、おそらく独自のソフトウェアプロジェクトにリンクされている(ので、エンドユーザーは、ライセンスされたソフトウェアを切り替えることができ、ライセンスソフトウェアライブラリの別のバージョンのライブラリ)。 動的リンク、したがってLGPL は、静的リンケージ(つまりMPL)を使用するよりもオープンソースソフトウェアライブラリへの貢献を促進することなく、独自のソフトウェア製品をパッケージ化するための特別な障害を課します。静的リンクを許可する変更されたLGPLがあります。 その他の関連する違いはありません(IANALの観点から)。 古いライセンスのバージョンが最新のものとして良いとして私のニーズに合いません。 ご覧のとおり、私が主に求めているのは、ソフトウェアライブラリの修正が一般の人々にとって有用であることが証明され、プロプライエタリ製品でのソフトウェアライブラリの使用に制限を課すことなく、オープンソースのままであるということです。 また、必要なことはライセンスがありません拡張として、オープンソースとしてリリースされるオリジナル作品に関連するソフトウェアライブラリのを、関連する用語の範囲を任意に小さくすることができ/巨大な、これできないことをGPLとして終わるには、プロプライエタリ製品で使用されます(ソース全体をリリースすることなく)。 変更されたLPGLを使用したいのですが、その反面、不人気のためにがっかりしています。上記の点に基づいて、私はMPLを好みます。 質問:上記の記述は正しいですか?要件を考慮して、どのライセンスを選択する必要がありますか? 解決策:受け入れられた答えの議論の助けを借りて、人気、リンクの自由、および公式の無修正ライセンスであるため、MPLに固執することを選択します。

4
npmのオプションの依存関係?
これと似たような質問がありますが、まったく同じではありません。 私のアプリのユーザーは、使用したい方法に必要な依存関係でアプリをインストールしたいと思います。そのため、たとえば、MongoDBに永続化する場合はMongo関連のライブラリのみがインストールされますが、Redisに永続化する場合はRedis関連のライブラリのみがインストールされます。使用しないライブラリをダウンロードしてインストールさせたくありません。 を使用して開発目的でそれを行うことができることは知っていますがdevDependencies、これはそれよりもさらに進んでいます。上記の質問の答えが示すように、これはPython setuptools extras_requireとClojureのleiningenプロファイルにより密接に関連しています。npmでそのようなことはありますか?依存関係を指定するより汎用性の高い方法のプロファイルにdevDependenciesすべきだと本当に思いdevます。

4
この単純なXOR暗号化通信は完全に安全ですか?
アリスとピーターにはそれぞれ4GBのUSBフラッシュメモリスティックがあるとします。ランダムに生成されたビットを含むalice_to_peter.key(2GB)およびpeter_to_alice.key(2GB)という名前の2つのファイルを両方のスティックに保存します。二度と会うことはありませんが、電子的に通信します。また、Aliceはという変数を維持し、alice_pointerPeterはという変数を維持peter_pointerします。どちらも最初はゼロに設定されています。 アリスがピーターにメッセージを送信する必要がある場合、アリスnは次のことを行います(メッセージのn番目のバイトは次のとおりです)。 encrypted_message_to_peter[n] = message_to_peter[n] XOR alice_to_peter.key[alice_pointer + n] encrypted_payload_to_peter = alice_pointer + encrypted_message_to_peter alice_pointer += length(encrypted_message_to_peter) (そして最大限のセキュリティのために、キーの使用済み部分は消去できます) Peterはencrypted_payload_to_peter、alice_pointerメッセージの最初に格納された読み取りを受け取り、実行します。 message_to_peter[n] = encrypted_message_to_peter[n] XOR alice_to_peter.key[alice_pointer + n] また、最大限のセキュリティを確保するために、メッセージを読んだ後、キーの使用済み部分も消去します。 -編集:実際、この完全なチェックと認証のないこの単純なアルゴリズムのステップはセキュリティを低下させます。以下のPaŭloEbermannの投稿を参照してください。 ピーターがアリスにメッセージを送信する必要があるとき、彼らは今度はとで逆をpeter_to_alice.key行いpeter_pointerます。 この簡単なスキーマを使用すると、今後50年間、毎日2GB /(50 * 365)=〜115kBの暗号化データを双方向に送信できます。より多くのデータを送信する必要がある場合、たとえば、今日の2TB HD(1TBキー)を使用すると、より大きなキーを使用でき、今後50年間で60MB /日を交換できます。これは実際には大量のデータです。たとえば、圧縮を使用すると、1時間以上の高品質の音声通信になります。 攻撃者がキーなしで暗号化されたメッセージを読む方法はないようです。なぜなら、彼らが無限に高速なコンピューターを持っているとしても、総当たりで彼らはすべての可能なメッセージを制限の下で得ることができますが、これは天文学的な数字ですメッセージの数と攻撃者は、それらのどれが実際のメッセージであるかを知りません。 私は正しいですか?この通信方式は本当に安全ですか?また、安全な場合、独自の名前を持っていますか?XOR暗号化はよく知られていますが、両側で大きなキーを使用するこの具体的な実用的なアプリケーションの名前を探していますか?私はこのアプリケーションが私の前に誰かによって発明されたことを謙虚に期待しています。:-) 注:完全に安全であれば、驚くべきことです。今日の低コストの大容量ストレージデバイスでは、高価な量子暗号より安全な通信を行う方がはるかに安価であり、同等のセキュリティを備えているからです! 編集: これは、ストレージコストが減少するので、将来的にはより実用的になると思います。安全な通信を永遠に解決できます。今日、誰かが1年後でも既存の暗号を正常に攻撃し、しばしば高価な実装を安全でないものにするかどうかは確実ではありません。通信が発生する前の多くの場合、双方が個人的に会うとき、それが鍵を生成する時です。たとえば、大きなキーを持つHDを持つことができる潜水艦間の軍事通信に最適だと思います。また、軍の中央は各潜水艦にHDを持つことができます。アカウントを作成するときに銀行などと会うため、銀行口座を管理するなど、日常生活でも実用的です。

4
データ指向設計-1-2を超える構造の「メンバー」では非実用的ですか?
データ指向設計の通常の例は、ボール構造です。 struct Ball { float Radius; float XYZ[3]; }; そして、彼らはstd::vector<Ball>ベクトルを繰り返すアルゴリズムを作ります。 次に、同じことを提供しますが、データ指向設計で実装されます。 struct Balls { std::vector<float> Radiuses; std::vector<XYZ[3]> XYZs; }; 最初にすべての半径で、次にすべての位置などで反復する場合、これは良いことです。ただし、ベクター内のボールをどのように移動しますか?元のバージョンでは、を持っている場合std::vector<Ball> BallsAll、any BallsAll[x]をanyに移動できますBallsAll[y]。 ただし、データ指向バージョンでこれを行うには、すべてのプロパティに対して同じことを行う必要があります(ボールの場合は2回-半径と位置)。しかし、より多くのプロパティがある場合は悪化します。「ボール」ごとにインデックスを保持する必要があり、それを移動しようとすると、プロパティのすべてのベクトルで移動する必要があります。 それは、データ指向設計のパフォーマンス上の利点を損なうものではありませんか?

6
Androidでデータを同期するための設計
ほとんどのアプリでサーバーとクライアント間でデータを同期するための2つの実装を見てきました。これは、GCMがセットアップされていないことを前提としています: ネットワークからデータをダウンロードしてデータベースに保存するインテントサービスを定期的に実行します。 定期的に実行される同期アダプターの実装。 上記のどれをアプリに含めることをお勧めしますか?その理由は何ですか?

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