ソフトウェア工学

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

5
リストのテスト…同じテストですべてですか、それとも各条件に対して1つのテストですか?
リストで期待されていることを関数が実行することをテストしています。だから私はテストしたい f(null) -> null f(empty) -> empty f(list with one element) -> list with one element f(list with 2+ elements) -> list with the same number of elements, doing what expected そうするために、最善のアプローチは何ですか? 「WorksAsExpected」という名前で、同じ(メソッド)テストですべてのケースをテストする 各ケースに1つのテストを配置し、こうして 「WorksAsExpectedWhenNull」 「WorksAsExpectedWhenEmpty」 「WorksAsExpectedWhenSingleElement」 「WorksAsExpectedWhenMoreElements」 私が考えていなかった別の選択肢:-)
21 unit-testing  tdd 

4
C#7で「Try」メソッドを記述する最もエレガントな方法は何ですか?
TryDequeueさまざまな.NET TryParseメソッドに似たパターンを使用するメソッドを持つタイプのQueue実装を記述していoutます。アクションが成功した場合はブール値を返し、パラメーターを使用して実際のデキューされた値を返します。 public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message); 今、私outはできる限りparams を避けるのが好きです。C#7では、変数のデリケートが提供され、それらの操作が簡単になりますが、paramsは有用なツールよりも必要な悪であると考えています。 このメソッドに必要な動作は次のとおりです。 デキューするアイテムがあれば、それを返します。 デキューするアイテムがない場合(キューが空の場合)、適切に機能するのに十分な情報を発信者に提供します。 アイテムが残っていない場合、nullアイテムを返すだけではいけません。 空のキューからデキューしようとしても例外をスローしないでください。 現在、このメソッドの呼び出し元は、ほとんど常に次のようなパターンを使用します(C#7 out変数構文を使用)。 if (myMessageQueue.TryDequeue(out Message dequeued)) MyMessagingClass.SendMessage(dequeued) else Console.WriteLine("No messages!"); // do other stuff 最悪ではない、とすべてが語った。しかし、私はこれを行うためのより良い方法があるかもしれないと感じずにはいられません(私はまったくないことを完全に喜んで認めています)。値があればそれを取得したいときに、呼び出し側が条件付きフローを分割する方法が嫌いです。 この同じ「試行」動作を達成するために存在する他のパターンは何ですか? コンテキストでは、このメソッドはVBプロジェクトで呼び出される可能性があるため、両方でうまく機能するものに対するボーナスポイントです。ただし、この事実はあまり重要ではありません。
21 c# 

4
定義としてC#の抽象クラスを使用する
C ++開発者として、私はC ++ヘッダーファイルに非常に慣れており、コード内に何らかの「ドキュメント」を強制することが有益であることがわかりました。そのため、私は通常、C#コードを読む必要があるときに悪い時間を過ごします。私が作業しているクラスのそのようなメンタルマップを持っていません。 ソフトウェアエンジニアとして、プログラムのフレームワークを設計していると仮定しましょう。C ++ヘッダーで行うのと同様に、すべてのクラスを抽象的な未実装クラスとして定義し、開発者に実装させるのはあまりにもクレイジーでしょうか? 誰かがこれをひどい解決策だと思う理由がいくつかあるのではないかと推測していますが、その理由はわかりません。このようなソリューションでは、何を考慮する必要がありますか?

