ソフトウェア工学

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

5
共通ライブラリは良いアイデアですか?
私はいつも「共通ライブラリ」が良いアイデアだと思っていました。つまり、いくつかの異なるアプリケーションでしばしば必要とされる共通の機能を含むライブラリを意味します。コードの重複/冗長性が少なくなります。 私は最近、これは実際には悪い考えであり、「アンチパターン」であると言ったほどの記事を見つけました(今は見つかりません)。 このアプローチには利点がありますが。バージョン管理と変更管理は、このライブラリを使用するアプリスイートの回帰テストを意味します。 私は、新しい(Golang)プロジェクトにちょっと不満を感じています。コードの重複排除は長年にわたって私に打ち込まれてきましたが、今回はそれを試してみるべきだと思います。 これを書いている間、私はこの「共通ライブラリ」アプローチがアーキテクチャのスキミングの結果であると考え始めていますか?おそらく私の設計にはもっと考えが必要ですか? 考えを聞いて興味を持っています。
16 design  go 

4
プログラミング設計パターンを把握できない
私は過去4年間javascriptを扱ってきました。私は自分の問題解決スキルに非常に自信があり、コードの品質が向上していることがわかります。私はコミュニティの最新情報を取得しようとしていますが、現在ES2015とReact.jsを使用しています。しかし、プログラミングの設計パターンをまったく把握できないと感じています。私はこれについてのリソースを見つける場所を知っており、私はすでにそれについての本を読んでいます。私はプロジェクトの構造について意思決定をするのに先輩に頼っていますが、それに取り組むのに問題はありません。 自分で何かを開始する必要があるときはいつでも、次の2つのパスを探します。もっと小さいものを使用している場合は、モジュールパターンを使用します。このテーマに関する理解が深まると、より良い決定を下せるようになることはわかっていますが、今のところは完全に失われています。 これに関する優れた教育を探すべきですか?このテーマに関する指導者は必要ですか?私はただ愚かですか?これは本当に理解しにくいですか?

9
ベストプラクティスに対する冗長な状態チェックはありますか
私は過去3年間ソフトウェアを開発してきましたが、最近、自分が良い慣習にどれほど無知であるかに目覚めました。これにより、Clean Codeという本を読み始めることになりました。これは私の人生をより良い方向に変えていますが、プログラムを書くための最良のアプローチのいくつかについて洞察を得るのに苦労しています。 Pythonプログラムがあります。 argparse required=Trueを使用して、両方ともファイル名である2つの引数を適用します。最初は入力ファイル名、2番目は出力ファイル名 readFromInputFile入力ファイル名が入力されたことを最初に確認する機能があります writeToOutputFile出力ファイル名が入力されたことを最初に確認する機能があります 私のプログラムは十分に小さいので、#2と#3のチェックは冗長であり、削除する必要があると信じるようになるため、両方の機能を不要なif状態から解放します。しかし、「二重チェックは大丈夫」であると信じるようになり、引数の解析が行われない別の場所から関数を呼び出すことができるプログラムでは正しいソリューションになるかもしれません。 (また、読み取りまたは書き込みが失敗した場合、try except適切なエラーメッセージを生成する各関数があります。) 私の質問は、すべての冗長な状態チェックを避けるのが最善ですか?プログラムのロジックは非常に堅固であるため、チェックは一度だけで済みますか?これまたはその逆を説明する良い例はありますか? 編集:答えてくれてありがとう!それぞれから何かを学びました。非常に多くの視点を見ると、この問題にどのようにアプローチし、自分の要件に基づいて解決策を決定する方法についての理解が深まります。ありがとうございました!

