ソフトウェア工学

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

3
マージした変更をすぐにコミットしないのはなぜですか?
私のオフィスでは、バージョン管理にGitとSourceTreeを使用しています。これは、私が参加したときにバージョン管理がゼロであり、SourceTreeしか使用したことがなかったためです。私は決して専門家ではありませんが、同僚の中で最も経験豊富なので、Gitを適切に使用し、間違いを修正するように全員に教える責任がある事実上の専門家です。 GitとSourceTreeを経て、プロセスのすべてのステップを説明するチュートリアルドキュメントを作成しています。プルプロセスでは、SourceTreeダイアログで[マージされた変更をすぐにコミットする]オプションを選択できます。私はこれが何をするのか、なぜそれが役立つのかを理解しています。私が理解していないのは、なぜこの機能を使用したくないのかということです。 マージした変更を自動的にコミットしたくない理由を誰かが説明できますか?私はこの機能の有用性をよりよく説明し、将来どのような落とし穴に注意すべきかを理解できるように、理由を理解しようとしています。 編集:私の質問がリンクされた質問の複製だとは思わない。リンクされた質問は広くコミットする頻度を尋ねています。SourceTreeでのマージのコミットに関連する特定の機能を使用しないことを選択する理由について質問しています。

3
インターフェイスでstring_viewを使用する必要があるのはいつですか?
私は模倣Aに設計された内部ライブラリを使用しているC ++ライブラリを提案し、いつか過去数年間で、私はそのインターフェースが使用してから変更を参照std::stringしますstring_view。 そこで、新しいインターフェースに適合するようにコードを忠実に変更しました。残念ながら、私が渡さなければならないのは、std :: stringパラメーターと、std :: string戻り値です。そのため、私のコードは次のように変更されました。 void one_time_setup(const std::string & p1, int p2) { api_class api; api.setup (p1, special_number_to_string(p2)); } に void one_time_setup(const std::string & p1, int p2) { api_class api; const std::string p2_storage(special_number_to_string(p2)); api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size())); } 私は、この変更がAPIクライアントとして私に何を買ったのか、実際には、コードを増やすこと以外は見当たらないでしょう(おそらく失敗するためです)。API呼び出しの安全性は低下し(APIがパラメーターのストレージを所有しなくなったため)、おそらくプログラム0の作業を節約しました(コンパイラーができる最適化の移動により)。起動後またはどこかで大きなループで行われない、または行われない割り当てがいくつかあります。このAPI用ではありません。 ただし、このアプローチは、他の場所で見られるアドバイス、たとえば次の回答に従うようです。 余談ですが、C ++ 17以降では、std :: string_viewを優先してconst std :: …

