ソフトウェア工学

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

2
統合テストではモックを使用しますか?
私は現在、学期プロジェクトのために、単体テストや統合テストなど、複数のタイプのテストを実行する必要があるソフトウェアテストのクラスにいます。統合テストの場合、教授は統合テストにモックとモック作成ライブラリ(EasyMockやMockitoなど)を使用すると言いました。私はかなり混乱しています。統合テストとは、クラス、モジュール、サービスなどの外部をテストすることです。複数のクラスとサービスをテストする場合、統合テストでモックとスタブを使用するのが適切なのはなぜですか?

3
承認は階層化アーキテクチャのどこに適合しますか?
通常、サーバー側のコントローラーに承認の決定を下します。これらは最近RESTfulエンドポイントになりましたが、MVCタイプのアーキテクチャも同じものだと思います。議論のために、それは役割ベースの承認であると仮定します。保護されたメソッドには注釈が付けられるか、チェックが行われ、必要に応じて403が返されます。 さて、承認が実際にはビジネスルールであることを考えると、たとえば「管理者だけがXをリストできる」ということを考えると、私は彼らがレイヤーを押し下げられるべきだと考えています。コントローラーがビジネスレイヤーに操作の実行を要求すると、サービスまたはビジネスレイヤーは、コントローラーに許可されていないことを通知します。 これは合理的なアプローチですか?これには欠点はありますか? これを行うための静的な手続き型のコード化されたルールを本質的に保持するAuthorisationServiceがあるのは嫌ですが、すべてのアクセスロジックを1か所に保持することは理にかなっています。それは別々に保たれるべき横断的な関心事ですか? だから私は誰かがこれをやったかどうか、彼らがそれをどのようにきれいに達成したか、または私が読むことができる良いリソースがあるかどうかを尋ねています。Java fwiwを使用していますが、これは言語に依存しない質問です。 ここで関連する質問を確認しましたが、それらは非常に薄いので、答えはありません。例:ドメインモデルでの検証と承認、およびサービスレイヤーを介したMVCへの実行 私は春のセキュリティ文書を読んでいますが、それは横断的な関心事であるといくつかの良い議論をしていますが、それは単なる「春の道」であり、より広い視野が欲しいと心配しています。また、アプリケーションを特定のフレームワークに結び付けます。

2
ビルダーが独自のクラスファイルではなく内部クラスである必要があるのはなぜですか?
多くのBuilder Pattern例では、Builderビルドするオブジェクトの内部クラスを作成しています。 これは、Builderビルドの内容を示すため、ある程度意味があります。ただし、静的に型付けされた言語では、Builderビルドの内容がわかります。 一方、Builderが内部クラスである場合、の内部を見ずにビルドするクラスを知る必要BuilderがありBuilderます。 また、ビルダーを内部クラスとして使用すると、外部クラスから参照できるため、インポートの数が減ります(気になる場合)。 そして、がBuilder同じパッケージ内にあるが、のような内部クラスではない実用的な例がありStringBuilderます。あなたはそれがそう名付けられているので、構築するBuilder 必要があることを知っていStringます。 そうは言ってもBuilder、内部クラスを作成する理由として考えられる唯一の正当な理由は、クラスのBuilder名前を知らず、命名規則に依存せずにクラスが何であるかを知っているということです。たとえば、もし私がStringBuilder内部クラスだったStringとしたら、おそらく私がそれよりも早く存在したことを知っていただろう(投機的) Builder内なるクラスにする他の理由はありますか、それとも単に好みと儀式に帰着しますか?