5
C ++での例外の慣用的な使用法
isocpp.org例外よくある質問の状態 関数の使用におけるコーディングエラーを示すために、throwを使用しないでください。assertまたはその他のメカニズムを使用して、プロセスをデバッガーに送信するか、プロセスをクラッシュさせて開発者がデバッグするためのクラッシュダンプを収集します。 一方、標準ライブラリはstd :: logic_errorとそのすべての派生物を定義します。これらは、他のことに加えてプログラミングエラーを処理することになっているように思えます。プログラミングエラーではなく、空の文字列をstd :: stof(invalid_argumentをスローします)に渡しますか?「1」/「0」以外の文字を含む文字列をプログラミングエラーではなくstd :: bitset(invalid_argumentをスローします)に渡しますか?プログラミングエラーではなく、無効なインデックス(out_of_rangeをスローします)でstd :: bitset :: setを呼び出していますか?そうでない場合、テストするプログラミングエラーは何ですか?std :: bitset文字列ベースのコンストラクタはC ++ 11以降にのみ存在するため、例外の慣用的な使用を念頭に置いて設計されている必要があります。一方、logic_errorは基本的にまったく使用すべきではないと言われました。 例外が頻繁に発生する別のルールは、「例外的な状況でのみ例外を使用する」です。しかし、ライブラリ関数はどのような状況が例外的であるかをどのように認識するのでしょうか?一部のプログラムでは、ファイルを開けないことは例外です。他の人にとっては、メモリを割り当てることができないことは例外ではないかもしれません。そして、その間に何百ものケースがあります。ソケットを作成できませんか?接続できない、またはソケットまたはファイルにデータを書き込むことができませんか?入力を解析できませんか?例外的かもしれませんが、そうでないかもしれません。関数自体は、一般的に間違いなく知ることができず、どの種類のコンテキストが呼び出されているのかわかりません。 だから、特定の機能に例外を使用するかどうかをどのように決定するのですか?実際には一貫性のある唯一の方法は、すべてのエラー処理に使用するか、または何もしないことです。標準ライブラリを使用している場合、その選択は私のために行われました。
16 design  c++  exceptions 

1
ES6に細い矢印の機能がないのはなぜですか?
ES6はファットアロー関数(=>)を追加しました。これには、通常の関数とは2つの大きな違いがあります。 短い構文(単一式の本体を使用する場合の暗黙的な戻りを含む) this周囲のスコープから継承する これらは両方とも非常に便利な機能ですが、その価値とアプリケーションは完全に分離されているように見えます。私が短い構文の機能を使用したい場合は、私がいることを奇妙に思える持っても使用するthis-modifying行動を。およびその逆。これら2つの機能が言語への単一の追加として実装されている理由はわかりません。 暗黙の戻り値と簡潔さのために短い構文関数を使用したい場合(完全なものfunction (..) { return ...}が少し読みにくいコンテキストで)、this呼び出し側のコンテキストを参照するために関数で使用したいのですが?これを行う方法はありません。 CoffeeScriptにはスタイル->と=>スタイルの両方の機能があり、明らかにES6 =>はそこからスタイルを借用しているようです。私の質問は、なぜES6も->スタイルを取り入れなかったのですか?
16 javascript  es6 

4
整数識別子を列挙型にマッピングすることの欠点は何ですか?
私はこのような識別子のカスタム型を作成することを考えています: public enum CustomerId : int { /* intentionally empty */ } public enum OrderId : int { } public enum ProductId : int { } これの主な動機は、orderItemIdを予期していた関数に誤ってorderItemIdを渡すようなバグを防ぐことです。 列挙型は、典型的な.NET Webアプリケーションで使用するすべてのものとシームレスに動作するようです。 MVCルーティングは正常に動作します JSONシリアル化は正常に動作します 私がうまくいくと思うすべてのORM だから今、私は「なぜ私はこれをするべきではないのだろうか?これらは私が考えることができる唯一の欠点です。 他の開発者を混乱させる可能性があります 非整数の識別子がある場合、システムに不整合が生じます。 のように、追加のキャストが必要になる場合があり(CustomerId)42ます。しかし、ORMおよびMVCルーティングは通常、enum型の値を直接渡すので、これが問題になるとは思いません。 だから私の質問は、何が欠けているのですか?これはおそらく悪い考えですが、なぜですか?
16 c# 

3
自分自身を修正したと思われるバグに対処する方法は?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は、内部システムのWebアプリケーション開発者です。ユーザーがバグがあることを報告します。 バグは、いくつかの単語を表示できなかったことです。レポートには、バグを明確に示す画面キャプチャが含まれています。しかし、レポートはほぼ1か月前のものであり、バグを本番環境で再現することはできません。 クライアントとユーザーにどのように返信すればよいですか?