3
バックエンドとフロントエンドのWebアプリケーションを完全に分離し、それらが(JSON)REST APIと通信できるようにするのは通常の設計ですか?
私は新しいビジネスWebアプリケーションを作成しています。 それぞれの領域から最高の技術を使用します。堅牢なORMを備えた信頼性の高いバックエンドフレームワークが必要です。そして、フロントエンドアプリケーションの最新のHTMLおよびJavascript機能を使用した、最も高度なSPA(単一ページアプリケーション)フレームワークが必要です。 さまざまなタイプのアプリケーション(たとえば、Webアプリケーション、モバイル(Android)、および場合によっては他のタイプ(スマートデバイスなど))から使用するバックエンドエンティティとビジネスサービスを公開します。 したがって、両方の要件を満たすために、バックエンドアプリケーションとフロントエンドアプリケーションでアプリケーションを完全に分離し、REST API(JSON)を使用してそれらの間の通信を整理する傾向があります。これは健全なアプローチですか? 多くのWebアプリケーションテクノロジーには、サーバーサイドアプリケーションがビューの生成を多少制御し、ビューからの応答を部分的に処理するビューレイヤーが統合されているため、このような分離は明白な設計ソリューションではありません(たとえば、ビューレイヤーを持つSpringMVC、ビューを持つPHP Yii Java JSF / Faceletsは、サーバー上のコンポーネントの状態を完全に保存します)。そのため、より強力な結合を提案し、開発時間の短縮とより標準的な道のりを約束する多くの技術があります。だから-広く使われていない方法で技術を使い始めるとき、私は注意しなければなりません。 私が理解したように、完全に分離されたSPAフロントエンドは通常、サードパーティAPIを使用する必要性から生じます。しかし、バックエンドとフロントエンドの両方が1つの会社によって開発されたとき、そのようなデカップリングサウンドデザインはありますか? 私が現在選択しているテクノロジーは、Java / Springバックエンドとフロントエンド用のAngular2 / Web Components / Polymerです。この質問は一般的な設計に関するものであり、具体的な技術の選択に関するものではないため、それはこの質問とは無関係です。

5
自明ではない条件文をループの初期化セクションに移動する必要がありますか?
stackoverflow.comのこの質問からこのアイデアを得ました 一般的なパターンは次のとおりです。 final x = 10;//whatever constant value for(int i = 0; i < Math.floor(Math.sqrt(x)) + 1; i++) { //...do something } 私がやろうとしているのは、条件付きステートメントが複雑なものであり、変わらないということです。 ループの初期化セクションで宣言する方がいいですか? final x = 10;//whatever constant value for(int i = 0, j = Math.floor(Math.sqrt(x)) + 1; i < j; i++) { //...do something } これはもっと明確ですか? 条件式が次のように単純な場合 final …

5
実装を書いた後、テストの間違いを修正する方法
ロジックを正しく実装した後でもテストが失敗する場合(テストに間違いがあるため)、TDDでの最善のアクションは何ですか? たとえば、次の関数を開発するとします。 int add(int a, int b) { return a + b; } 次の手順で開発するとします。 テストの書き込み(まだ機能なし): // test1 Assert.assertEquals(5, add(2, 3)); コンパイルエラーが発生します。 ダミー関数の実装を作成します。 int add(int a, int b) { return 5; } 結果:test1合格。 別のテストケースを追加します。 // test2 -- notice the wrong expected value (should be 11)! Assert.assertEquals(12, add(5, 6)); 結果:test2失敗しますが、test1成功します。 実際の実装を書く: int …
21 tdd  mistakes 

3
C ++クラスコンストラクターでエラーが発生した場合の対処方法
コンストラクターがいくつかの操作を行うCPPクラスがあります。これらの操作の一部は失敗する場合があります。コンストラクタは何も返さないことを知っています。 私の質問は、 コンストラクターでメンバーを初期化する以外の操作を実行できますか? コンストラクターの一部の操作が失敗したことを呼び出し元の関数に伝えることは可能ですか? new ClassName()コンストラクターでエラーが発生した場合にNULL を返すことはできますか?