6
SQLからNoSQLに移行すると、どのサイズのデータ​​で有益になりますか?
リレーショナルデータベースプログラマーとして(ほとんどの場合)、リレーショナルデータベースがどのようにスケールしないか、MongoDBなどのNoSQLソリューションがどのようにスケールするかについての記事を読みました。これまでに開発したデータベースのほとんどは小規模から中規模であったため、インデックス作成、クエリの最適化、またはスキーマの再設計によって解決されなかった問題は一度もありませんでした。 MySQLはどのようなサイズに苦しんでいると予想されますか。何行ですか? (これはアプリケーションと保存されるデータの種類に依存することを知っています。基本的には遺伝学データベースだったので、3つまたは4つのルックアップテーブルを持つ1つのメインテーブルがあります。メインテーブルには、他のもの、染色体参照、および位置座標。おそらく、そこに保存されているものを確認するために、染色体上の2つのポーション間の多くのエントリを照会されます。

8
一般に、文字列キーの使用が一般に悪い考えと見なされるのはなぜですか?
これはしばらくの間私を悩ませてきました。ほとんどの場合、ハッシュテーブル、プログラマ、書籍、記事などの構造にデータを保存する場合、文字列値による構造内の要素のインデックス付けは悪い習慣と見なされます。しかし、これまでのところ、それが悪い習慣であると考えられる理由を説明するための単一のそのような情報源を見つけていません。プログラミング言語に依存していますか?基礎となるフレームワーク上で?実装について 役立つ場合は、2つの簡単な例を挙げます。 行がString主キーによってインデックス付けされるSQLのようなテーブル。 キーが文字列である.NET辞書。

5
ORMロジックをカプセル化するためのリポジトリパターンの代替手段
ORMを切り替える必要がありましたが、クエリロジックが至る所でリークしていたため、それは比較的困難な作業でした。新しいアプリケーションを開発する必要があった場合、個人的な好みは、すべてのクエリロジックを(ORMを使用して)カプセル化して、変更に対する将来性を保証することです。リポジトリパターンはコーディングと保守が非常に面倒なので、問題を解決する他のパターンがあるかどうか疑問に思っていましたか? 実際に必要になる前に余分な複雑さを追加しないこと、アジャイルであることなどについての投稿を予見できますが、私は既存のパターンが同様の問題をより簡単な方法で解決することにのみ興味があります。 私が最初に考えたのは、必要に応じて拡張メソッドを介して特定のタイプリポジトリクラスにメソッドを追加する汎用タイプリポジトリを使用することでしたが、静的メソッドのユニットテストは非常に苦痛です。IE: public static class PersonExtensions { public static IEnumerable<Person> GetRetiredPeople(this IRepository<Person> personRep) { // logic } }

6
一度だけ使用する場合、文字列定数を定義する必要がありますか?
Xaxを使用してアプリケーションのデータモデルにアクセスできるようにするJaxen(JavaのXPathライブラリ)のアダプターを実装しています。 これは、文字列(Jaxenから渡された)をデータモデルの要素にマップするクラスを実装することによって行われます。合計で1000以上の文字列比較を行う約100のクラスが必要になると推定されます。 これを行う最良の方法は、各文字列を定数として定義するのではなく、コードに直接書き込まれた文字列を使用したif / elseステートメントを単純にすることだと思います。例えば: public Object getNode(String name) { if ("name".equals(name)) { return contact.getFullName(); } else if ("title".equals(name)) { return contact.getTitle(); } else if ("first_name".equals(name)) { return contact.getFirstName(); } else if ("last_name".equals(name)) { return contact.getLastName(); ... ただし、文字列値をコードに直接埋め込むのではなく、文字列定数を作成することを常に教えられました。これは次のようになります。 private static final String NAME = "name"; private static final String TITLE …

5
REST APIはコマンド/アクションベースのドメインにどのように適合しますか?
この記事の著者は、 時には、本質的にRESTfulではない操作をAPIで公開する必要があります。 そしてそれ APIのアクションが多すぎる場合は、RESTful原則を使用するのではなくRPCの観点で設計されているか、問題のAPIがRPCタイプモデルにより適していることを示しています。 これは、他の場所でも読んだり聞いたりしたことを反映しています。 しかし、これは非常に紛らわしいと思うので、問題をよりよく理解したいと思います。 例I:RESTインターフェースを介してVMをシャットダウンする VMのシャットダウンをモデル化するには、根本的に異なる2つの方法があると思います。それぞれの方法にはいくつかのバリエーションがありますが、ここでは最も基本的な違いに集中しましょう。 1.リソースの状態プロパティにパッチを適用します PATCH /api/virtualmachines/42 Content-Type:application/json { "state": "shutting down" } (または、PUTサブリソース上/api/virtualmachines/42/state。) VMはバックグラウンドでシャットダウンし、シャットダウンが成功するかどうかに応じて、後のある時点で状態が「電源オフ」で内部的に更新される可能性があります。 2.リソースのアクションプロパティのPUTまたはPOST PUT /api/virtualmachines/42/actions Content-Type:application/json { "type": "shutdown" } 結果は、最初の例とまったく同じです。状態はすぐに「シャットダウン」に更新され、最終的には「電源オフ」に更新されます。 どちらのデザインもRESTfulですか? どちらのデザインが優れていますか? 例II:CQRS 複数の集約の更新につながる可能性のある、または具体的なリソースとサブリソースのCRUD操作にマッピングできない「アクション」(別名コマンド)が多数あるCQRSドメインがある場合はどうなりますか? 具体例で可能な限り多くのコマンドを具体的なリソースで作成または更新し(例Iの最初のアプローチに従って)、残りの部分に「アクションエンドポイント」を使用してみてください。 または、すべてのコマンドをアクションエンドポイントにマッピングする必要があります(例Iの2番目のアプローチのように)。 どこで線を引きますか?設計のRESTful性が低下するのはいつですか? CQRSモデルは、APIのようなRPCにより適していますか? 上記の引用テキストによると、私が理解しているとおりです。 私の多くの質問からわかるように、このトピックについて少し混乱しています。それをよりよく理解するのを手伝ってもらえますか?

8
ブール値を「true」、「false」、およびトグルする用語はありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 去年閉鎖されました。 技術会議でコードを説明しようとしているとしましょう。 まず、ブール値foobarをtrue そして 次に、ブール値foobarをfalse 少し冗長です。foobar切り替えられた場合、おそらく言うことができます、 第三に、トグル foobar ここでの含意を通して、あなたはそのブール値を知っています。だから私はできるはずがない: 第四に、私はfoob​​ar を真理化する そして 5番目に、foob​​ar を偽造します また、暗黙のうちに、リスナーにブール変数を処理していることを伝えますか?これに適切な用語はありますか?ありがとう。


6
初心者:操作が出力コマンドに含まれないのはなぜですか?
私はプログラミングの入門書を読んでいますが、擬似コードで簡単な例をリストしています: Start input myNumber set myAnswer = myNumber * 2 output myAnswer Stop 次のように呼ばれる別の変数の作成を省略してmyAnswer、単に操作を出力コマンドに入れることができないのはなぜですか? Start input myNumber output myNumber * 2 Stop 前者は正しいのに、後者は正しくないのはなぜですか?

6
このアーキテクチャでOOPプラクティスを破っていますか?
Webアプリケーションがあります。テクノロジーが重要だとは思わない。構造は、左の画像に示されているN層アプリケーションです。3つの層があります。 UI(MVCパターン)、ビジネスロジックレイヤー(BLL)およびデータアクセスレイヤー(DAL) 私が抱えている問題は、ロジックとアプリケーションイベントコールを介したパスがあるため、BLLが非常に大きいことです。 アプリケーションの一般的なフローは次のとおりです。 UIで発生したイベントは、BLLのメソッドにトラバースし、ロジック(おそらくBLLの複数の部分で)を実行し、最終的にDALに戻り、BLLに戻り(さらにロジックが高い場合)、UIに値を返します。 この例のBLLは非常に忙しいため、これを分割する方法を考えています。また、ロジックとオブジェクトが組み合わされており、それらは好きではありません。 右側のバージョンは私の努力です。 ロジックは依然としてアプリケーションがUIとDALの間を流れる方法ですが、おそらくプロパティはありません...メソッドのみ(このレイヤーのクラスの大部分は、状態を格納しないため、静的である可能性があります)。Pocoレイヤーは、プロパティ(名前、年齢、身長などが存在するPersonクラスなど)を持つクラスが存在する場所です。これらはアプリケーションのフローとは関係なく、状態のみを保存します。 フローは次のとおりです。 UIからトリガーされ、UIレイヤーコントローラー(MVC)にデータを渡します。これにより、生データが変換され、pocoモデルに変換されます。その後、pocoモデルはLogicレイヤー(BLL)に渡され、最終的には途中で操作される可能性のあるコマンドクエリレイヤーに渡されます。コマンドクエリレイヤーは、POCOをデータベースオブジェクトに変換します(ほぼ同じものですが、1つは永続化用に設計され、もう1つはフロントエンド用に設計されています)。アイテムが保存され、データベースオブジェクトがコマンドクエリレイヤーに返されます。その後、POCOに変換され、そこでロジックレイヤーに戻り、さらに処理され、最後にUIに戻される可能性があります 共有ロジックとインターフェイスは、MaxNumberOf_XやTotalAllowed_Xなどの永続データとすべてのインターフェイスを保持する場所です。 共有ロジック/インターフェイスとDALの両方が、アーキテクチャの「ベース」です。これらは外の世界について何も知りません。 共有ロジック/インターフェースとDAL以外のすべてがpocoについて知っています。 フローはまだ最初の例と非常によく似ていますが、各レイヤーが1つのこと(状態、フロー、その他)に責任を負います...しかし、このアプローチでOOPを壊していますか? LogicとPocoをデモする例は次のとおりです。 public class LogicClass { private ICommandQueryObject cmdQuery; public PocoA Method1(PocoB pocoB) { return cmdQuery.Save(pocoB); } /*This has no state objects, only ways to communicate with other layers such as the cmdQuery. Everything else is just …

8
Lie 2:コードは世界のモデルを中心に設計すべきですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた3年前。 最近、Three Big Liesのブログ投稿を読みましたが、2番目の嘘を正当化するのに苦労しています。 (嘘#2)コードは世界のモデルの周りに設計されるべきである コードが架空の世界の何らかのモデルまたはマップであることには価値がありません。一部のプログラマにとってこれがなぜこれほど魅力的であるかはわかりませんが、非常に人気があります。ゲームにロケットがある場合は、「ロケット」クラス(コードはC ++であると仮定)があり、これには1つのロケットのデータのみが含まれ、ロケットのような処理を行うことをご安心ください。どのデータ変換が実際に行われているか、またはデータのレイアウトはまったく考慮されません。または、1つのことはどこにあるのかという基本的な理解がなければ、おそらく複数あります。 この種の設計には多くのパフォーマンス上のペナルティがありますが、最も重要なことは、スケーリングしないことです。まったく。ロケット100個のコストは、ロケット1個の100倍です。そして、それ以上の費用がかかる可能性が非常に高いです!プログラマーでなくても、それは意味をなさないはずです。規模の経済。何かがもっとあるなら、それはもっと高くなくて、より安くなるはずです。そして、それを行う方法は、データを適切に設計し、同様の変換によって物事をグループ化することです。 特にこの嘘に関する私の問題はここにあります。 想像上の世界をモデル化することは、コードを視覚化して整理するのに役立つので、仮想的な世界のモデル/マップであるコードには価値があります。 「ロケット」クラスを持つことは、私にとって、クラスにとって完全に有効な選択です。「ロケット」は、AGM-114ヘルファイアなどのタイプのロケットに分類できます。これには、ペイロードの強度、最大速度、最大旋回半径、ターゲットタイプなどが含まれますが、発射されるすべてのロケットには位置が必要ですそして速度。 もちろん、100個のロケットを所有するには1ロケット以上かかります。画面上に100個のロケットがある場合、それらの位置を更新するには100個の異なる計算が必要です。2番目の段落は、100個のロケットがある場合、状態を更新するのに100未満の計算コストが必要だと主張しているように聞こえますか? ここでの私の問題は、著者が「欠陥のある」プログラミングモデルを提示しているが、それを「修正」する方法を提示していないことです。おそらく、ロケットクラスの類推につまずいているかもしれませんが、この嘘の背後にある理由を本当に理解したいと思います。代替手段は何ですか?

3
C#では、なぜtryブロック内で宣言された変数のスコープが制限されていますか?
エラー処理を追加したい: var firstVariable = 1; var secondVariable = firstVariable; 以下はコンパイルされません: try { var firstVariable = 1; } catch {} try { var secondVariable = firstVariable; } catch {} 他のコードブロックが行うように、try catchブロックが変数のスコープに影響を及ぼす必要があるのはなぜですか?一貫性を別にして、リファクタリングなしでコードをエラー処理でラップできるのは理にかなっていますか?

3
isPresent()を呼び出さずにOptional.get()が悪いのに、iterator.next()が悪いのはなぜですか?
新しいJava8ストリームAPIを使用してコレクション内の特定の要素を検索する場合、次のようなコードを記述します。 String theFirstString = myCollection.stream() .findFirst() .get(); ここで、IntelliJは、isPresent()を最初にチェックせずにget()が呼び出されることを警告しています。 ただし、このコード: String theFirstString = myCollection.iterator().next(); ...警告は表示されません。 ストリーミングアプローチを何らかの方法でより「危険」にし、最初にisPresent()を呼び出さずにget()を呼び出さないことが重要であるという2つの手法の間に大きな違いがありますか?いろいろと調べてみると、Optional <>でプログラマーが不注意である方法についての記事を見つけ、いつでもget()を呼び出すことができると仮定しています。 つまり、コードがバグのある場所にできるだけ近い場所で例外をスローするのが好きです。この場合は、要素が見つからないときにget()を呼び出しています。次のような役に立たないエッセイを書く必要はありません。 Optional<String> firstStream = myCollection.stream() .findFirst(); if (!firstStream.isPresent()) { throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>"); } String …
23 java8 

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