10
コーディング標準に関するプロジェクトリーダーとの不一致[終了]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた3年前。 そのため、私は過去1年間、プロジェクトリーダーと共に新しいプロジェクトに取り組んでいます。 最初は、別のgitリポジトリにある独自のサブプロジェクトがありましたが、彼のコードとのやり取りはほとんどなかったので、コードのにおいは気にしませんでした。約6か月後、プロジェクトでより大きな役割を担っていたため、彼のコードの機能を維持および追加し始めました。 私は両方のサブプロジェクト(チームが成長しようとしています。彼はまだ私の上にいます)の主任開発者です。 中括弧、大文字の関数、二重引用符の使用法(二重および単一の隠しロジック付き)、===を使用しない、巨大な関数を持つ巨大なクラスはありません。一番下の行は、より良いかもしれません。 通知/警告をオフにするPHPのオプションへの依存。コードには、変数と配列キーの未使用の使用法がたくさんあります。変数はifの内部で定義されます。 上記の2つの問題に対する議論: 人々にコーディングスタイルを強制したくない。 より短い/より効率的なコードに適した言語機能とみなされます。 いくつかのルールが必要であり、コードは防御的である必要があると思います。PHPStormのデフォルト設定をフォーマットに使用し、中括弧とコミュニティで受け入れられている命名規則を使用することを申し出ました。 私は両方のプロジェクトを切り離せないので、同じガイドラインを使用するように調整したいと思います。 私は間違っていますか?個人的な好みを課しますか?

2
名前のスペルを間違えにくいものを見つけるには?
ここに、データマイニングと洗練されたアルゴリズムを使用して解決できると思われる質問がありますが、その方法はよくわかりません。どのデータソースを使用し、どのアルゴリズムを適用するかについてのポインタは大歓迎です。 背景:私はポーランドウクライナ人の赤ちゃんを期待しているルーマニアハンガリー人であり、どの国に落ち着きたいのかについて、まだ心を決めていません。ご想像のとおり、特定の名前を選択することは非常に重要であり、熱い議論です。私の側から見ると、ある国から別の国に移動したときに誰かが私の名前のスペルを間違えたときに経験しなければならないすべての面倒にまだ心を痛めています。たとえば、場合にのみ、あなたが「Adriさんのことになったことを見つけるために、あなたはルーマニアに祝福されるだろう「エイドリアン」と呼ばれたE n」は、いくつかの公式のフランスの文書です。ですから、私の唯一の要件は、ヨーロッパの一部の国で赤ちゃんの名前のつづりを間違えないようにすることです。 問題の声明:フランス、ドイツ、スウェーデン、ポーランド、ルーマニアなどの国のセットを考えると、適切に発音された場合、地元の人々がつづりを間違えにくい名のリストを見つけてください。 より正式には、p(c、n)を、国cで名前nのスペルが間違っている確率を返す関数とします。与えられたCに国のセットをして p₀確率を、見つけるNように与えられた名前のセット すべてのためのn ∈ NおよびC ∈ C、P(C、N)<p₀ 最初の考え:中心的な問題はp(c、n)を実装する方法です。ヒューリスティックで近似することを試みることができます。明らかに、次の2つの場合に名前のつづりが間違っている可能性があります。 その国ではほとんど使われていません。 別の国の名前に似ていますが、その国ではあまり使われていません。 これら2つの質問に効率的に回答するために、ウィキペディアなどのインターネットをどのように使用できるかわかりません。1つの国で、かなり頻繁に使用される名前のみをどのようにリストしますか?同様に綴られたものをどのように探しますか?

