ソフトウェア工学

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

3
Firebaseを使用している場合、ビジネスロジックをどこに配置しますか?
マルチユーザードキュメントシステムを非常に簡略化した単一ページのWebアプリケーションの開発を開始します。フロントエンドはおそらくAngular2を使用します。 プロジェクトには短い期限があるため、「ショートカット」、つまりすべてを最初から実装するのではなく、既成のさまざまなサービスを使用することを探していました。 アプリケーションデータを格納するために、なんらかのバックエンドが必要になります。私は周りを見回して、Firebaseを見つけました。Firebaseは、フロントエンドと通信するための個別のバックエンドとAPIを作成する作業の一部を取り除いているようです。 しかし、これはビジネスロジックをフロントエンドのAngular2 Webアプリに配置する必要があることを意味しますよね? では、将来、モバイルアプリのフロントエンドを作成したい場合、ビジネスロジックコードを複製する必要がありますか? ビジネスロジックを含み、データストレージにFirebaseを使用するバックエンドを作成するのが代替策だと思いますが、少し奇妙に思えます(バックエンドでORMまたは何かを直接使用して、もっと多くの仕事?) たとえばFirebaseを利用したい場合、人々は通常どのようにこれらの種類のアプリを構築しますか?

2
CQRSで新しい集約ルートを作成するにはどうすればよいですか?
cqrsアーキテクチャで新しい集約ルートを作成するにはどうすればよいですか?この例では、最初の1つのAR1への参照を保持する新しい集約ルートAR2を作成します。 開始点としてAR1メソッドを使用してAR2を作成しています。これまでのところ、いくつかのオプションが表示されます。 AR1の内部メソッドでは、リポジトリにアクセスできるドメインサービスを使用して、このオブジェクトをcreateAr2RootOpt1呼び出しnew AR2()てdb imediatellyに保存できます。 最初の集約ルートなどでイベントを発行できます。SholdCreateAR2Eventこれに反応してコマンドCreateAR2Commandを発行するステートレスサガがあり、それが処理されて実際にAR2が作成されて放出されAR2CreatedEventます。イベントソースを使用する場合、SholdCreateAR2Event最初の集約ルートの状態には影響しないため、イベントストアに保持されません。(または、これをイベントストアに保存する必要がありますか?) class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; …

2
スレッドがwhileループ内でタスクを待機すると、正確にはどうなりますか?
しばらくC#の非同期/待機パターンを処理した後、次のコードで何が発生するかを説明する方法が本当にわからないことに突然気づきました。 async void MyThread() { while (!_quit) { await GetWorkAsync(); } } GetWorkAsync()Task継続が実行されたときにスレッド切り替えを引き起こす場合とそうでない場合があるawaitableを返すと想定されます。 待機がループ内になかったとしても、混乱することはありません。私は当然、メソッドの残りの部分(つまり、継続)が別のスレッドで実行される可能性があることを期待しています。 ただし、ループ内では、「メソッドの残りの部分」の概念が少し曖昧になります。 スレッドが継続で切り替えられた場合と切り替えられなかった場合の「ループの残りの部分」はどうなりますか?ループの次の反復はどのスレッドで実行されますか? 私の観察では、各反復が同じスレッド(元のスレッド)で開始され、継続が別のスレッドで実行されていることが(最終的に検証されていません)示されています。これは本当にあり得ますか?はいの場合、これは、GetWorkAsyncメソッドのスレッドセーフティに対して考慮される必要があるある程度の予期しない並列処理ですか? 更新:一部の人が示唆したように、私の質問は重複ではありません。while (!_quit) { ... }コードパターンは単に私の実際のコードを簡略化したものです。実際には、私のスレッドは、定期的に(デフォルトでは5秒おきに)作業項目の入力キューを処理する長期ループです。実際の終了条件チェックも、サンプルコードで提案されている単純なフィールドチェックではなく、イベントハンドルチェックです。
10 c#  loops  async 

3
イベントソース、1つのイベント、2つのアグリゲートの状態が変更されました
私はDDDの方法と関連する主題を学ぼうとしています。私は、「銀行」を実装するための単純な境界付きコンテキストのアイデアを思いつきました。変更の履歴を保持することも重要です。 アカウントエンティティを特定しました。そのイベントソーシングは、その変更を追跡するのに適しています。他のエンティティまたは値オブジェクトは問題とは無関係であるため、それらについては触れません。 預金と引き出しを検討する場合-変更される集計は1つしかないため、比較的簡単です。 転送する場合は異なります-2つの集計は1つのMoneyTransferredイベントで変更する必要があります。DDDは、1つのトランザクションでの複数の集約の変更を非推奨にします。一方、イベントソースのルールは、エンティティにイベントを適用し、それらに基づいて状態を変更することです。イベントを単純にデータベースに保存できれば問題ありません。ただし、イベントソースエンティティの同時変更を防ぐには、各トランザクションのイベントストリームをバージョン管理するものを実装する必要があります(トランザクションの境界を維持するため)。バージョン管理には別の問題があります-単純な構造を使用してイベントを格納し、それらを読み取って集計に適用することはできません。 私の質問は、「1つの集約1つのトランザクション」、「イベント->集約の変更」、および「同時変更防止」の3つの原則をまとめるにはどうすればよいですか。

