ソフトウェア工学

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

1
MongoDBデータベースのスキーマ図を表すにはどうすればよいですか?
スキーマ設計を適切に文書化したいMongoDBデータベースがあります。MongoDBはNoSQLデータベースであり、本質的にスキーマレスであることを知っていますが、アプリケーションを通じてスキーマを強制し、findOne()結果の印刷よりも優れた方法でスキーマを表現したいと考えています。 私は多くの人がERまたはUMLを使用しているのを見ていますが、私のNoSQLデータベースをリレーショナルDBとして表すのは概念的に正しいとは思えません。少なくとも、奇妙に見えます。 UMLを使用した例:MongoDB:論文でスキーマ図を表す方法は? 人々は異なるモデルを使用していると思いました。私が検索したところ、スキーマを理解するための素晴らしいTreeビューを提供するMongoVUEがありましたが、プリンターには適していません。 NoSQLの世界で他に見逃しているものはありますか?または、私は休んで伝統的なUMLに固執するべきですか?

4
統合テストの名前の選択
単体テストを使用すると、ドメインが非常に小さくなるため、簡単です。私はオセロベのmethodName_conditions_result()スキームを使用しましたが、それは非常に明確でした。 しかし、統合テストでは、非常に長い名前になると思いmethodNameます。代わりに何を入れますか?統合テストクラスに名前を付けるにはどうすればよいですか? 統合テスト名の実際の例は大歓迎です。答えがこれらのテストをよりよく理解するのにも役立つことを願っています。

2
Logger.getLogger(MyClass.class)は、log4jロガーを初期化する最良の方法ですか?
このMkyongチュートリアルでは、ロガーを次のように初期化することを提案しています。 @Controller public class WelcomeController { private static final Logger logger = Logger.getLogger(WelcomeController.class); // etc } 今、おそらくあなたが使用する他のすべてのクラスには、ロガーがあり、同じようにロガーを初期化します。 私の質問は-これはそれを行うための最良の方法ですか?それは...繰り返しのようです。
13 java  logging 

8
ストリームとキューの違いは何ですか?
ストリームとキューの違いは何ですか?どちらも要素の順序付けされたセットの概念を持っていますが、「挿入」/「抽出」(ストリーム)と「エンキュー」/「デキュー」(キュー)の実装やボキャブラリが異なる傾向があります。これらは交換可能ですか?彼らは異なる概念やパターンを提案していますか?もしそうなら、違いは何ですか?

4
ヌル結合演算子を使用したヌルオブジェクトのインスタンス化
次の典型的なシナリオを検討してください。 if(myObject == null) { myObject = new myClass(); } null合体演算子を使用した次の置換についてはどう思われますか? myObject = myObject ?? new myClass(); 2番目のフォームを使用する必要があるかどうかはわかりません。それはいい速記のmyObject = myObjectように思えますが、最初の構造は少しコード臭いのようです。 これは合理的なことですか、それとも私が見逃しているより良い略記ですか?または、「3行です、乗り越えてください!」 編集:前述したように、おそらくこれを典型的なシナリオと呼ぶのは誇張の言葉です。私は通常、まだ参照されている場合とされていない場合がある子参照型プロパティを持つデータベースからエンティティを取得するときに、この状況に遭遇することを発見します。 myClass myObject = myClassService.getById(id); myObject.myChildObject = myObject.myChildObject ?? new myChildClass();
12 c#  operators 

4
sizeofがコンパイル時演算子と呼ばれるのはなぜですか?
もともと、これは別の質問の一部です。 sizeofコンパイル時演算子と呼ばれるのはなぜですか?それは実際には実行時演算子ではありませんか?そして、それが実際にコンパイル時の演算子である場合、異なるコンピューターで同じものを実行する移植可能なコードを生成するのにどのように役立ちますか?詳しく説明してください。
12 c++ 

2
ストリームマニピュレータ(endl)または改行エスケープ文字(\ n)を使用していますか?
質問している特定のコンテキストはありませんが、C ++の初心者向けの本を読んでいるときに、ストリームオブジェクトを処理するときにendlストリームマニピュレーターと改行エスケープ文字の両方を使用していることに気付きました。 例は次のとおりです。 cout << "Hello World" << endl; cout << "Hello World\n"; 私の質問は: 特定の状況でストリームマニピュレーター(endl)を使用し、別の状況でエスケープ文字を使用する方が適切ですか? 2つのうちの1つを使用するのが賢明な効率上の欠点はありますか? それらは完全に交換可能ですか? エスケープシーケンスは単一の文字としてメモリに格納されることを読みました。それは、低メモリ消費のためにendlを使用することがより適切であることを意味しますか? ストリームマニピュレータはメモリを使い果たしますか? おかげで、StackExchangeが間違ったセクションにこれを投稿した場合、データ構造としてカウントされると思いました。

6
デフォルト値-それらは良いですか、悪いですか?
一般的なデフォルト値に関する質問-デフォルトの戻り関数値、デフォルトのパラメーター値、欠落している場合のデフォルトのロジック、例外を処理するためのデフォルトのロジック、エッジ条件を処理するためのデフォルトのロジックなど 長い間、私はデフォルト値を「純粋な悪」なものだと考えていました。これは「大惨事を覆い隠し」、バグを見つけるのが非常に難しいものです。しかし最近、デフォルト値をある種の技術的負債として考えるようになりました...これはまっすぐに悪いことではありませんが、「短期資金」を提供してプロジェクトを生き残ることができます住宅ローンを出さずに家を買う?)。 私が「短期」と言うとき-私は意味しません-「最初に何かを迅速に行い、後でプロダクションにヒットする前にそれをリファクタリングします」。いいえ-実稼働ソフトウェアのハードコードされたデフォルト値に依存することについて話している。確かに-それはいくつかの問題を引き起こす可能性がありますが、それが一年で単一のトラブルを引き起こすだけならどうでしょう。 繰り返しますが、ここでは「平均的な」メインストリームソフトウェア(原子力発電所のソフトウェアではありません)について話しています。平均的なWebサイトまたは会計ソフトウェアのUIアプリケーションです。 。 繰り返しになりますが、私の経験から、ビジネスユーザーは完璧なソフトウェアを待つのではなく、「何らかの形で機能する」ソフトウェアを使いたいと考えています。また、RADスタイルのソフトウェアを開発する場合、デフォルト値の使用は非常に役立ちます。しかし、再び-私が費やした最長のデバッグセッションは、途中で「デフォルト」でなくなったデフォルト値によって導入されたバグ、または小さなサブシステムが最近アップグレードされたため、このアップグレードの結果ではありませんデフォルトを正しく処理します(たとえば、空のリストとnull、またはnullの文字列と空の文字列)。 だから私の質問は-デフォルト値は良いか悪いかです。そして、それらが技術的負債である場合-返済を支払う余裕があるように、どのくらい借りることができるかをどのように測定しますか? どんな入力でも本当に感謝します。 乾杯。 編集: 開発中にコーナーをカットする方法としてデフォルト値を使用している場合-コーナーのカットによりバグや問題が発生する場合-これらの問題から回復する方法は何ですか?