2
Webアプリケーションに個別のAPIサーバーとUIサーバーを使用する利点
職場では、2年近く開発中の大規模な内部アプリケーションがあります。私は最近プロジェクトに参加しましたが、アーキテクチャの一部には少し困惑しているので、建築家に同じ質問をする前にここの誰かがアドバイスを提供できることを願っています)。 以下が少し長い場合は申し訳ありませんが、質問する前にシステムが何であるかをよく描きたいと思います:) システムのセットアップ方法は、1つのメインWebアプリケーション(asp.net、AngularJS)があり、ほとんどの場合、他のさまざまなサービスからのデータを集約するだけです。したがって、基本的には、AngularJSアプリケーションのホストです。文字通り、クライアント側をブートストラップする1つのMVCコントローラーがあり、他のすべてのコントローラーはWebAPIコントローラーです。 クライアント側からの呼び出しは、これらのコントローラーによって処理されます。これらのコントローラーは、Webアプリケーションをホストするだけのボックスに常に展開されます。現在、このようなボックスが4つあります。 ただし、呼び出しは最終的にさらに別のWebAPIアプリケーションのセットにルーティングされます(通常、これらはセキュリティ、顧客データ、製品データなどのビジネスエリアごとです)。これらのWebAPIはすべて、専用のボックスにも一緒にデプロイされます。また、これらのボックスが4つあります。 1つの例外を除き、これらのWebAPIは組織の他の部分では使用されません。 最後に、これらのWebAPIは「バックエンド」サービスをさらに別のセットで呼び出します。これは通常、さまざまなERPシステムおよびデータストア(制御不能)の上に置かれたレガシーasmxまたはwcfサービスです。 アプリケーションのビジネスロジックのほとんどは、これらのWebApiにあります。たとえば、レガシーデータの変換、集約、ビジネスルールの実行など、通常のタイプのものです。 私が混乱しているのは、WebApplicationと、それを提供するWebAPIをこのように分離することで得られる利点の可能性です。他の誰もそれらを使用していないため、スケーラビリティの利点はありません(つまり、APIサーバーの負荷の増加はWebサーバーの負荷の増加を意味するため、別の4つのAPIボックスを追加しても負荷はありません)したがって、WebサーバーとApiサーバーの比率は1:1でなければなりません) また、ブラウザ=> HTTP => WebApp => HTTP => WebAPI => HTTP =>バックエンドサービスを追加のHTTP呼び出しを行う必要があるという利点もまったくありません。(WebAppとWebAPI間のHTTP呼び出しが私の問題です) そのため、現在は、現在のWebAPIを個別のソリューションから、WebApplicationソリューション内の個別のプロジェクトに移動し、間に単純なプロジェクト参照と単一の展開モデルを配置することを検討しています。したがって、最終的にはクラスライブラリになります。 展開に関しては、これは4 + 4ではなく8つの「フルスタック」Webボックスがあることを意味します。 新しいアプローチのメリットは次のとおりです。 WebアプリケーションとWebAPIサーバー間のシリアル化/逆シリアル化のサイクルが1つ少ないため、パフォーマンスが向上します。 WebアプリケーションサーバーとWebApiサーバーのそれぞれの発信境界と着信境界のDTOとマッパーに関して削除できる(つまり、メンテナンス/テストする必要がない)大量のコード。 意味のある自動化された統合テストを作成する能力が向上しました。バックエンドサービスを単純​​にモックし、中間層のHTTPジャンプの混乱を回避できるからです。 だから質問は:私は間違っていますか?WebApplicationボックスとWebAPIボックスを分離したという基本的な「魔法」を見逃していませんか? 私はいくつかのN-Tierアーキテクチャの資料を調査しましたが、状況に具体的な利益をもたらすことができるものを見つけることができないようです(スケーラビリティは私が知る限り問題ではなく、これは内部アプリなのでWebAPIアプリケーションに関するセキュリティは問題になりません。) また、システムを提案されたセットアップに再編成した場合、メリットの点で何が失われますか?

2
UDPデータペイロードにCRCを含める必要がありますか?
私が働いていた会社の場合、ソケットレシーバーを実装する必要がありました。ソケットレシーバーのほとんどは、特殊なセンサーハードウェアからローカル接続を介してUDP形式でデータを取得していました。問題のデータは整形式のUDPパケットでしたが、興味深いことに、データペイロードは常に残りのデータを使用して形成されたCRC16チェックサムで終了しました。 私は仕様に従ってチェックを実装しましたが、これが必要かどうかはいつも疑問でした。結局のところ、UDPプロトコル自体は16ビットCRCを伝送していませんか?したがって、UDPパケットは失われたり順序が乱れたりする可能性がありますが、OSのプロセスに到達する前にネットワークハードウェアによって破棄されることなく破損することはできないという印象を受けました。または、私が見逃している特別なユースケースがありますか? 私が防衛産業で働いていたことは付け加えておく価値があります。想像できると思いますが、これはこのようなことすべてについて超明示的であることが好きなので、単なる「セキュリティOCD」のケースであったのかと思います。 ..