1
異機種混合の開発環境に利点はありますか?
私は、どのハードウェアとソフトウェアを実行するかを選択できる開発者のチームと協力しています。このシナリオでは、テストを実行する前に、さまざまなターゲットシステムを確認できます。私たちの経験では、問題が発生してすぐに、さまざまなブラウザーやオペレーティングシステムで多くの奇妙な問題が見つかりました。しかし、それはただ1つのグループの経験です。 このようなさまざまなシステムは、インフラストラクチャチームやセキュリティチームにとって困難であるため、問題となることがよくあります。 開発者のチームに同種または異種の開発環境を用意する方が有益ですか?

2
ゲッターとセッターを避け、ユーザー情報を表示する
バックグラウンド 私は「クリーンコードブック」を読んでいます。並行して、私は銀行口座などの体操のカタに取り組んでおり、そのルールに固執しています: 体操の9番目のルールは、ゲッターやセッターを使用しないことです。 とても楽しいようで、私はこの原則に同意します。さらに、作者はClean Codeの98〜99ページで、ゲッター/セッターが抽象化を壊し、オブジェクトに問い合わせる必要はないが、オブジェクトに通知する必要があると説明しています。 これは私の心の中で完全に理にかなっており、私はこの原則に完全に同意します。問題は実際に起こります。 環境 たとえば、一部のユーザーをリストし、ユーザーの詳細を表示する必要があるアプリケーションがあります。 私のユーザーは以下で構成されています: -> Name --> Firstname --> String --> Lastname --> String -> PostalAddress --> Street --> String --> PostalCode --> String 問題 どのように私は行うことができ、または私は私だけ(簡単な情報を表示する必要があるときゲッターを避けるために何ができると私はその特定のフィールドに余分な操作を必要としないことを確認する必要があり(単純でのFirstName値を表示します)ランダム)出力サポート? 頭に浮かぶのは 1つの解決策は、 user.getName().getFirstName().getStringValue() これは完全に恐ろしいことであり、体操の多くのルールを破り、デメテルの法則を破ります。 別のものは次のようなものです: String firstName = user.provideFirstnameForOutput(); // That would have called in the user object => …

3
アルゴリズム問題へのTDDのようなアプローチ
より良い解決策を見つけようとしたので、私はCodi​​lityのアルゴリズムテストに失敗し、結局何もありませんでした。 では、TDDに似たアプローチを使用できるかどうかを考えさせられました。つまり、通常は同様の方法で徐々にソリューションを開発できるか? ソートアルゴリズムを作成している場合、標準のBubblesortから2ウェイのバブルソートに移行できますが、Quicksortのようなより高度なものは「飛躍的進歩」ですが、少なくとも簡単に検証できるテストデータがあります。 そのようなテストのための他のヒント?次回私がすることの1つは、内部ループよりも多くのメソッド/関数を使用することです。たとえば、ソートではスワップが必要になることがよくあります。メソッドの場合、呼び出しコードを変更するだけで済みます。派生クラスとして、より高度なソリューションを用意することもできます。 「アルゴリズム」と「通常」の問題では、時間の複雑さが重要な問題を意味します。そのため、TDDのようにテストに合格する代わりに、「動作が向上する」ようにします。 「TDDに似ている」とは、 手動テストの時間を節約するために、比較的自動のテストを作成します。 インクリメンタル開発。 回帰テスト、コードが壊れているかどうか、または機能がインクリメント間で変化したかどうかを検出する機能。 比較するとわかりやすいと思います シェルソートを直接書く バブルソートからクイックソートへのジャンプ(合計書き換え) 一方向のバブルソートからシェルソートに段階的に移動します(可能な場合)。