3
呼び出しが高価な場合にPythonで単一責任原則(SRP)を使用する
いくつかのベースポイント: Pythonのメソッド呼び出しは、その解釈された性質により「高価」です。理論的には、コードが十分に単純な場合、Pythonコードの分解は、読みやすさと再利用に加えてマイナスの影響を及ぼします(これは、ユーザーにとってはそれほどではなく、開発者にとって大きな利益です)。 単一責任原則(SRP)は、コードを読み取り可能に保ち、テストと保守が容易です。 プロジェクトには、読み取り可能なコード、テスト、および時間パフォーマンスが必要な特別な種類の背景があります。 たとえば、いくつかのメソッド(x4)を呼び出すこのようなコードは、次のメソッド(1つ)よりも低速です。 from operator import add class Vector: def __init__(self,list_of_3): self.coordinates = list_of_3 def move(self,movement): self.coordinates = list( map(add, self.coordinates, movement)) return self.coordinates def revert(self): self.coordinates = self.coordinates[::-1] return self.coordinates def get_coordinates(self): return self.coordinates ## Operation with one vector vec3 = Vector([1,2,3]) vec3.move([1,1,1]) vec3.revert() vec3.get_coordinates() これと比較して: from …

4
階層化ソフトウェアアーキテクチャの同じ層のオブジェクト間に依存関係があることは問題ですか?
n層アーキテクチャと依存性注入を備えた中規模のソフトウェアを考えると、ある層に属するオブジェクトは下位層のオブジェクトに依存することができますが、上位層のオブジェクトには決して依存しないと言えます。 しかし、同じレイヤーの他のオブジェクトに依存するオブジェクトについてどう考えるべきかわかりません。 例として、3つのレイヤーと画像内のオブジェクトのような複数のオブジェクトを持つアプリケーションを想定してみましょう。明らかに、トップダウンの依存関係(緑の矢印)は問題ありませんが、ボトムアップ(赤い矢印)は問題ありませんが、同じレイヤー内の依存関係(黄色の矢印)はどうでしょうか。 循環依存関係を除き、発生する可能性のある他の問題と、この場合に階層化アーキテクチャがどれだけ違反されているかについて興味があります。

2
派生クラスが生の動的メモリを割り当てない場合、なぜ基本クラスに仮想デストラクタが必要なのですか?
次のコードはメモリリークを引き起こします。 #include <iostream> #include <memory> #include <vector> using namespace std; class base { void virtual initialize_vector() = 0; }; class derived : public base { private: vector<int> vec; public: derived() { initialize_vector(); } void initialize_vector() { for (int i = 0; i < 1000000; i++) { vec.push_back(i); } } }; …