6
要件または方法によるユニットテストの分割
最初に、タイトルをおaびします。それを説明する最も簡単な方法は考えられませんでした! ユニットテストを書きたいメソッドがあります。メソッドの実装については説明せず、テストのみを行いたいので、かなり汎用的にしておきます。メソッドは次のとおりです。 public void HandleItem(item a) { CreateNewItem(); UpdateStatusOnPreviousItem(); SetNextRunDate(); } そのため、このクラスにはパブリックメソッドが1つあり、このメソッドがプライベートメソッドを呼び出してロジックを実行します。 それで、ユニットテストを書くとき、私は3つすべてが行われたことをチェックしたいです。それらはすべて同じ実行で呼び出されるため、1つのテストとして実行できると考えました。 public void GivenItem_WhenRun_Thenxxxxx { HandleItem(item); // Assert item has been created // Assert status has been set on the previous item // Assert run date has been set } しかし、3つの別々のテストとして書くこともできると考えました。 public void GivenItem_WhenRun_ThenItemIsCreated() { HandleItem(item); } public …
16 c#  unit-testing 

4
JavaScriptの関数の謎を解決できません
私は、Javascriptのカーテンシーンの背後にあるものを理解しようとしています。組み込みオブジェクト、特にオブジェクトと関数、およびそれらの間の関係の作成を理解することに固執しています。 Array、Stringなどのすべての組み込みオブジェクトがObjectの拡張(継承)であると読んだとき、Objectは作成された最初の組み込みオブジェクトであり、残りのオブジェクトはそれを継承すると仮定しました。しかし、オブジェクトは関数によってのみ作成できることを知ったとき、それは意味がありませんが、関数も関数のオブジェクトにすぎません。鶏と鶏のジレンマのように聞こえ始めました。 他の非常に紛らわしいことは、console.log(Function.prototype)関数を印刷console.log(Object.prototype)するのに、印刷するときにオブジェクトを印刷する場合です。Function.prototype関数がオブジェクトであることが意図されていたのになぜですか? また、Mozillaのドキュメントによれば、すべてのjavascript functionはFunctionオブジェクトの拡張ですが、あなたconsole.log(Function.prototype.constructor)が再び関数である場合はそうです。では、何かを使用して自分自身を作成するにはどうすればよいでしょう(Mind = blown)。 最後にFunction.prototype、関数ですが、doesをconstructor使用Function.prototype.constructorして関数にアクセスできます。つまりFunction.prototype、prototypeオブジェクトを返す関数です

5
より表現力のあるプログラミング言語の進化により、ソフトウェア設計仕様の必要性は大幅に減少しましたか?
数年前の私を含む多くのIT担当者にとって、理想的なソフトウェア開発プロセスでは、コード行を記述する前に、多くのUMLダイアグラムを含む詳細な設計ドキュメントを作成する必要があります。(これはウォーターフォールモデルの説明のように見えますが、反復がより小さいことを除いて、アジャイルでも同じです。) 過去2、3年の間に、私は完全に考えを変えました。関連するテストケースを含む詳細な要件仕様は、絶対に不可欠であると私はまだ考えています。大規模なプロジェクトの場合、コーディングを開始する前に、アーキテクチャ全体の概要も必要になります。ただし、残りはすべてコードで可能な限り行う必要があります。理想的なケースでは、コード自体を除いてソフトウェア設計の説明はありません。 どのようにしてこの結論に達しましたか?以下にいくつかの引数を示します。 フィードバック 文書を書いたり、図を作成したりするツールはほとんどフィードバックを提供しません。はい、UMLダイアグラムの整合性チェックを行うモデリングツールがありますが、それらは制限されており、多くのオーバーヘッドが伴います。 フィードバックがなければ、エラーを認識して修正することは困難です。 コードを書くとすぐに、次のような多くのフィードバックが得られます。 コンパイラからのエラーと警告 静的コード分析結果 単体テスト エラーをすばやく認識して修正できます。 一貫性 コードがドキュメントと一致していることを確認するには、何度も確認する必要があります。頻繁な変更がある場合、コードとドキュメントの同期を保つのは困難です。 リファクタリング テキストの説明や図をリファクタリングするのは通常困難でエラーが発生しやすい一方で、コードをリファクタリングするための強力なツールとテクニックがあります。 この作業を行うための前提条件が1つあります。コードは読みやすく、理解しやすいものでなければなりません。これはおそらくAssembler、Basic、またはFortranでは達成できませんが、最新の言語(およびライブラリ)ははるかに表現力があります。 したがって、私の議論が有効であれば、ソフトウェア設計の仕様やドキュメントの軽量化や軽量化に向かう​​傾向があるはずです。この傾向の経験的証拠はありますか?

7
コード開発に適用される機械学習
私のバックグラウンドは機械工学ですので、この分野に対する私の無知をお許しください。 プログラミングとソフトウェア開発を本当に楽しんでいます。また、最近、スタンフォード大学のAndrew Ng教授が教える無料のオンラインMachine Learning(ML)クラスを受講しました。ここにリンクします。 この教授が、MLが決して影響を与えない分野を見つけるのは難しいと言うのを聞いたことがあります。 質問 私の質問は、機械学習をコード開発に適用するためにこれまでにどのような研究が行われてきたかということです。デバッグはどうですか? 可能であれば、リソース/ソース/科学論文を含めてください。 多くの場合、ML およびソフトウェア開発(またはプログラミング)を検索すると、MLアプリケーションのソフトウェア開発(またはプログラミング)の結果につながるため、これを検索する運はありませんでした。

3
外部APIを照会することが唯一の目的であるが、APIは複雑な照会構文を使用する関数をどのようにテストしますか?
唯一の実際のロジックは、外部APIのクエリ構文にあります。APIを照会するかどうかをテストするのではなく、正しいデータが返されるような方法で照会することをテストする必要があります。たとえば、いくつかの擬似コード: function retrieve_related_data(id) { query = "[potentially long, syntactically complex query that uses param id to get some data]"; results = api_wrapper.query(query); return results; } 構成されたAPIを使用したより具体的な例: function retrieveLifeSupportingObjectsWithinRegion(id) { query = " within region(" + id + ") as r find objects matching hydration>0 and temp_range has 75 send name, …

4
ASP.NETアプリケーションを開発する場合、CQRS / MediatRは価値がありますか?
私は最近CQRS / MediatRを調査しています。しかし、ドリルダウンすればするほど、それが好きではなくなります。おそらく私は何か/すべてを誤解しました。 だから、これをあなたのコントローラーをこれに減らすと主張することから、それは驚くほど始まります public async Task<ActionResult> Edit(Edit.Query query) { var model = await _mediator.SendAsync(query); return View(model); } Thin Controllerのガイドラインに完全に適合します。ただし、非常に重要な詳細-エラー処理は省略します。 Login新しいMVCプロジェクトからのデフォルトアクションを見てみましょう public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password …

4
高速なメジャーバージョンバンピングは、デザインの悪さの証拠ですか?
私は数ヶ月前にジュニアプログラマーとして仕事を始めました。私たちが取り組んでいるシステムは、2年ほど実稼働しています。私はシステムと設計の物inいには関与していませんでした。 私が気づいたことの1つは、システムのメジャーバージョンがすでに11.YZであるということです。他のシステムやライブラリでの作業経験から、製品がメジャーバージョンをそれほど速く動かしたのを見たことはありません。1.XYで長年使用されている製品がありますが、まだ機能とバグ修正を受けています。 セマンティックバージョニングが適切に使用されていると仮定すると、これは、システムがほぼ4か月ごとに重大な重大な変更を行うため、設計が不十分であることを示していますか?

1
UMLアクティビティ図でネストされたアクションを表現するにはどうすればよいですか?
この質問は非常によく似ているこのいずれかが、答えは私のニーズと一致していません。特定のUMLツール(Papyrus)に焦点を当てていますが、私の質問はUMLについてより一般的です。 ネストされたアクションをアクティビティ図で表現したいと思いますが、それを行う一般的な方法はわかりません。考え方は、他のアクションと同じスコープのアクションがありますが、その実行はより複雑であるということです。他のレベルと同じレベルでこのアクションを表示できるようにしながら、その実行に関する詳細を表示したいと思います。 ある種の「バックホーム」アクティビティを示すアクティビティ図である以下の例では、ネストされたアクションがアクションに含まれていPet the catます。この図には別の潜在的なエラーがあることに注意してください。質問の最後の正誤表を参照してください。 構造化ノードを使用しましたが、それが正しい方法であるかどうかはわかりません。そのため、質問です。ステートチャートでは、同等のものは複合状態になりますが、複合アクションについては何も見つかりません。構造化されたノードについては、それに関するいくつかのドキュメントを読んだ後、それがどのように使用されるべきかをまだ本当に理解していないので、この図ではまったく間違っているかもしれません。 また、下の画像のように、トライデントシンボルで別のサブアクティビティを参照する可能性があることも知っていますが、同じ図にすべての情報が必要なので、ニーズに一致しません(印刷できるようになります情報の損失なし) では、そのようなネストされたアクションを表す標準的な方法は何ですか?標準では、一般的に見られ、可能であればほとんどのUML設計ツールで実行可能な有効なUMLを意味します。 無関係な正誤表:私の図では別のことが間違っています。同じアクション(Scratch behind the ears)に来る矢印は、アクションに入る前にマージノードに移動する必要があります。このJOTの引用を含む、以下のコメントを参照してください。
16 uml  modeling 

2
コモナドとは何ですか?
最近、私はモナドがどのように機能するかについての知識を払拭しています。私はまたの概念を導入してきた「Comonad」として記述され、逆モナドのデュアル。しかし、頭を包むことはできません。 モナドを理解するために、私は自分自身に類推しました: モナドは、「表現のコンベアベルトを構築するための青写真」と見ることができます。 新しいMonad(新しい種類のコンベアベルトシステム)を定義するには、以下を定義する必要があります。 コンベアベルトに何かを置く方法。たとえば、コンベアベルトを「開始」します。(unitまたはとして知られているreturn) コンベアベルトの一部となるマシン(表現)をコンベアベルトに接続する方法。(joinまたはbindまたはとして知られてい>>=ます)。 (現在のコンベヤーベルトを取り出し、その内容物を捨て、として知られる新しいコンベヤーベルトを開始する3番目の操作がありますが、>>使用されることはほとんどありません。) 機械とコンベアが適切に連携するには、次のことを確認する必要があります。 コンベアベルトに何かを置いて機械に通した場合、出力は手動で機械に通したときと同じになります。(左身元) 既存のコンベヤーベルトの間にコンベヤーベルトを配置する場合、コンベヤーベルトが上にあるコンベヤーベルトではなく、単一の長いコンベヤーベルトで終わる必要があります。 (正しいアイデンティティ) マシンAを手動で使用し、コンベヤーに接続されたBCを介して結果を渡す場合、またはコンベヤーに接続されたABを使用し、Cを介して結果を手動で渡す場合、出力は重要ではありません。つまり、((a >> = b)>> = c)は(a >> =(b >> = c))と同じである必要があります(結合性) 最も単純なコンベアベルトは、単に入力を受け取り、常に次の式に進むものです。これが「パイプライン」です。 別の可能性は、値に対して何らかの条件が満たされた場合にのみ次のマシンを通過させることです。つまり、中間の式の一部で値が許可されていないものに変更された場合、残りの式はスキップされます。これがHaskellで 'Maybe'モナドが行うことです。 また、値をマシンに渡す前または後に、値に対して他の派手な条件付きコピー/変更ルールを実行できます。例:パーサー(ここで、式が「失敗」の結果を返す場合、式の前の値が 出力として使用されます)。 もちろん、アナロジーは完全ではありませんが、モナドがどのように機能するかを大まかに表してくれることを願っています。 しかし、私はコモナドを理解するためにこの類推を頭に置くのに苦労しています。インターネット上で見つけたわずかな情報から、コモナドが定義していることを知っています。 extract、これはの逆ですreturn。つまり、Comonad から値を取得します。 duplicate、これはの逆のようなjoinものです。つまり、1つのComonadsから2つのComonadを作成します。 しかし、Comonadから抽出または複製しかできない場合、Comonadはどのようにインスタンス化できますか?そして、実際にどのように使用できますか?私はこの非常に素晴らしいプロジェクトとそれについての話を見ましたが(残念ながらほとんど理解していませんでした)、機能のどの部分がComonadによって正確に提供されるのかわかりません。 コモナとは何ですか?彼らは何のために役立ちますか?どのように使用できますか?彼らは食用ですか?

4
サードパーティのライブラリをより大きなオブジェクトモデルでラップするための手作業を減らすにはどうすればよいですか?
2012年 のこの質問の著者と2013 年のこの質問の著者のように、アプリケーションを適切にテストするためにラップする必要があるサードパーティのライブラリがあります。一番上の答えの状態: 常にインターフェイスの背後にサードパーティのタイプとメソッドをラップする必要があります。これは退屈で痛みを伴う場合があります。コードジェネレータを記述したり、ツールを使用してこれを行うことができます。 私の場合、ライブラリはオブジェクトモデル用であり、その結果、この戦略を成功させるためにラップする必要があるクラスとメソッドの数が多くなります。単に「退屈で痛みを伴う」だけでなく、これはテストの難しい障壁になります。 この質問から4年間で、分離フレームワークが大きく進歩したことを認識しています。私の質問は、サードパーティのライブラリを完全にラップする効果を達成するためのより簡単な方法が今あるのでしょうか?このプロセスの痛みを取り除き、手作業の労力を減らすにはどうすればよいですか? 私の質問はラッピングの手間を減らすことに関するものなので、私の質問は最初にリンクした質問の複製ではありません。これらの他の質問は、ラッピングが理にかなっているかどうかを尋ねるだけであり、どのように労力を小さく保つことができるかではありません。

2
emはまだ関連していますか?
このようなスレッドを読んで理解したことは、emsのポイントは、ブラウザで設定できるベースフォントサイズでWebページのすべての測定値を定義することだということです。 たとえば、Chromeではを実行してこれを行うことができますsettings -> show advanced settings -> web content -> font size: very large。遠く離れた大型の高解像度モニターを使用している場合、これを行うことができます。 サイズ設定におけるemsとpxの違いを示すプランカーを作成しました。 #div1 { width: 320px } #div2 { width: 20em; } ブラウザでフォントサイズを中に設定すると、これらのdivは同じサイズになり、ベースフォントサイズは16pxになるため、20em = 320pxになります。 ただし、ブラウザのフォントサイズを非常に大きく変更すると、emsで測定されたdivのサイズが大きくなっていることがわかります。 ただし、たとえばbodyタグでフォントサイズを定義すると、この効果は無効になります。 body { font-size: 16px; } なぜなら今、私のCSSはブラウザによって設定されたフォントサイズをオーバーライドしているからです。 ページをズームしてもフォントが拡大されるだけの古いブラウザの時代にはemが重要だったと思います。しかし、最近の最新のブラウザはピクセルとフォントの両方を拡大し、ズームの問題を解決していません。 Webを見回す-多くのWebサイトでは、bodyタグにフォントサイズを設定しています。 たとえば、スタックオーバーフローは、bodyタグでfont-sizeを13pxに設定します。ブラウザでフォントサイズを設定しても、スタックオーバーフローのレイアウトにはほとんど影響しません。 Google検索結果はこれを行いません。 (これらのスクリーンショットはいずれも、非常に大きいクロムフォントサイズに設定して、100%ズームで撮影したものです)。 したがって、bodyタグでフォントサイズを設定することは、ユーザー自身のアクセシビリティ設定を妨げるため、悪い考えだと考えることができます。しかし、ユーザーがサイズを大きくするためにズームできることを考えると(比例してすべてのピクセルも増加します)-これは本当の問題とは思えません。
16 css 

6
関数に渡される引数の量を制限することに基づく言語
このアイデアは、+、-、%などのファクト演算子に触発されており、1つまたは2つの引数が渡され、副作用がない関数と見なすことができます。私または他の誰かが、3つ以上の引数の受け渡しを停止し、戻り値を介してのみ機能する言語を作成すると仮定します。 a)そのような言語はコードを理解しやすくするでしょうか? b)コードの流れはより明確になりますか?(より多くのステップを強制し、潜在的に少ない対話を「非表示」にします c)制限により、より複雑なプログラムでは言語が非常に大きくなりますか? d)(ボーナス)賛否両論に関するその他のコメント 注意: 2つの決定を行う必要があります。1つ目は、main()または同等の外部でのユーザー入力を許可するかどうか、および配列/構造体を渡すときに何が起こるかについてのルールです。たとえば、1つの関数で複数の値を追加したい場合、その関数を配列にまとめることで制限を回避できます。これは、配列または構造体がそれ自体と対話することを許可しないことで停止できます。これにより、たとえば、各数値をその位置に応じて異なる量で除算できます。

2
なぜC#でオーバーライドを非同期にできるのですか?
C#では、メソッドをオーバーライドするときに、元のメソッドがオーバーライドしていなかった場合にオーバーライドを非同期にすることが許可されています。これは貧弱な形のようです。 私にこれをもたらした例はこれでした-私は、負荷テストの問題を支援するために連れてこられました。同時ユーザー数が約500の場合、ログインプロセスはリダイレクトループになります。IISは、「非同期操作がまだ保留中に非同期モジュールまたはハンドラーが完了しました」というメッセージで例外を記録していました。一部の検索では、誰かが悪用していると思うようになりましたがasync void、ソースをすばやく検索しても何も見つかりませんでした。 悲しいことに、「async \ s [^ T]」のようなものを探すべきだったときに、「async \ svoid」(正規表現検索)を探していました(タスクが完全に修飾されていないと仮定すると...ポイントが得られます)。 後で見つけたのasync override void onActionExecuting(...は、ベースコントローラーです。明らかにそれが問題にならなければなりませんでした。これを修正することで(現時点では同期化することで)問題は解決しました。 質問に戻る:なぜ、呼び出し元のコードがそれを待つことができないのに、なぜオーバーライドを非同期としてマークできるのでしょうか?
16 c#  async 

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