1
2v2ゲームのデータベース構造
私は定期的に12人の友達と2v2ゲームをプレイしています。ランキングシステムを作成することを目的として、データベースにプレーヤー、チーム、スコア、ゲームを追跡させたいと思っています。 私たちは定期的にチームを変更するので、私はテーブルを作ってみたplayers、teamsそしてgamesゲームは2つのチーム(team1とteam2)を持っているし、チームは2人の選手(player1とplayer2)で構成されています。 これにより、かなりの数の問題が発生します。たとえば、2人のプレーヤー(AとBと呼ぶことにします)を一緒にプレイする場合、プレーヤー1がAでプレーヤー2がBであるか、プレーヤー1がBでプレーヤー2であるチームがすでに存在するかどうかを確認する必要があります。 Aです 列gamesとwinsはplayersテーブルとteamsテーブルの両方にありますが、これは、プレーヤーが勝ったゲームの数だけでなく、プレーヤーがさまざまなチームでどの程度互換性があるか(チームとチームを組んだときにプレーヤーが勝つ頻度)も確認したいためです別の特定のプレーヤー)。 ランキングスコアボード(おそらくEloレーティングシステムを使用します) レーティング、勝利、ゲーム、最近のゲーム統計、および彼が最も互換性のあるプレーヤーを含むすべてのプレーヤーの統計ページ。 これの多くはデータベースの正規化のいくつかの原則に違反していると私は強く疑っています。データベース設計を実装する方法としていくつかの提案が気に入っています。

2
「using」ディレクティブと「using」ステートメントがC#で同じキーワードを使用するのはなぜですか?
usingディレクティブは、彼らの完全修飾名を使用せずに、私たちのタイプへのアクセスを提供します: using MyNamespace.Foo.Bar; using声明はのためのシンタックスシュガーとして機能try/ finallyオブジェクトは適切に処分されていることを確認したブロック: using(var x = new MyDisposableClass()) { ... } これら2つの状況は、互いに何の関係もないようです。同じキーワードを使用するのはなぜですか? 2つのケースが混同されることはないでしょうが、新しい機能を表す新しい単語を作成しないのは奇妙に思えます。 余談ですがclass、C ++ での二重使用(1つはクラスの宣言、もう1つはテンプレートパラメータの定義)についても読みましたが、2番目のケースは最終的に独自のキーワードを取得typenameしました。
10 c#  statement 

7
循環的複雑度が単一のメソッドで重要なのはなぜですか?
最近からSonarLint for Eclipseを使用していますが、それは非常に役立ちました。しかし、それは私に循環的複雑さについての疑問を投げかけました。 SonarLintは許容できるCCを10と見なし、私がそれを超えている場合があります(約5または6ユニット)。これらの部分は、値がさまざまな変数に依存するマッパーに関連しています。次に例を示します。 フィールドAは文字列sAに依存しています。 フィールドBは文字列sBに依存しています。 フィールドCはString sCに依存しています。 など... if各フィールドに置くこと以外に選択肢はありません。これは(幸いにも)私の選択ではありませんが、自分で変更できない既存の複雑なシステムです。 私の質問の核心は、次のとおりです。単一の方法で CCが高すぎないことがなぜ重要なのですか。いくつかの条件を1つまたは複数のサブメソッドで移動して複雑さを軽減しても、全体的な機能のコストは削減されず、問題が別の場所に移動するだけだと思いますか? (もしあれば、小さな間違いのため申し訳ありません)。 編集 私の質問は、グローバルな循環的複雑度についてではなく、単一のメソッドの複雑度とメソッドの分割についてのみです(申し訳ありませんが、私が正確に何を意味するかを説明するのに大雑把な時間を費やしています)。すべてのサブメソッドを実行するだけの「スーパーメソッド」にまだ属しているのに、条件を小さなメソッドに分割して、アルゴリズムに複雑さを加えることが許されるのはなぜですか。 ただし、2番目のリンク(アンチパターンについて)は非常に役立ちます。

5
用語-ソースコードはプログラムですか?[閉まっている]
休業。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善してみませんか?詳細を追加し、この投稿を編集して問題を明確にしてください。 3年前休業。 私はプログラミングの初心者であり、用語をよく理解していません。CやC ++などのコンパイル済み言語で記述されたソースコードがプログラムと見なされるかどうかを知りたいのですが。そうでない場合は、誰かが理由を説明できますか?