2
大きなバイナリファイルを含むGitリポジトリを最適化する
私たちのプロジェクトは約11GBで、そのうち10個はバイナリデータ(.png画像)です。その結果、a git diffまたはgit status操作は1分以上かかります。幸いなことに、すべてのデータファイルは素晴らしい名前のフォルダに分けられていますdata。割り当ては、「バイナリファイルの圧縮、差分、およびその他のコストのかかる操作を避けます」です。 プロジェクトを2つのリポジトリに分割することを検討しました。次にdata、外部リポジトリになり、メインのソースコードリポジトリによってチェックアウトされます。特にデータファイルを操作するアーティストにとって、リポジトリの同期を維持するオーバーヘッドは大きすぎると判断されました。 gitにこれらのファイルを明示的にバイナリと伝え、差分からファイルを除外することを検討しましたが、これらは質問に対する部分的な解決策にすぎないようです。 git属性が解決策だと思いますが、どうやって?または、モノリシックリポジトリよりも優れたアーキテクチャがありますか?
21 git  binary 

4
Gitの.git / objects /フォルダーが多くのSHAプレフィックスフォルダーに分割されているのはなぜですか?
Gitは、オブジェクト(Blob、ツリー)を.git/objects/フォルダーに内部的に保存します。各オブジェクトは、オブジェクトのコンテンツから計算されるSHA1ハッシュによって参照できます。 ただし、オブジェクトは.git/objects/フォルダ内に直接保存されません。代わりに、各オブジェクトは、SHA1ハッシュのプレフィックスで始まるフォルダー内に保存されます。そのため、ハッシュb7e23ec29af22b0b4e41da31e868d57226121c84を持つオブジェクトは次の場所に保存されます.git/objects/b7/e23ec29af22b0b4e41da31e868d57226121c84 Gitがオブジェクトストレージをこのように細分するのはなぜですか? git-scmのGitの内部のページなど、私が見つけることができるリソースは、howではなく、howだけを説明しました。

3
レクサーがそのパーサーに返すトークンのデータ型は何ですか?
タイトルで述べたように、レクサーはどのデータ型をパーサーに返す/与える必要がありますか?ウィキペディアが持っている字句解析の記事を読んだとき、それは次のように述べました: コンピュータサイエンスでは、字句解析とは、一連の文字(コンピュータプログラムやWebページなど)を一連のトークン(識別された「意味」を持つ文字列)に変換するプロセスです。 しかし、上記の声明と完全に矛盾して、別のサイトで質問した別の質問(好奇心があればコードレビュー)が回答されたとき、回答者は次のように述べました: 字句解析プログラムは通常、文字列を読み取り、これを語彙素のストリームに変換します。語彙素は数字のストリームである必要があります。 そして彼はこの視覚を与えました: nl_output => 256 output => 257 <string> => 258 後の記事で彼はFlex、既存のレクサーについて言及し、それを使って「ルール」を書くほうが、レクサーを手で書くよりも簡単だと言った。彼は私にこの例を与え始めました: Space [ \r\n\t] QuotedString "[^"]*" %% nl_output {return 256;} output {return 257;} {QuotedString} {return 258;} {Space} {/* Ignore */} . {error("Unmatched character");} %% 私の洞察を深め、より多くの情報を得るために、WikipediaのFlexに関する記事を読みました。Flexの記事では、トークンを使用して、次の方法で一連の構文規則を定義できることが示されました。 digit [0-9] letter [a-zA-Z] %% "+" { return PLUS; } "-" …
21 data-types  lexer  flex 

4
依存性注入専用に設計されたプログラミング言語はありますか?
多くの一般的なプログラミング言語は、依存性注入をサポートできるほど柔軟です。ライブラリまたはフレームワークのサポートがなくても。しかし、プログラミングの問題を解決するのに十分な言語がチューリングである場合でも、言語は、その中で簡単なことと困難なことに影響を与える選択を行います。 依存関係の注入を簡単にし、逆に隠された依存関係を作成しにくくするために特別に設計された言語はありますか? 明確化: 一部の言語の制限(Javaを見る)のために、多くの人々は依存関係注入の一部として配線と構築の支援を考えています。ここでは、依存関係が副作用で簡単に隠されないことを意味するために、DI用に設計された言語のみを意図しています。構成システムに対する規約も同様に追加されるのは、肉汁だけです。 私は言語の推奨を探していません。これは歴史的な問題です。言語作成者はこれを明示的に始めたことがありますか?