5
私のチームは、外部キー関係を持つリレーショナルデータベースエンティティが怖いので、理由がわかりません
私は比較的大学を卒業していないので、リレーショナルデータベースに関する私の知識のほとんどは、BCNFまたは3NFにないものはすべてわいせつである私のデータベースコースからのものです。確かにそれは極端なことの一端ですが、仕事中の私のチームは本当にそれを完全に反対側に持っているようです。 マイクロサービスdbスキーマでは、エンティティが複数のテーブルを持つことはめったにありません。通常、別のテーブルに正規化するものはすべてjson列に格納されます。このjsonのプロパティの1つをクエリする必要があることが後で発見された場合、新しい列が追加され、データは両方の場所(はい、同じテーブルの2つの異なる列)に保存されます。 多くの場合、これらのjson列には間違いなく利点があります。そのデータを照会する必要がなく、そのデータに一方的な変更を加える必要がない場合(これは明らかに予測できないことです)、それは悪い考えではありません。さらに、当社のサービスの多くは、サーバーを認識しないか、必要なディスク容量のわいせつなマシンでホストされているため、データの重複は大きな問題ではありません。(私が一般的に哲学から避けたいことですが) 現在、所有する一連の条件に基づいてルールに一致するサービスを構築し、ルールが真(たとえば、すべての条件が真)の場合にそれらのルールに関連付けられた一連のアクションを実行します。このサービスを最も迅速に構築している私のサブチームは、スキーマ内のルールから離れてアクションと条件を正規化することには大きなメリットがあると考えています。明らかに、これらのテーブルは、ルールIDとの外部キー関係を維持します。私たちの観点からは、条件でのデータの重複を避けることができ、一度だけ評価されることを保証できます。また、必要なときに必要な条件やルールを見つけやすく、すべてのルールを引き出してメモリ内で検索する必要がありません。 今日、私たちの主任技術者の一人と話して、彼は私をこのスキーマから遠ざけようとしました。私たちが実際にそれを必要としないとあらゆる方法で議論しようとすると、将来的にパフォーマンスの問題が発生し、所有する古いモノリスを参照します。彼は、私たちがやっていることを「古い方法」と呼び、jsonを含むフラットテーブルを「新しい方法」と呼びました。彼は、私が原子性を望む場所ではそれを必要とせず、クエリの代わりにメモリ内でより多くのことをすべきだと主張した。これは、現在当社のサービスの多くが従っている設計原則です。データの量が大幅に増加することは予想していませんが、これによりクエリを高速に保つことができます。予想されるのは、ルールの評価とアクションの実行に多くの時間を費やすことです。 非リレーショナルデータベースが近年人気を博していることは理解していますが、外部キー関係のパフォーマンスへの影響に関する情報を積極的に検索しても、彼の主張を裏付ける情報は多くありません。問題を引き起こす可能性のある大規模なトランザクションを導入する傾向があると思いますが、それは外部キー自体とは無関係の問題のようです。 これは私の素朴ですか?または、これは本当に私と私のサブチームに欠けているものがありますか?解決策を必ずしも探しているわけではないので、問題に関する詳細な情報を明示的に提供していません。それが私たちの大規模なチームで一般的な傾向であることを考えると、彼らがこれで何かに取り組んでいるかどうかは本当に興味があります。

6
DDDがOOPを満たしている:オブジェクト指向リポジトリを実装する方法は?
DDDリポジトリの典型的な実装は、save()メソッドなど、あまりオブジェクト指向ではありません。 package com.example.domain; public class Product { /* public attributes for brevity */ public String name; public Double price; } public interface ProductRepo { void save(Product product); } インフラストラクチャ部分: package com.example.infrastructure; // imports... public class JdbcProductRepo implements ProductRepo { private JdbcTemplate = ... public void save(Product product) { JdbcTemplate.update("INSERT INTO …

1
フレンドクラスを使用してプライベートメンバー関数をC ++でカプセル化する-良い習慣ですか?
だから私は、次のようなことをすることでヘッダーにプライベート関数を置くことを避けることが可能であることに気付きました: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } プライベート関数はヘッダーで宣言されることはなく、ヘッダーをインポートするクラスのコンシューマーは、それが存在することを知る必要はありません。これは、ヘルパー関数がテンプレートの場合に必要です(代替方法はヘッダーに完全なコードを配置することです)。これが、私がこれを「発見」した方法です。プライベートメンバ関数を追加/削除/変更する場合、ヘッダーを含むすべてのファイルを再コンパイルする必要がないというもう1つの利点があります。すべてのプライベート関数は.cppファイルにあります。 そう... これは有名なデザインパターンですか? 私にとって(Java / C#のバックグラウンドから来て、自分の時間でC …

2
複数の開発チームが同じ製品で作業している場合の「完了」の定義
スクラムテストの1つには、複数の開発チームが同じ製品で作業を行うときの「完了」を最もよく説明する定義に関する質問が含まれています。 適切な答えは、それらの開発チームが、結合された作業を潜在的にリリース可能にする「完了」の定義を持っている必要があることを示しています。 このクイズの適切な答えから私には明らかではないものは、次のとおりです。 チームは「完了」の異なる定義を持つことができますか?どれくらい?
12 agile  scrum 

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