1
REST APIセキュリティ:HMAC /キーハッシュとJWT
私はこの記事読んで数年前ですが、あなたのREST APIを確保する巧妙な方法を説明します。基本的に: 各クライアントには一意の公開/秘密キーペアがあります クライアントとサーバーのみが秘密鍵を知っています。有線で送信されることはありません 各リクエストで、クライアントはいくつかの入力(リクエスト全体、現在のタイムスタンプ、およびプライベートキー)を受け取り、それらをHMAC関数で実行してリクエストのハッシュを生成します 次に、クライアントは通常のリクエスト(公開キーを含む)とハッシュをサーバーに送信します サーバは(提供された公開鍵に基づいて)クライアントの秘密鍵を検索し、要求はの被害者ではないことを検証(確かに私は理解していないことを)いくつかのタイムスタンプのチェックを行い、リプレイ攻撃 すべてが順調であれば、サーバーは秘密鍵と同じHMAC関数を使用して、リクエストの独自のハッシュを生成します 次に、サーバーは両方のハッシュ(クライアントが送信したハッシュとクライアントが生成したハッシュ)を比較します。それらが一致する場合、要求は認証され、続行が許可されます それから私はJWTを偶然見つけました。ただし、最初の記事ではJWTについてまったく言及していないため、JWTが上記の認証ソリューションと異なるのかどうか、またそうである場合はその方法について疑問に思っています。

4
GUIの壊れやすいではなく、保守可能なユニットテストを記述する方法
GUIアプリのUIユニットテストを作成してみましたが、最初に作成したときにはうまく機能しますが、設計が変更されるたびに(つまり、非常に頻繁に)壊れるという問題に直面しています。GUIの保守可能な単体テストを作成するためのガイドラインを見つけるのに苦労しています。 今のところ、私が発見したことの1つは、「このコンポーネントは入力データをどこかに表示する必要がある」というテストが適切であることです(HTMLでは非常に簡単です)。通常、コンポーネントの特定の部分の特定の状態を確認するテストは脆弱です。クリック-クリック-クリック-期待のようなテストは、ユーザーの行動と基礎となるビジネスロジック(最も重要な部分)を追跡しようとするため、通常は脆弱です。良いテストを書くにはどうすればいいですか? もっと正確に言うと、UIで何をテストできるかについて、正確なテスト方法ではなく、いくつかのパターンを知りたいです。命名規則と固定識別子は優れていますが、コアの問題、つまりGUIが大きく変わるという問題は解決しません。変化する可能性が最も低い動作をテストしたいと思います。テストする正しいものを見つける方法は?

2
セマンティックバージョニングでは、バージョン番号に4つのコンポーネントを使用できますか?
私が見たセマンティックバージョニングのすべての例は、使用中の3つのコンポーネントを示しています。ピリオド文字は2つまでです。では$DAYJOB、リリース番号で4つのコンポーネントを使用しています。 5.0.1.2 セマンティックバージョニングはこれを許可しますか? そして、より高レベルでより議論の余地のある副質問として、それは本当に重要なのでしょうか?セマンティックバージョニングを実施するのは良い考えだと思い始めましたが、最終的にはPCIなどのエンティティがそれをオーバーライドします。 PCIコメントについて明確にすべきでした。問題は、主要コンポーネントとマイナーコンポーネントが変更されたときに監査とそのコストが影響することであり、必ずしも真の新機能ではありません。たとえば、支払いに関連する機能が導入された場合、PCIのマイナー番号を増やします。ただし、GUIの何かに関連するまったく新しい機能を追加しても、追加されません。パッチのみが変更されます。したがって、この場合、他の誰かがそれらの決定を下すため、開発者としての問題について実際には発言権を取得しません。

1
モジュロ/剰余を意味するパーセント記号(%)の使用は、どのプログラミング言語で発生しましたか?
モジュロ/剰余を意味するパーセント記号(%)の使用は、どのプログラミング言語で発生しましたか? この前の投稿1は、シンボル%が選択された可能性が高いことを説明しています。これは、除算に関連する操作に賢いスラッシュが含まれているためです。また、Cによるシンボルの使用の影響についても言及しています。しかし、それがCに由来するかどうかはわかりません。Bプログラミング言語はCの前身であり、Bのユーザーガイド(PDF、ページ12)を見つけました。 演算子%はモジュロを示します。両方のオペランドが正の場合、結果は正しいです。それ以外は未定義です。 ただし、このユーザーズガイドの日付は1972年で、およそCが登場した時期です。これにより、理論的にはCで作成されたものの、Bにバックポートされたものも可能になります。また、%記号の使用を示す前に、他の言語の仕様を見つけることもできませんでした。 私はこの質問が重複していないと信じています:モジュロ演算が基本である理由を尋ねるので、特にシンボルがモジュロを意味するように見えたときについて尋ねています。

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