6
科学的コードは、一般的なコーディング標準を無視するのに十分な領域ですか?
最近、次の事実について心を包もうとしています。 一方では、「健康」、「クリーン」、「よく書かれた」などのコードと見なされるものについて、コーディングのガイドラインと標準が多数あります。ここでも広く議論されているように見える「クリーンコード」を参照してください。ルールの例:7行の長いメソッドと1または2レベルのインデント。従わないコードは、どういうわけか保守性が悪いために死ぬことが予想されます。 一方で、OpenCV、OpenCascade、VTKなどと連携するようになりました。これは科学的なコードです。彼らは2ページの長いメソッドを持っています(私自身)、OpenCascadeには10個のファイルに分割されたメソッドまたはクラスがあります(ここではジョークはありません)、VTKも混乱することがあります。しかし、これらのプロジェクトは繁栄し、維持され、広く使用されています! キャッチはどこですか?科学的で数学が重いコードを、それが機能するように書くことは許されていますか?あなたは、もしあれば、そのようなプロジェクトのための独立した標準のセットですか? 素朴な質問かもしれませんが、私は物事を行う方法としない方法を設定しようとするプログラミングの無効のようです。これは高校で働くことを教えられた方法です。私は卒業して以来、私がやらなければならないこと、主にプログラミングについてのガイドラインのサポートがほとんどありませんでした。


2
可変幅タイプは、最新のCの固定タイプに置き換えられましたか?
本日、Code Reviewのレビューで興味深い点に出会いました。@Veedracはにrecommened この回答可変サイズの種類(たとえばことintとがlong)のような固定サイズの種類に置き換えることuint64_tとuint32_t。その答えのコメントからの引用: intおよびlongのサイズ(およびそれらが保持できる値)はプラットフォームに依存します。一方、int32_tは常に32ビット長です。intを使用するということは、コードがプラットフォームごとに異なる動作をすることを意味しますが、これは一般的には望んでいないことです。 共通の型を修正しないという標準の背後にある理由は、@ supercatによって部分的に説明されています。Cは、当時システムプログラミングに通常使用されていたアセンブリとは対照的に、アーキテクチャ間で移植できるように作成されました。 設計意図はもともと、int以外の各タイプがさまざまなサイズの数を処理できる最小のものであり、そのintが+/- 32767を処理できる最も実用的な「汎用」サイズであると思いました。 私については、私はいつも使用intしており、代替案についてはあまり心配していません。私はいつも、これが最高のパフォーマンス、ストーリーの終わりを持つ最もタイプだと思っていました。固定幅が便利だと思った唯一の場所は、ストレージ用またはネットワーク経由の転送用にデータをエンコードする場合です。他の人が書いたコードで固定幅タイプを見ることはめったにありません。 私は70年代に行き詰まっintていますか、それともC99以降の時代に使用する理論的根拠はありますか?

6
渡された引数を使用してメソッドを許可する必要がありますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 foo(String bar)特定の条件を満たす文字列に対してのみ動作するメソッドがあるとします。たとえば、小文字である必要があり、空または空白のみでなく、パターンに一致する必要があります[a-z0-9-_./@]+。メソッドのドキュメントには、これらの基準が記載されています。 メソッドはこの基準からのすべての逸脱を拒否する必要がありますか、それともメソッドはいくつかの基準についてより寛容である必要がありますか?たとえば、初期メソッドが public void foo(String bar) { if (bar == null) { throw new IllegalArgumentException("bar must not be null"); } if (!bar.matches(BAR_PATTERN_STRING)) { throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING); } this.bar = bar; } そして2番目の寛容な方法は public void foo(String bar) { if (bar == …
21 java  parameters 

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