ソフトウェア工学

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

2
CQRSコマンドをどの程度正確に検証し、ドメインオブジェクトに変換する必要がありますか?
あるデータストアにきめ細かなデータを持ち、分析の大きな可能性を提供し、ビジネス価値を向上させ、必要に応じてパフォーマンスを向上させるために非正規化データを含む読み取りを必要とする柔軟性を備えているため、貧乏人のCQRS 1をかなり長い間適応させてきました。 しかし、残念ながら最初から、このタイプのアーキテクチャにビジネスロジックを正確に配置する必要があるという問題に苦労してきました。 私が理解していることから、コマンドは意図を伝える手段であり、ドメイン自体とは関係がありません。これらは基本的にデータ(ダム-必要に応じて)転送オブジェクトです。これは、異なるテクノロジー間でコマンドを簡単に転送できるようにするためです。同じことが、正常に完了したイベントへの応答としてイベントに適用されます。 典型的なDDDアプリケーションでは、ビジネスロジックはエンティティ、値オブジェクト、集約ルート内に存在し、データだけでなく動作も豊富です。ただし、コマンドはドメインオブジェクトではないため、データのドメイン表現に限定されるべきではありません。これは、コマンドに過度の負担をかけるためです。 本当の質問は、ロジックはどこにあるのでしょうか? 値の組み合わせについていくつかのルールを設定する非常に複雑な集合体を構築しようとすると、私はこの闘争に最も頻繁に直面することがわかりました。また、ドメインオブジェクトをモデル化するときは、フェイルファーストパラダイムに従い、オブジェクトがいつメソッドに到達するかを知ることが有効な状態にあることを好みます。 集約Carが2つのコンポーネントを使用するとします。 Transmission、 Engine。 両方TransmissionとEngine値オブジェクトは、スーパータイプとして表され、サブタイプ、記載しているAutomaticとManualトランスミッション、またはPetrolとElectricそれぞれエンジン。 このドメインでは、それ自体で生活TransmissionするAutomaticかManual、成功するか、それとも、またはいずれかのタイプEngineが完全に作成されます。しかし、Car集約は該当する場合にのみ、いくつかの新しいルールを紹介Transmissionし、Engineオブジェクトが同じコンテキストで使用されています。すなわち: 車がElectricエンジンを使用する場合、許可されるトランスミッションタイプはのみですAutomatic。 車がPetrolエンジンを使用するとき、それはどちらのタイプも持つかもしれませんTransmission。 コマンドを作成するレベルでこのコンポーネントの組み合わせの違反をキャッチできましたが、前に述べたように、コマンドにはドメインレイヤーに限定されるべきビジネスロジックが含まれるため、実行すべきではないことを理解しているからです。 オプションの1つは、このビジネスロジック検証をコマンドバリデータ自体に移動することですが、これも正しくないようです。コマンドを分解し、ゲッターを使用して取得したプロパティを確認し、バリデーター内でそれらを比較して結果を検査しているように感じます。それは私にとってデメテルの法則違反のような叫びです。 上記の検証オプションは実行可能とは思えないため、破棄することは、コマンドを使用してそれから集計を構築する必要があるようです。しかし、このロジックはどこにあるべきでしょうか?具体的なコマンドを処理するコマンドハンドラー内にあるべきですか?それとも、おそらくコマンドバリデーター内にあるべきでしょう(このアプローチも好きではありません)。 現在、コマンドを使用しており、責任あるコマンドハンドラー内でコマンドから集計を作成しています。しかし、これを行うと、CreateCarコマンドが存在する場合、コマンドバリデータがまったく含まれないため、コマンドバリデータがあれば、別のケースで有効であることがわかっているコンポーネントが含まれますが、集計は異なると言う場合があります。 CreateUserコマンドを使用して新しいユーザーを作成する、さまざまな検証プロセスを組み合わせたさまざまなシナリオを想像してみましょう。 コマンドには、Id作成されたユーザーとそのが含まれますEmail。 システムは、ユーザーの電子メールアドレスについて次のルールを示します。 一意である必要があり、 空にしないでください、 最大100文字(db列の最大長)でなければなりません。 この場合、一意の電子メールを持つことはビジネスルールですが、システム内の現在の電子メールのセット全体をメモリにロードし、コマンドで電子メールをチェックする必要があるため、集約でチェックすることはほとんど意味がありません集合体に対して(Eeeek!何か、何か、パフォーマンス。)。そのため、このチェックをコマンドバリデータに移動します。コマンドバリデータはUserRepository、依存関係として受け取り、リポジトリを使用して、コマンドに電子メールが存在するユーザーが既に存在するかどうかをチェックします。 これに関しては、他の2つの電子メールルールをコマンドバリデーターに入れることは突然意味があります。しかし、ルールはUser集約内に実際に存在し、コマンドバリデーターは一意性のみをチェックし、検証が成功した場合は、User集約を作成CreateUserCommandHandlerしてリポジトリに渡し、保存する必要があると感じています。 リポジトリのsaveメソッドは、集約が渡されるとすべての不変条件が満たされることを保証する集約を受け入れる可能性が高いため、このように感じます。ロジック(空でないなど)がコマンド検証自体にのみ存在する場合、別のプログラマーはこの検証を完全にスキップUserRepositoryして、Userオブジェクトでsaveメソッドを直接呼び出すことができ、致命的なデータベースエラーにつながる可能性があります長すぎました。 これらの複雑な検証と変換をどのように個人的に処理しますか?私はほとんど自分のソリューションに満足していますが、選択肢にかなり満足するためには、私のアイデアとアプローチが完全に愚かではないことを断言する必要があると感じています。私は完全に異なるアプローチに完全にオープンです。個人的に何か試してみて、あなたのために非常にうまくいったことがあるなら、私はあなたの解決策を見たいと思います。 1 RESTfulシステムの作成を担当するPHP開発者として働いている私のCQRSの解釈は、コマンドを同期的に処理する必要があるためにコマンドから結果を返すことがあるなど、標準の非同期コマンド処理アプローチとは少し異なります。