4
オブジェクト指向プログラミングのメインの責任は何ですか?
私はオブジェクト指向プログラミングに不慣れで、メインの目的が何なのかわかりません。 はい、私はそれがプログラムの「入り口」であると読みましたが、私が理解していないことは、メインに何があるべきかです。そして、その責任は何ですか? メインで記述された何かが別のオブジェクトにカプセル化される可能性がありますが、このアプローチをどの程度使用する必要がありますか? これが私がJavaで書いた最初のメインです。非常にシンプルですが、私の疑問をよりよく理解してくれるかもしれません。「Cat」と「Dog」によって拡張された抽象クラスAnimalがあります。メインを使用してオブジェクトを作成し、ユーザーとの「インターフェース」としても使用しました。実際に、条件付きの指示を使用して、ユーザーが何をしたいかを「ユーザーに尋ねる」ことができます。 私の質問は、インターフェイスが別のオブジェクトにカプセル化され、メインにその責任を与えないという事実から生じました。 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("What type of animal do you want to create? \n dog cat"); String type = input.nextLine(); if ( Objects.equals(type, "dog")){ System.out.println("Enter the animal's age: "); int age = input.nextInt(); // Scans the next token …

5
文字列内にテキストマーカーを配置するのは悪いスタイルですか?代わりはありますか?
私は多くの操作を必要とする巨大な文字列を扱います。 たとえば、次のような文字列を生成します。 パート1 ボート セクションA プログラミング パート2 プログラミング用の分割ボート。 セクションAA セクションSQLエントリ。 文字列が大きすぎて手動ですべての部分をチェックすることはできません。今、私はする必要がありsplit、このstring中stringlistのセクションおよび部品によって。2つのオプションを考えることができます。 正規表現: QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)")); それはうまくいくように見えますが、時々例外が通り抜けます(IE:Section SQL Entries誤って分割されます) それ以外の場合は、最初の文字列を生成するときにマーカーを配置できます。 🚤💻パート1 ボート 🚤💻セクションA プログラミング 🚤💻パート2 プログラミング用のパーティショニングボート。 🚤💻 セクションAA セクションSQLエントリ。 つまり、文字列の分割が簡単になります。 QStringList sl = s.split("🚤💻")); これらのどちらも良いスタイルやプログラミングの実践ではないことはわかりますが、この時点まで、それについては議論しておらず、代替案も見つけていません。 あなたが私のプロジェクトマネージャーである場合、これらの方法のいずれかを受け入れますか? そうでない場合、私がベストプラクティスとして何をすればよいと思いますか?

1
既存のレガシーWebアプリを移行してOAuth2を使用する方法
私は現在、自家製の承認と認証システムを使用して、100万人近くのユーザーがいる15歳のレガシーモノリシックWebアプリケーションを持っています。ハッシュアルゴリズムなど)。 今後12〜18か月間、主にUIに重点を置いてアプリケーションのオーバーホールを行いますが、基盤となるパーツもゆっくりとアップグレードします(Spring、Spring Securityなどへのアップグレード)。このプロジェクトでは、モジュールごとにUIのアップグレードに取り組むことにしました。各モジュールが完成したら利用可能にする。モノリスを個々のWebアプリに分割する絶好の機会(すべて同じUXデザインを維持)。 これを計画しようとして私が行き詰まっているのは、認証と承認のレベルです。すべてのモジュールにまたがるクロスカッティングソリューションが必要です。これにより、ユーザーがあるWebアプリケーションから別のWebアプリケーションに誘導されたときに、シームレスな移行が実現します。ユーザーは異なるWebアプリケーション上にいることさえわかりません。OAuth2は完璧なソリューションのように聞こえます。 これを統合する方法を理解しようとするのに行き詰まっています。独自のカスタムOAuth2サーバーを構築する必要がありますか?それはひどい考えのように私を襲います。しかし、どうやって私は: すべてのユーザーアカウントと承認プロセスをサードパーティのOAuth2サーバーに移行する アプリケーションの残りの部分と一致するようにルックアンドフィールをカスタマイズします(これがどれほど簡単に/可能性が高いかわかりません) サードパーティのサーバーを介して接続するときに、一般的な「アプリケーションXYZがアカウントへのアクセス許可を求めています...」ポップアップを防止しますか?(例:Google OpenID、Facebookなど)。 私の目標は、ユーザーに現在の状態から新しい状態へのシームレスな移行を提供することですが、Webアプリケーションの外部ですべて認証および承認する個別のWebアプリケーションを作成する機能を提供することです。

5
C ++での冗長文字列割り当ての最適化
パフォーマンスが問題となっているかなり複雑なC ++コンポーネントがあります。プロファイリングは、実行時間のほとんどがstd::stringsのメモリの割り当てに費やされていることを示しています。 これらの文字列には多くの冗長性があることを知っています。一握りの値は非常に頻繁に繰り返されますが、固有の値もたくさんあります。文字列は通常かなり短いです。 私は今、それらの頻繁な割り当てを何らかの形で再利用することが理にかなっているのかどうか考えています。1000の異なる「foobar」値への1000のポインターの代わりに、1つの「foobar」値への1000のポインターを持つことができます。これによりメモリ効率が向上するという事実は素晴らしいボーナスですが、ここでは主に待機時間について心配しています。 すでに割り当てられた値のある種のレジストリを維持することは1つのオプションだと思いますが、レジストリの検索を冗長なメモリ割り当てよりも高速にすることは可能ですか?これは実行可能なアプローチですか?

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