3
コントローラーの単体テストを書くのはなぜですか?
私にとってこれはまったく無関係な単体テストであり、それを得る価値はほとんどないため、なぜ誰かがそれを書くのに時間を費やすのか理解できません。このコントローラーがブラウザーでメソッドを実行することで必要な型を返した場合、私は完全によく知っているでしょう。本当に、これにはテストが必要だと思いますか、それはなぜですか? public class ConstituencyControllerTests { private ConstituencyController _constituencyController; private Mock<IConstituencyService> _IConstituencyServiceMock; public ConstituencyControllerTests() { _IConstituencyServiceMock = new Mock<IConstituencyService>(); } [Test] public async Task I_Check_For_Return_Type_And_Result() { _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object ); var result = await _constituencyController.Get(); var content = ( (dynamic)result ).Content; Assert.IsEmpty( content ); Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result …

5
成功するとtrue / false vs voidを返し、失敗すると例外をスローする関数
ファイルをアップロードする関数であるAPIを作成しています。ファイルが正しくアップロードされた場合、この関数は何も/ voidを返さず、何らかの問題が発生したときに例外をスローします。 なぜ偽りではなく例外なのか?例外の内部で、失敗の理由(接続なし、ファイル名の欠落、パスワードの誤り、ファイルの説明の欠落など)を指定できるためです。カスタム例外を作成したかった(APIユーザーがすべてのエラーを処理するのに役立つ列挙型を使用)。 これは良い習慣ですか、それともオブジェクトを返す方が良いですか(内部にブール値、オプションのエラーメッセージ、エラーの列挙を含む)?

1
Hindley-Milner推論はGo言語で機能しますか?
私は、Hindley-Milnerがサブクラスを持つ型システムでは機能しないことを読みましたが、他の型システム機能でも機能しないことがあります。現在、Goでは:=演算子の型推論が非常に限られています。しかし、Goには伝統的な意味でのサブクラスはなく、Hindley-Milner推論で問題なく動作するHaskellの型クラスに非常によく似たインターフェースのみがあります。 それでは、Hindley-Milnerの推論は、Haskellの場合と同じように、Goでも原則的に機能しますか?それとも、Goには他の機能がありますか?(一方で、HaskellにはHindly-Milnerで動作しない機能もあります。これらを使用すると、プログラムのこれらの部分を手動で入力する必要があります。)

9
コーディングおよびメンテナンス中にメモ、思考、アルゴリズム、決定を書き留めることは正常ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた3年前。 言葉なしでは考えられないこの問題を抱えている人もいます。そして、彼らの考えや決定を書き留めることは、最も効果的な進め方です。 だから-コーディング中にNotepad ++ファイルに自分の考えや決定を書き留めることは正常で受け入れられますか? 技術文書を再作成したり、より複雑なアルゴリズムについて推論したりする場合など、受け入れられるべき場合もありますが、設計オプションを検討して判断しようとする場合など、奇妙な場合もあります。 このプラクティスが生産性に与える影響は不明です。片側から-内側の言葉を使った推論は、書かれた言葉を使った場合よりも速いかもしれません。反対側から-より複雑な問題は書く必要があります。それに、デザインの選択肢が増えれば、意思決定が書かれたときのフィーリングが良くなり、士気が上がります。

1
「exit(-1)」はどこから来たのですか?
「異常終了」を表すためにを使用することを推奨するexit(-1)、インターネット上の多くのレガシーソフトウェアや悪いチュートリアルに見られreturn -1ます。問題は、少なくともPOSIXでは-1、有効なステータスコードではなく、有効なステータスコードです。man 3 exitはのexit()値をstatus & 0377親に返すことを示しています。つまり、に-1なり255ます。非POSIXシステムでEXIT_FAILUREは、移植性のために推奨されます。しかし、「-1は異常終了を意味する」と「EXIT_FAILUREは1以外の可能性があります」とは表示されません。 これを永続化するStackOverflowの質問の例を次に示します。ソフトウェア「unrealircd」も、プログラムのexit(-1)終了に使用するプログラムの例です。実際には、これにより、とのインターフェースが難しくなりますsystemd。 このアンチパターンはどこから来たのですか?あるコンテキストで有効ですか?

7
ペアプログラミングの潜在的な欠点は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 閉じた3年前。 ペアプログラミングは、今日では非常に有名です。 以下のようないくつかの利点があります。 バグの少ないプログラム。 ポストプロダクションのメンテナンスコストははるかに低くなります。 確立された慣行は挑戦され、新しいアイデアが生まれます。 プログラマーはお互いから学びます。 プログラマーはソフトスキルを開発します。 しかし、ペアプログラミングの欠点は何ですか?

7
.NETにDIを実装する「正しい」方法は何ですか?
比較的大きなアプリケーションに依存性注入を実装したいと考えていますが、経験はありません。私は、UnityやNinjectなどのIoCの概念といくつかの実装、および利用可能な依存関係インジェクターを研究しました。しかし、私を避けているものが1つあります。アプリケーションでインスタンス作成を整理するにはどうすればよいですか? 私が考えているのは、いくつかの特定のクラスタイプのオブジェクトを作成するロジックを含むいくつかの特定のファクトリを作成できるということです。基本的に、このクラスの静的カーネルインスタンスのNinject Get()メソッドを呼び出すメソッドを持つ静的クラス。 アプリケーションに依存性注入を実装する正しいアプローチでしょうか、それとも他の原則に従って実装する必要がありますか?

5
オンラインでコードをホストする必要がありますか?
私たちは職場で優れたソース管理およびプロジェクト管理ソリューションを探しています。GitHub組織とプライベートリポジトリを作成することを提案しました。私は多くの理由でGitHubが大好きですが、これはGitHubについてではありません(実際、同僚は競合するプラットフォームを支持してポイントを提示するつもりです)- 私たちのプライベートコードをオンラインで保存することです。 これが良いアイデアかどうかを理解しようとしています。サーバーコストの必要性を(少なくとも直接)排除し、コードの検索(すべてがオンライン)を容易にするため、間違いなく有利に思えます。 しかし、私たちのチームは未定であり、私の質問に私を導きます。この決定を下すために、私たちは何を考慮すべきですか?

7
「Set」にはGetメソッドが必要ですか?
このC#クラスを作成しましょう(Javaでもほぼ同じです)。 public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

8
32ビットアーキテクチャで可能なすべての数値を含むファイルが提供されます。そのファイルには4つの数字がありません。欠落している4つの数字を見つける
これはインタビューの質問で、何度か出くわしました。4つの数字が欠けているので、どうやってそれを解決するのかわかりません。私は1つまたは2つの数値が見つからないことを見つけるためのアルゴリズムに精通していますが、それらのいずれかを4に一般化する方法がわかりません。
22 algorithms 

7
データベースでビットマスクを使用する利点と欠点
少し前に同僚と話をしましたが、彼はデータベースに保存されているすべての値を理解するのが難しいため、ビットマスクの使用に間違いなく反対しました。私の意見では、例えば現在のユーザーの役割を決定するためにそれらを使用することは必ずしも悪い考えではありません。それ以外の場合は、別のテーブルに保存する必要があり、これによりもう1つのJOINが発生します。私が間違っているかどうか教えてもらえますか?ビットマスクを使用する他の副作用、利点/欠点はありますか?

4
GitHubフローでは、機能ブランチを別の機能ブランチに基づいてもかまいませんか?
私たちはプロジェクトでGitHub Flowを使用し、ほとんどの場合、masterから新しい機能ブランチを開き、そこで作業を行い、PRを開き、コードを確認してmasterにマージします。 しかし、私の現在の仕事はで取り組んでいる別の問題に依存していfeature-branch-Aます。他のブランチからブランチを作成するのはコーシャーですか、それともGitHub Flowの精神に反するものですか? 別の方法は、私のブランチをマスターに基づいて、feature-branch-A(頻繁に)変更をマージすることです。 GitHubフローではどのオプションが推奨されますか?
22 git  github  gitflow 

3
認知のオーバーヘッドを減らすために、コードの背後にある目的は「イディオマティック」ですか?
私は誰かにコードを書いた方法が理解しにくいことを説明しようとしています。そして、あなたがそれをリファクタリングすれば読みやすくなります。私が運転しているこのスタイルのコードは、一般に「イディオマティック」コードと呼ばれます。 しかし、イディオムコードというフレーズは、道徳的な正しさの手荷物をもたらします。これは、人々にコーディングスタイルを変更させる大きな動機ではありません。これをより積極的に表現する方法は、共通のスタイルに従うコードですが、群れのメンタリティの推論として出くわす批判的な思想家に対するものです。 人々がコードを変更する動機を与える方法でこのアイデアを説明する方法は次のとおりです。 リーダーの認知オーバーヘッドを減らすような方法でコードを記述します(たとえば、これが第1種のベクトルか第5種のベクトルかを思い出せません) 意図を理解しやすくするコード(たとえば、このベクトルは何のためですか?) (余談ですが、最初の出版前のThe Joy of Clojureの本には、「Idiomatic Clojure」というタイトルのドラフトがありました。そのため、読者に「喜び」をもたらすために、コードを「イディオマティック」にする理由に思えます。 )。 私の質問は次のとおりです。認知オーバーヘッドを減らすために、コードの背後にある目的は「イディオマティック」ですか?
22 idioms 

2
VCSにソフトウェアバージョン番号を保存することをお勧めしますか?
などの製品バージョンは、v1.0.0.100ソフトウェアの固有の製品リリースを表すだけでなく、その製品の機能セットと修正プログラムの段階を識別するのに役立ちます。現在、製品の最終パッケージ/ビルド/バイナリバージョンを維持するための2つの方法があります。 バージョン管理。ファイルはどこかにバージョン番号を保存します。Continuous Integration(CI)ビルドサーバーには、このチェックインバージョン番号を使用して必要なソフトウェアのすべての領域(バイナリ、インストーラーパッケージ、ヘルプページ、ドキュメントなど)に適用するソフトウェアをビルドするスクリプトがあります。 環境および/またはビルドパラメータ。これらはバージョン管理外で維持されます(つまり、スナップショット/タグ/ブランチに関連付けられていません)。ビルドスクリプトは、同じ方法で番号を配布および使用しますが、値の取得方法が異なります(ソースツリーに対する相対位置をスクリプトに知らせるのではなく、ビルドスクリプトに提供されます)。 最初のアプローチの問題は、メインラインのブランチ間でマージが複雑になる可能性があることです。同じソフトウェアの2つの並行リリースを引き続き維持する場合、最後のマージ以降に両方のバージョンが変更されている場合、2つのメインライン間のマージ時に競合を解決します。 2番目のアプローチの問題は、調整です。1年前のリリースに戻ると、タグ情報のみに依存してリリース番号を識別します。 どちらの場合も、CIビルドの前に知られていないバージョン番号の特定の側面があるかもしれません。たとえば、CIビルドは、実際には自動化されたビルド番号である4番目のコンポーネント(たとえば、ブランチ上の140番目のビルド)にプログラムで配置できます。VCSのリビジョン番号でもあります。 ソフトウェアのバージョン番号を把握する最善の方法は何ですか?VCSで「既知の」部品を常に維持する必要がありますか?もしそうなら、メインラインのブランチ間の競合は問題ですか? 現在、CIビルドプラン(Atlassian Bamboo)で指定および維持されているパラメーターを介してバージョン番号を維持しています。masterブランチにマージする前に、CIビルドの開始前にバージョン番号が適切に設定されていることを注意する必要があります。Gitflowのワークフローに関しては、ソース管理でバージョン番号が追跡されていればrelease、リリースの準備でブランチを作成するときに、バージョン番号が適切に設定されることを保証できると思います。QAは、このブランチで最終的な統合/スモーク/回帰テストを実行し、サインオフ時に、masterリリースへのコミットメントを示すマージが行われます。

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